From 737991c01ce109c8bed53536952a0250f37f15fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Andre=CC=81n?= Date: Thu, 11 Feb 2016 16:39:25 +0100 Subject: [PATCH] Documentation improvements * Re enabling Java tests in akka-docs (they were not run before) * Fixed bug #19764 * #19735 Rewrote every sample using the deprecated PushPullStage and friends using GraphStage * Pruned old unused graph images * Added missing graffle file for new graph images --- .../scala/akka/routing/RouterConfig.scala | 9 +- .../rst/images/graph_stage_diagrams.graffle | Bin 0 -> 17033 bytes akka-docs/rst/images/stage_chain.png | Bin 28293 -> 0 bytes akka-docs/rst/images/stage_conceptual.png | Bin 22739 -> 0 bytes akka-docs/rst/images/stage_doubler.png | Bin 18225 -> 0 bytes akka-docs/rst/images/stage_filter.png | Bin 16165 -> 0 bytes akka-docs/rst/images/stage_map.png | Bin 12562 -> 0 bytes akka-docs/rst/images/stage_msc_absorb_1.png | Bin 37948 -> 0 bytes akka-docs/rst/images/stage_msc_absorb_2.png | Bin 37500 -> 0 bytes akka-docs/rst/images/stage_msc_buffer.png | Bin 58128 -> 0 bytes akka-docs/rst/images/stage_msc_general.png | Bin 44337 -> 0 bytes akka-docs/rst/images/stages.svg | 1124 -------- .../rst/images/stages_sequence_charts.svg | 2310 ----------------- .../rst/java/code/docs/AbstractJavaTest.scala | 13 + .../java/code/docs/actor/ActorDocTest.java | 6 +- .../rst/java/code/docs/actor/FSMDocTest.java | 3 +- .../code/docs/actor/FaultHandlingTest.java | 3 +- .../docs/actor/FaultHandlingTestJava8.java | 3 +- .../java/code/docs/actor/InboxDocTest.java | 3 +- .../docs/actor/InitializationDocSpecJava.java | 3 +- .../docs/actor/InitializationDocTest.java | 3 +- .../java/code/docs/actor/SampleActorTest.java | 3 +- .../code/docs/actor/SchedulerDocTest.java | 3 +- .../code/docs/actor/TypedActorDocTest.java | 3 +- .../code/docs/actor/UntypedActorDocTest.java | 3 +- .../java/code/docs/actor/fsm/BuncherTest.java | 3 +- .../java/code/docs/actor/fsm/FSMDocTest.java | 3 +- .../code/docs/actorlambda/ActorDocTest.java | 3 +- .../docs/actorlambda/FaultHandlingTest.java | 3 +- .../actorlambda/InitializationDocTest.java | 3 +- .../docs/actorlambda/SampleActorTest.java | 3 +- .../docs/actorlambda/fsm/BuncherTest.java | 3 +- .../code/docs/actorlambda/fsm/FSMDocTest.java | 3 +- .../code/docs/camel/ActivationTestBase.java | 3 +- .../code/docs/camel/CamelExtensionTest.java | 3 +- .../code/docs/cluster/ClusterDocTest.java | 3 +- .../docs/ddata/DistributedDataDocTest.java | 334 +-- .../docs/dispatcher/DispatcherDocTest.java | 3 +- .../java/code/docs/event/EventBusDocTest.java | 3 +- .../java/code/docs/event/LoggingDocTest.java | 5 +- .../code/docs/extension/ExtensionDocTest.java | 3 +- .../extension/SettingsExtensionDocTest.java | 3 +- .../java/code/docs/future/FutureDocTest.java | 3 +- .../server/HttpServerExampleDocTest.java | 44 +- .../code/docs/io/JavaUdpMulticastTest.java | 4 + .../rst/java/code/docs/io/japi/IODocTest.java | 3 +- .../ConsistentHashingRouterDocTest.java | 3 +- .../docs/jrouting/CustomRouterDocTest.java | 3 +- .../code/docs/jrouting/RouterDocTest.java | 3 +- .../docs/pattern/SchedulerPatternTest.java | 3 +- .../docs/stream/ActorPublisherDocTest.java | 139 +- .../docs/stream/ActorSubscriberDocTest.java | 9 +- .../code/docs/stream/BidiFlowDocTest.java | 131 +- .../code/docs/stream/CompositionDocTest.java | 12 +- .../java/code/docs/stream/FlowDocTest.java | 28 +- .../code/docs/stream/FlowErrorDocTest.java | 6 +- .../code/docs/stream/FlowGraphDocTest.java | 8 +- .../docs/stream/FlowParallelismDocTest.java | 12 +- .../code/docs/stream/FlowStagesDocTest.java | 257 -- .../code/docs/stream/GraphCyclesDocTest.java | 9 +- .../code/docs/stream/GraphStageDocTest.java | 10 +- .../code/docs/stream/IntegrationDocTest.java | 7 +- .../stream/RateTransformationDocTest.java | 10 +- .../docs/stream/ReactiveStreamsDocTest.java | 19 +- .../docs/stream/StreamBuffersRateDocTest.java | 10 +- .../stream/StreamPartialFlowGraphDocTest.java | 9 +- .../docs/stream/StreamTestKitDocTest.java | 8 +- .../TwitterStreamQuickstartDocTest.java | 9 +- .../docs/stream/io/StreamFileDocTest.java | 8 +- .../code/docs/stream/io/StreamTcpDocTest.java | 74 +- .../javadsl/cookbook/RecipeByteStrings.java | 138 +- .../stream/javadsl/cookbook/RecipeDigest.java | 105 +- .../cookbook/RecipeDroppyBroadcast.java | 7 +- .../javadsl/cookbook/RecipeFlattenList.java | 5 +- .../cookbook/RecipeGlobalRateLimit.java | 5 +- .../stream/javadsl/cookbook/RecipeHold.java | 117 +- .../javadsl/cookbook/RecipeKeepAlive.java | 5 +- .../cookbook/RecipeLoggingElements.java | 5 +- .../javadsl/cookbook/RecipeManualTrigger.java | 7 +- .../javadsl/cookbook/RecipeMissedTicks.java | 7 +- .../cookbook/RecipeMultiGroupByTest.java | 5 +- .../javadsl/cookbook/RecipeParseLines.java | 7 +- .../cookbook/RecipeReduceByKeyTest.java | 7 +- .../stream/javadsl/cookbook/RecipeSeq.java | 6 +- .../javadsl/cookbook/RecipeSimpleDrop.java | 5 +- .../stream/javadsl/cookbook/RecipeTest.java | 4 +- .../javadsl/cookbook/RecipeWorkerPool.java | 5 +- .../server-side/low-level-server-side-api.rst | 2 +- akka-docs/rst/java/stream/stream-cookbook.rst | 35 +- .../java/stream/stream-flows-and-basics.rst | 5 +- akka-docs/rst/java/stream/stream-io.rst | 11 +- .../http/scaladsl/HttpServerExampleSpec.scala | 29 +- .../code/docs/stream/BidiFlowDocSpec.scala | 94 +- .../code/docs/stream/FlowStagesSpec.scala | 192 -- .../code/docs/stream/GraphStageDocSpec.scala | 27 +- .../stream/cookbook/RecipeByteStrings.scala | 84 +- .../docs/stream/cookbook/RecipeDigest.scala | 43 +- .../docs/stream/cookbook/RecipeHold.scala | 79 +- .../docs/stream/io/StreamTcpDocSpec.scala | 72 +- .../scala/http/low-level-server-side-api.rst | 2 +- .../rst/scala/stream/stream-cookbook.rst | 35 +- .../scala/stream/stream-flows-and-basics.rst | 5 +- akka-docs/rst/scala/stream/stream-io.rst | 13 +- 103 files changed, 1136 insertions(+), 4749 deletions(-) create mode 100644 akka-docs/rst/images/graph_stage_diagrams.graffle delete mode 100644 akka-docs/rst/images/stage_chain.png delete mode 100644 akka-docs/rst/images/stage_conceptual.png delete mode 100644 akka-docs/rst/images/stage_doubler.png delete mode 100644 akka-docs/rst/images/stage_filter.png delete mode 100644 akka-docs/rst/images/stage_map.png delete mode 100644 akka-docs/rst/images/stage_msc_absorb_1.png delete mode 100644 akka-docs/rst/images/stage_msc_absorb_2.png delete mode 100644 akka-docs/rst/images/stage_msc_buffer.png delete mode 100644 akka-docs/rst/images/stage_msc_general.png delete mode 100644 akka-docs/rst/images/stages.svg delete mode 100644 akka-docs/rst/images/stages_sequence_charts.svg create mode 100644 akka-docs/rst/java/code/docs/AbstractJavaTest.scala delete mode 100644 akka-docs/rst/java/code/docs/stream/FlowStagesDocTest.java delete mode 100644 akka-docs/rst/scala/code/docs/stream/FlowStagesSpec.scala diff --git a/akka-actor/src/main/scala/akka/routing/RouterConfig.scala b/akka-actor/src/main/scala/akka/routing/RouterConfig.scala index bf187c237c..a32142642c 100644 --- a/akka-actor/src/main/scala/akka/routing/RouterConfig.scala +++ b/akka-actor/src/main/scala/akka/routing/RouterConfig.scala @@ -3,6 +3,8 @@ */ package akka.routing +import akka.util.Collections.EmptyImmutableSeq + import scala.collection.immutable import akka.ConfigurationException import akka.actor.Actor @@ -40,6 +42,7 @@ trait RouterConfig extends Serializable { /** * Create the actual router, responsible for routing messages to routees. + * * @param system the ActorSystem this router belongs to */ def createRouter(system: ActorSystem): Router @@ -132,7 +135,11 @@ abstract class GroupBase extends Group { def getPaths: java.lang.Iterable[String] = null @deprecated("Use paths with ActorSystem parameter instead", "2.4") - override final def paths: immutable.Iterable[String] = immutableSeq(getPaths) + override final def paths: immutable.Iterable[String] = { + val tmp = getPaths + if (tmp != null) immutableSeq(tmp) + else null + } def getPaths(system: ActorSystem): java.lang.Iterable[String] diff --git a/akka-docs/rst/images/graph_stage_diagrams.graffle b/akka-docs/rst/images/graph_stage_diagrams.graffle new file mode 100644 index 0000000000000000000000000000000000000000..957e6e84780c64b48a4e1ea0cbec99d4317cd549 GIT binary patch literal 17033 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 diff --git a/akka-docs/rst/images/stage_conceptual.png b/akka-docs/rst/images/stage_conceptual.png deleted file mode 100644 index 1cec7e33f9e8409d0201eceaad1a766bccf1fdd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22739 zcmeAS@N?(olHy`uVBq!ia0y~yV2Wg5V7SP^#=yYvzh(Jt1_lO}VkgfK4h{~E8jh3> z1_lPs0*}aI1_p^L5N5p0(J9Bkz#v)T8c`CQpH@mmtT}V z`<;yx1A_vCr;B4q#hf>H%PXR<{ygyUz4qx&;~Uba+NL-yOr2`$)wn6#Q*vp~q4z8q znk+)MJsBP|^~tKUNNJqS&1?+PVBwm=XSVQ7=(o5;VGaQyBiYw~{}#UMT_@@pCnfj( zdF7Xg=dWJONsitWKUZ@VS3?I6iyt!|>poT+?mPT74vHTvk7hV=BnY^!|^9B^m+NBb5k3n8~j7R9{F%fBq8{~%2&T1 zZtZQ5O0ZVo^kIL;{O-bw-Whtu4XgCtWk~lJ9{XamXjR7vh8l;h-W7js6LJ>_{qIlL z53SwmlWVefMn?=&&zX+}+8^py{d&%Htz7v-@PmNRzwYyD)^6e5^ynU2-GWu|WgE_! zHu^V6uG*DY@m4ZHI)OX1*41SjvmDc^hSmc*f7&G*ZZ{||a`1N9$FOYmD}Sq?diL8t zY!ez**@dn!>NU(%n#9n@-p6Xj5_j}}{9fPC^dq1C%1ZFatXQ>HR;N1jfz<=mP}$H2 z%VsNe{X6-GM?RsJYt8ai(hS-R<&4aY%%?9|U7r4jPeSBg8Phs;t%mzuCyI`)3UOI7 zS7&y6ZWONt-w%cx5<3pu1~toxXA#I}_SY$#IH7Mu9G@p;3= zR-Nk-myg|VuxI}L;Qs6143ithT~fA3?AzNYKl!(FoLT6@;xY}NVBeK4`=96@TJOL5 z6+6SKT@3amJGxf+_1Js5@QF;6c738L__Mp?&5VyfEChef?x-;@d%NVrE&jt_#1emT z2>zVdVWXrZ-QKUOu5?!E(}WHm@rlJQONe-O5p@KK1&=mayiwz7nwEhTewJ8u)IPh@eo8v7nRhQ;1*W9adqRRMB zRYOONuF~$#6Aq!VQ&QKRxOu?-qq9-=1N*=BDoXB0H@)SQVO=A+dz)`X?qh?!RWt61 z{^v|cU*P1@#^lei_{01!+ZogzRWmIz`@_o7;QPUO_Hjo4juYQv|5(nrbX(;9WY!Oo z`^;Zz)FjB4r&QQht^FtZ!}5bz-HBYDf@+K92Jd_xh#%Pfu$@yxC znlE;Gb6`d8ZN4euo%fQbcc0J@lw|X^KjSiu|21=j;hz0cKNz@ou-^at%|1b{z{DWd z_t|SzRhiEFi9f#QeL48?$_M7Fx0H%{I_}8U1^lvmD==~6!(!`C+s{sMmT+F% z@?U+y#@kMR3Lg50nx5LOXcsh}{f%&(wA{1*JP~$#%KR&G-`^-+-g4cK^Rhk9<>E&7 zj}!koJXrMMSM!0WAC-yy%(@4(eyj^S`klii^}TdlwZg8n?ehu`vmd|s{_~m-WtMdr zQH{$#&i`_a^Rj%JO?_U4ZRdaIWe0RO9_QzZZ@!rQ{+Pk}>>u`d4Cd|ES0$g%=3O5v zu`RRYM^(H~oW0^1b48#2KHKl&54UO``Z6o=*WHMD>4&msx4(353^`W)CisuRtMa7t zx79vZ^Q`yhy&pbxV|G3NXSqeW_k;V7e)^-br_6uGJ+qwS!7ar`AB8`PR;;_TUVQh> zwdVI4{wBSDef!XVPv_z%bA_L+=DA$YcX>bGe!Y&`yB23Yul;b#d1KKz{`G%1-nqa3 zZqfZo46A-k?Rdjw@#n~1-w%xE_Z`@$v}x(8dF(O`^3wbKL*H}GxAt|pca%NBnz{Uv zrE|k!)0l%2($hFYzE1vdOY?_Af!)igS;j6;UVNxis&Ra$sN@_{8mE3cp)3FU2eI!a z1#4Di{SIEvAb&@@z-5Qk2e%rBk8acUl&^Xf{_rpR$AibZB0r__DQ{yqyQ<39UFu5U zs;cTAnV(Jme7IZmW8Qn;s?IFq{Q+r=aERZdc*j@@Q+Ee^Wo^#9X4z++%Zd6 ztt>lb!T#U;Q~iOx2l{?Ic-wWRN9mLI0=XTs5`hce9~5yk+9k|pDgLNE)a-zN*?Pun ztbU>sxj!5fKQLMHsZB5cCbL%_v668Ywne+-2-L;y;_?cO?|Rqmai#6y7TKs-!uPJR z$DO>)7c5uK6!>71#Qox5MeP4RxHxyMc*P_5)AnEgsecc71$T;C#D?1U+P>d-<8Mu| z{5cg{6ASMDReyB+|C!~!;t8!~sc>s5sqqK)Pv^Y+;QoF4uF#DvGbE?wJ5Dp4yI@tfOG z{`bxw3x9C^DVY)5c=v;>#Lqj+SMeXbB-&y9DE#MkMWy2p+}jxRuJWx5FnKzWMPMRV zf^cZ9>>qpM2V8*@2zj8{x@t-BPx<5L<(SCeCzJEoQ$@Wj5KfKNe?N$3JoxIC4bpNsSYIAgyvLCuP zWqnxP-Y+mj8*RZ2OXvdFuAtUUpVJWdF~&@%kYSOTAfV zt~b4}tWfcJucs8sptMP;uBnQ9pF8)1*B@S&AGXncsD8NICFIz@joJT?oR5#>w!hAr z@KPmKP*SOGYjQCAYXjT!=07Tfvb*jJv)x*EqO5Y)=7VTmq1&@>JQu5VUe(4*)Wzy6`-^@^(mAl|fd7JCYZ-g{H?KGB`TwYT z>7(S0|GD=cyKm2YNVIJ~Z}rU{!?_CgHhieQSQ zu{-JB0srSW4gUxGSgMAU^1U>?pM5mH^Fy`ZPWk=arUzPIP2XwXB3~URTcI4I^k3~C ztBGsq;(2RsA6|b|$w<_mbLV2~YX1ZNXJmDizPBddvSu=0{p$FE_a6_dF7J-N_dokj z%Y*rk;%ke#2Q-sl$8TKX^VjS32){fk55Xx9vaH>Zx^} zc=;ni^OizI!H=(5fA(zU{J|S~|7iWAzX2|K-2WM4#J4?tQ4o4b^2fqE^O^J8_U0U$ z!N+w!eEp;L560gYNwe{AycbWBI<5Z0*XQ|z<=-3TGvrsT%3!mp`|;HE*1EbXc6-UV zq@UA{ug}Wj{9MC)h4Ey>yr&-+ZzH7)Y`tdlU{BF{r46??nO|DXt^eBLp6$nj&5xSD-~D*FL2B>555+6)b?i0UcjW)X z&ahLitGW3*r&dQ*tW_-2jf&k7$bQR|Q$9lX*!qw=&F9wZ#W33UCzY*vyY|5T#w0A&VJ{x^(YfyGkEv5X+AM!my^-k;d;iNH3rgx{yjM@$m;W$4$j!dF)uH%L zZJzn=n`1dA_;BkngSok-iL7=Tf)joh z{pWcz?XTG1A}Tx#Dtg*_~Ice9+jYr5iR{#rOK;nDIAo@4(5&-|SCBEgcgraw&dU+L{h z%J&ui{C?g1BRksV+Ohc)XPi1Q{{VZzd&c|y|9xDZ82n+MdVl3B{p9QIEv0+zU;Vzq z@R;yK=8vnVK0aJ-{88RSzxUp8B_sCxf`$&E(JoKU|2X-nef6u{#Cd{00%xm*t`*(? z@Duxi!>e{huQ~U)VgG~Y)8u+y7Ea^b)ML1Ja>t&Q`TI-73(WVWSK0pII+oigzw%Z6 z>FZ9(zxI7N{QuSgozTCF?z}a8n(8>su-0YA-jgbSRxMlg;S%1T`q}D3^Id07EzWz%$?Ygm!@fVW#4O+P`MkcT zXTRUtf86rB>x}%;q}jL9PSm`8-*A7S&Fue{&+l=3R{c;d_pGS9c%AB*-G=|JwCCI_ zK4&}av0<{88m9ou!FNBddfc>mKPUPZyFN#g{R4BoGig(b-+eN;?{H~%YWn83;&-nN z-fJFsYWeBzlR42<&w>S5{3rbGKYH-o&gw%o(Hq}Lc2E31r}%!~)SEnWCMv&oJ-4$v zsWN@?ypTCBZ=c)w{ZP%}kKWmvciy%v_gHgg_sQBdr_L{SP~>R(`tkRo6yw{L+tb#Z zDUSU1;qeKP=XYL2+>`u~Yi+dkr={qDb4$#3oc*FuP_JXl_M@bZ-E%l)rYgVB{K4yT@PG5^P_-Yt zL5t@;)qGiA?wD;ov>nGft$TxK)AXO5Yve7|>#?fxq>Hg!~O5;|}|rqXDA__LGJ z?Yf<7y`Pgr}#Z|IgF<^yKuPd2CNkO8=kt>93D5 z^Zpw9%cpeCpPgoY|NZ*IO$rfm`?-G}Yt=X}kz6%Pfx}O^yr6D#abAed``Rb}sw*n4 ztd?Ur*tdmu+T(j==X7nK*m5*=>Qr9|dt!cWr~T1S=T1!IPtbmTXO6-B^B>X|rWJ25 zK6mug9?}1dCbNa-6!W+JG&`PuW!Bl}=XNgLJK0fSPQQJL^=$9C#nX>{+ShPj$98t? z++z8*pL}Yy2g;TmpIhu*eWzJrN826wN9Q`KzBViT5X-gyqnmoTb(sj;`EPj9{9tqCvj3lLQq$fk{7>ksVdzg^vV231e?W@gn}4q> zU)7r`*BZZkxZLOC!-JNUr(z~dth4dIcjmph!e6yJeP3!O@E6vqjzQ6E($`XI| z@5?7iZu~7j`S<1EXPzwk)oaBPmz_7h#6F>Vo$sIWPagAr8P}_uE;+Ap=8NN-e|KzB zoo;{k+xOl1+3PaCLxKR*7Xr>Fe0RI<-P7RL|DHT*mW)IT1TcU|{g;7`rI z9J!Knv682)Iq%P&dUofzo!bx9%%1$4;YI(P;^#+B+4SCVj=pa3{GagY*{_{h4(QJ* z{(QKm`mz0ql+RO&^Mcl#;r{s9a+&A~b=j6?mM=ih4j+nXiN9FdLF=D#wIGPenFF8+$e)v3@Ni0P& zx#y*GlR^b=huE7t@8+D|$+X$wYp(OI=kGsfOx^Hu{vp?V?{K5rb99n>441wB*E@eV zbDit^&ZpU3n%fJ^8JD26xd_KG`D<|iU!o(b3e%2)sN|R<7*8h9-`}M0=&&rp-S=PyW+|%n> zczFNM>T@=};(3Ze8>>pc-e8|KOZuFT!ueh~TebU2U5heua$+$ZrfwI16PE-c(%$YGIUnx(m+=|?}g<&GBH0-{rLDe{B_*Jpw)*m zcgoGPsr;lMBx=4~OX%XM4c@^o9^PGL+`a5s+v(YAW;T=b{d05QhIjO3WaU}d#oGnT z^$H*N&zxmY7xde*+kb0OZs^RIi?fQ|YiFs&?%CZHx8q@(blSQlZ?+tJ)^>aLEa`JB zD^{=m?dIB_nI$*>b8V_mzBtRln~nl|#O~^xFtR`x|#+S5O{TFwxp zWUVH=>&&^=U%!4m`C-PKJ;wC{_Ql4>$A`wp&tI{A{rXvExlyh* z{v97) znidotYU$p0S*^bIZ$MB{?}{tD@^*X9UK4wKygz>F=C9mu6eiv4aux10T;O~6pFoPw z`K?xU507qd%vaB>wu^aIr+Z8!w6?Z(QC7hxrwJ2-4lY>6$(zqnk=3C{LAAIVzyQ)#xf>a zINHPY)z^F8Z2uVg;C*L_;#X-|XYq6SHDsSf z*Z5C3qUC#*H(%fLmE2>uzTX)S7Cb3DaOl-5!|g7W(zB)gM0Ti5Oj)|@*~j^sE90;C z$(1k8fBa**gZ*kr+p_f=&epS*t&y}Xd(3&3_dRp=ilVyU;=`V%i;w4pRQtU(_C5P} zzK2TieztSkm)1YFyi{%Z%&P6oj7c6A&+U3axk5G6bjK%?2^&|$wZBN@@D6z*@9XQU z%_C`aL|%D`mDI%Pj>kCOO!Uc`eR#5K#PXdxAO7~8tar~gaA7#ZqKlC^UZRU$&SOn& z$l7to>Y^1_%5;`Z`wvO3vU+fOXZ*2mE*I~*RJeweD;$lPFquJRWjj;OhJ(w_AKx#^ z``kk9&-KutMd{tAH2&P#_IcA+7ZcOiJ(~}N9^lqY37_&@c-D@bj~9-1yL|Cs2+ays zs=jvZ+CJqE>8|bOetR;#^AeE?ssOBW6x4%7EKmBux8e)Lgg&C z-rcbaB_n)OPC9P%DPHZ~yLO$VZ5q>ugZqdJ2h-O{ zMhcgdy7o_InXi)i;Nry(@fi=hPOq!Z7SFNA$n;|1uGLtyl1@ z{?<9AG-c-2#pmY6g@;dHB^z6ixyG8` zPw(h&KXrYczgVpiN2051nMcMe29?6nvoAKP&o4YC`EfGSyEU?=@2>S;yZ@yBK+=`{ z+eFPK-dOi8s*!m@$fqfWi;w@Ye#pOm-HL#-r8hnYbwAr`$ER>&cd}b=WL3oGj7Ora zx}SJ2epfrU^X{DD*{$0RpXT+yjGW{sFh|0B|BE@*%VK&BZ4Z52(*NV6&7mb6C9!`B zeYhqB)VjI`c;@UdX+LqP*_<_PwLQ0CY}2WH&n@?~lvcWU*-P2}x^rhXqgsTXRgU`w zw$@$|KgFY(YjytZ*;)BV->qNnvwuzVzwIS20!jrr1sMXvSWepHWl64GYx88k`pmV9 zLYA1^p0i1pC2rlywST!3V$PP@Is_LVE^qw#`T2G|+j&oCGkWin+OpwOaBJzrBf1}( zOb)VZgbJ(s$rxo_SyB0R>v<8kr(9FBFC23CcwCS%z`E*=?$3G3TH&i-EYz6)l>ge( z)}{U3dpfjUOcFg|VU!i8wKGO!l)1UtMSI|nA z*X)ZpC5>99HlDwAI^QRM8q1^8nX?(VH~lhve#ibp`f<@qOn=mBCoc6q&T1EO|F=@Z zG8Z#(2a~Vs{%_{zy!u1^Lu$v1Xw${#=Fa=;C^A*+!{kY;*~0%de0X#C;^O0W>^ax3 zT=`-X(PIri+iq8CHIJV!w5Z&JD|{4>$t-{8cQ4>aVGB zp8a^M?PiA7w_Dfv8*OLLnssgU%9WM%4-f6U|1p>Id}>I@VdvVzod0(V)LBH={d`*b zaT4o_tlM(hzH8XGoSVJ<%*|P>f-DE0E;%1xd&ts!pTt**%YwCwc3=CFb8hGQlUunr zy$D_5lQ+lUUy$dLcm4{`HGaKpa`b*Du_+_r+VYZ1#vH#v;nU&Rto=Pa#cTzCM4QTg zm01z?6Cc!s)-t55Q>tXPV)$rVyY=hWugX?=3{e5vt3(Pc>eAksRt@M=2_NV`f+yg z-@cHP87tD{?DD$StXr3NvgO&w%OZbIws7($2W^OOnI(K{modYk<4y0b-Ld(%;OA%Y z`_=^ksk$E8Q5(58J*k{>dYRA6qW6DXi@&kzEeXxa$~tyWRBXRv@aG@5SoSO_;Q8Ql zSF*HN&3|2e;m1j*#6tf@CVxJ<*+ocQNUp>-@sR8NFwYoXoAoPQ7OMpHGcNDeDcXlslcq&smvv-v1x^I#dY>5@gpN}4%c;ww8Bl|Z~(w>}{ z$USS8bXv2FMWWN;!&k2+zh^a3)Antjv0ZFL}FVplmOI|{?6Pdth@Wy= z#4hxrbZF>=EBhHUfq3##@vMkDQoT8n5TMOpkGzN7u%e z??cNOc5c+x6`HtEsc2irm)-nvN}HBAnj6`dLi@Up^zOyH{4oxH!FDj zT7H6WfqCgi_q)QftaAkJacyE>@N(~*;`bKMm${o;E9{ytIMMo}dP{%E)zmU${-y^} z50)o>vV9)oX(#A6(gmnrR?WWq z&-j+mMA63e4c8kshkRXEHt$k;$BE7#nZo}W&IMlGzAGy1N7SszH@%GuA01Kb7T1@% zHS>CTaPi^l1Gh~VAAe_BnDqD6>-GD8iqHJKUCn34hC5BH++t5&iDqSFL@YKgWpfPp z`Skkcdm@QBplZ|o`f}gdVIPmR=dZEMd$OaybJwa%PcC`C4nOgA*X}Queu;|fNCX(B zotdFOYxeQ?6PsoSdH;Af!!X(Iea3F9#XRgT^nN}v2| z4t#X0_J85b$M{WrqIY9=$kxkySMH4SerU5(@BCD0(^Yz}Sw4c2+Ru5{Z}RJ&+d1u6 zr}$i^PVLvPU+4GPRkR$8U3XM&*85WNdY_9QIiEb4rNkO>Y)Z5M%WJ0BE}7DLZ|;9% zjT4&qQORgY$5)lkw+-BDVvg+cS_H~!w`Se&Um0=X=5xI{_lt@YpD#8sHPzMk@Gbp% z<2P5RT7kfaO&vZW6aQ`Lt`U;p-J_|b-tF=8pIg^IuPNN#vAJ(o6upmuUXj9 z^)ot|`uuqNzXe_VzK{3AgpNBLA*)~gPR*J8a)#lO@ZUGzpPn-H>`5a*#u@hYbta9% zp;PbN^tBh-%eRl;Mnmax!^Ks<;v{c}WVti8cb#Ba;2HXS`ff)x>*sgYs;>K_l#o&J z|ESRQ+$sz1O$`P2jpa{yEx8+>L9bt7dJwy=sbW-?^Qqy+fzJ ztexa2U?b-p|9Z~v*qc$oOiG(1{|Wz0d-&G+fWe{I?%%s#uiM=xo&P0Tx3&GkJq0D@ zhWOQ4j&@6z2CdY3^Zf2@UY2vLenJ!DSG{`s)^;Jk=Y+y7lV4hHyOp*2X_G>S+S~0G z&wrh6XSmF)+9;d!@?~n4`^AnE+Z*JM=4DUc?rM9xiIqEIL&8kf;@Qmim%fgD7|&oG zTl@9u@$+*mKW~ZLoL0KLbJ_C@)^`l`Zi@|V53XE3?-##b(xgB$Y1woCj!H1qhT*&n{T zt!8evnqkfw!*^w6)^z@EKK{tMnj;;8+6lMYzJxG0OtzZf|IxXd|ADz~?ZUZ#YI`4@ zzgHs_5%Fx>3>}vz?n~F`-|8uOb!DZ^w;RbZwO_9;U9(R;Snwx9h3Nj1A6FmPe870s ztmgq=?wz$P=PdA?^3K?CTE`mRKQi@h_tIo*Zn-b1|GB<(`*~0IC&eLK5ASaH&i1hH zz5ThbKQ<&DF1Z>SKJ{QT`~H1Tr$w_(k10B-y7N<6*pBXs{Wm@Lm~)oboEJ}VJ$SYH zhp*RkOWg(XJNV@z_JzD_n{nrm?0w&#oOO?1f6e%9|2$i8W?#Mi-Q}y+Pg$6&dU@r~8LZpGE?H9Eo7yjr+n~%p8HiaL2Unece858xu%BN7{gZP55PcI!EiXT}0(O@Did|>9PUnw(h2WN4`@b-j;zAiLfCcA1EOZ|aA;Xim2=6Bi4u_exCs%HGn zV1ML$Q|d3VfB%0+2v)Mx7ySOZcTIDOdxFap52p6xa&IQKA8h*_F_)!Bxw_yg(;w;o z?H}V;W&OThaz_0}q5$_ApF8RfrvLh*<0IZ&l)e^GwxwkRYukq`jm#(06|FHbakIg##`Yg*Hl_$K*cb2?+ zu}Oa2@7`5)!S9aEkV{rHnD}q&!Hg%)e>PhFP35ec|8&ml7l+h?)e>*2!3uY+mfr&#}qniTaPFvrebll-L>s zh1zS^t_F=$m-!xe&&yiCTh}*Vb3??2ukL?J7BMIBuV=lZqGZmjzB=n>Tfy97{zvZj z8jRQ@A0FANR#PJNU9_NS)xE%9VPEq>^EvlVvpfI|hdj;cH#{aG9C%goK%e8mf| zKOYvzCSKgmbLf4&P$l06h0_wrKGRz#-}M)tDBZaKVYpn={LNp*1#hy}uc$tm)TO{7 z)i_II?g9PF{dunT29Yk;j`fEhV_s8vpm0^yF4hRp%<@Z(&{}~TQa|#KIWK4W-gSa& zY5vsdCFj=OtlM@-U}EpbcGKhi$9{5I1cb_;{s*2IIGm?y>;Js|X-R;W2b*?n z;_83BQf%V!59yNbzq4xPD?D7j1z!E`eRJ6)mPn;ddUbq$HV3NsZ$yXQ*K!3dZk^#& zd~R;YJF^+vLcWFxR?6=XjxgP0!&70wv&C!M%1Wa-OGIbBo3nfK1ksk{h5s3^^~Kil z-f$1K*GY+8rl9snUEt8Bba%<*9z)xCtL&7Oc0YE%aE()cefRr|x57i`Yr9%cI+Av< zol7jG^8~}6A3wx4p3Z05y*lgWc@LA*MdxgL@4GFY@QmrB-k)~vn0{1qVwY>XoTN1x`9P1y0Y5!zy+-F+z@2I7D z|DpNq89jzKb6kE!%)Q@>>qi{XwM!ty9>7> zL-%VGOcj5~zk#hwBBk@h(F27Wy}28jL%+UFx|+F5pQCB3r@vTE;klddPfH{h-JbSk zqm?WFE1&1B+Wg;H

ZB-WfcQSNfzJ8XK`<*PP<}4EJ4Lx-8`C6Q0=IxN)Pm<^ze) z+C>syXEyC(sW9DhH~iT)(29e*V)JTu*nh};^Xc4yuS!8vA~?D(OjcFOW~@K8qh{Hv zdvPyz`MeikIXLTp`bKZ%xy93;oyzYqJSGxlQBomL=ln(S;nTy7o(E1iT@hqCxNS+h zDz|h>X9vUeNpVJ;1#?%$#hs|?0j+1S(vB(p5&S^j!L{P2j$ma#Xuh_C=;2OX4Id`o zjqJZjQ z%_M$YZ!5#`RaqC$JDVJnNOp36$iI~R$EG>FhPKmJu_&mmt=I!yujqNJtx-A|$LN*)7)J@FUf1cFQUAM&reZ{qV`!2XK) zz5r2?EWc~(8{Qwe^qui6tJdu)*K8iV{_t;3k=YT6pP+CQE9=c*+C?_%C%8Ka?en_+)PY!$n-nu+9`Vy-iJ=8FxFeX--8eDC95sRu_s znI0`^UA3xXPS5>~_P6X`*9h+P3$;J{`AVwA^M6hA7xR@UpWym_WR}zI*vIF?uDZtR zUY-&!z;c}7KKJB!%jdH`JvBcjkz8dR`ZvHu%H#c{4Kj7ztA&f~SJ&QsdD4o-UfaHC z`rB9c)MdKjnRq|Q<$e!*JxPIs?c%rAUmeBoj=r0g4N6}ZRQ|lUb1d=KbEQw!p|xvP zvzDo!=z72YYM1}8co;|lUUR7dlZiM%)^3}nU&h5Nz^_fNRr`(46H<#|N z`jr!|1@bZ1Ny~DF&eeZ(%KpEev(sn&!d2_LPn=!yT>ZU@((cu->aC;0!k?w2eoHbf zTgU^Ndc9tJE;sa@*^EUQO0p@9@6W!fnIOvIShIMW`JCeQPfqD5X*0VY)3aT0}-TM}Z#pYh0867oWTNU-NRP?~-PnhO7ta zb2S%iKHPfz*t_%0d9R;*_O*X9XSVOe{%r=wW?XofE-8NZ zE9qLgmwV`Y@rlbD-X8XL?>ezQ#Pq(#`K<>Y2QE4cYPvJO5!+p|d)2wuKFz&`$7a|a zyZ9|amV48$Y4<1DsiiX*$Z!;;@-2_iom+Nw=DanFGk33_ws*p>1qvK>{=2TfWPX0< z+s{wZ$vuX(H*ycuBoxfBn`Yw}w(J~B&vja`^2tQzZ|#yaTHj?wnk{F^_IuGJ92vNe>E}k z4V_-H@$9nyk`6iSF_$I>fm}LI&#p*)%iEGuC43*UO1v5PkLA68QgJCx^5yK^*Zh(} zjf}Xbeh*GZ>^iK?Gx^+3Tk8q>^U?)BWVmaCQjXUO#t6$j`L~bG$P2zICODI=heJPC zRY`iqtDbN3ZeO&FtUmJ2e&H(CnX5rYiA*YfcS|VTk~Kna&wroJ*JevUmtS%e`*Cjh z>f6;pyB()>EGU*_&n)AfAY)co1S!vZ|S(< zw`|$_!gIAeH8Bs8_OpEJUmCAl@bj1ivx5N3`ib{G{w;exXRcWy*Hgwzj@N!!K1)5z zn&#HocjjbQ{@sMn8-12rJ{Nl&o-UE>Ghc}1;Oiyd#rE8@EU&V>o!pgWWuQ0h-sB#| z!v#MoUJ4Z5Q}A}tYUoXx9``DZ*_U6ODKF$w-mx84oJslPk-s^#^~Pq{r=(oY`auBnz#}!-&i{H+|C;I94Szh z-?i$T_{8*vxre-?w|}4Wt!Yi7F zicuM$`s^}yYMB}D;@k;W-7Z;{m(Dx%=yS%stTWvf5?s)xs4@d;WV`N+2iX{aOyFE+~n&-I!e3u!t?vQ9!0EK9$XGMYU3V-DUM7)^poZ zY|L!uosdlF>`1Y>S+xn27q%^%WEb{a>e6LhpZlWy?T_XLT0DQJQq~i*Z{C`P4No+# zdD z-rKF7%jvk>1TBT^eER0(sVVv=CiRr8I(^pg?_GfhXCkWD5*(+2R;6gjrG$2XHmR@( zusF*8dtq^aJ+eD#=40vYso!E!zvY0MgU7y@&-{2X;L^q`3JI+*8kZEW({fjwxtde= zgwZjH%a`wR?-9GV-Sfq=HAQ^ltFpXYo-sEc_J*vaxj3hIzgFSYekSeq@A0RnU;H9D z^JBm{-F3Hat7q$hl^8}^KJU{gm-ab%^zp)L8Fpc2ClxpzS?{r*w(-?#=}W)sBPLw6 zkMXSP=fB->O(MA`Q(KPz>0kSqEXR&t^4${qRdoKHRL3xT0k)g1aX-KF{@W^Axe69* ze|o=6ROh#Po^|Sm%w_YVj~DJaeq^h8%#YMJ|F-YCBXfCuYkS}IZL=>*B=36vdrAM* zpIdHBWpymDeQ6o_-Qu~L=x)E@vY%C()EL9vJHIupF>l;^=(lvIhf`?o{xxSSB68`3ypZ!u2+~|L3 zHt%atkmjzH-u=IDU(egGDSIbQyeCqzU0c`aZ@2)<>dW7@njEt%Pu+P7RJ@h6c7$9s zJCP-<&g!_q(m=mk<+=l>Hhzh>{&l3!uckl7-|9q^ zpasK@t&>whmee*C=QS5?KPYndeA4&e1NW_d9Z3;jsXlh;z4h~ZCnx_`dmwa4di`H1 z?oGdDRX5yx_*ehbO#x7N%yCJveDL7LQua{O_m!=Mp101e&SJ_cP7S;2@A@SEfa1fY zwyr7cp|y*IbIojL6u;AYu!>21_lz5SI}Wt7>fM(}X5eT_;CXr0F`noDGRe!K?i1`7 zWULHBIOfXhvB-DG3VHW0JaJrX#=Wza-&Ie)o08pQc(i~ixBseU)&x*XRLUZ{xg?tSZtmNoW6PHs`n!Wm!_FUc5plEsO25p;h z2>vwOQ2OSQ@2XkfbG)A4F+N}%xJ%nM@&SKGUy}}F)`$6WKKkM;2UQ*%F!(vK_?


Xryr`}i`rOaA2RDSE7ttA6DRRx;ku+EdcgG3WlpT4kU9ZG11+eOm=C-MzNl{rLC$ zwWWDIhRc=GkM^qAa|8le4_lbQ#s(u`Euup^32@_-YbUI zZqZIvom+hW{VCzlt)VV;ym!QR|A`j785KIcWT_7*wr1Ptg?krd}UwlCh$e!ax=dMoK&AZINB}KqMv&^$G zzI6E+(5RkqMPB*2yAzDd#a8{A*I~ja-ZDMx$oCZ4%X8aiZn6~LVX`N`yShK1%E>3zWxg|F1exPu}{3T`MY1b!$p|zU@N@v_VZMl7d-<+tt9>cpEY+hOhIfDl?{25obo}4|mcyU+k za!nmUL4^fxC0oT;ygGAk+S57K{1*CN;wmSY0q{>uU)^b!)Dp4?IN4>F0WqGcmJ=M(WEa=sz7?4xTI**$yKGk`Bb^;S4#M4 zo~8u;gykBsFXrileAN~Fsap45;6w42b;1+(#H!m5LNTSk%qbK45mhR%z4zRdt~& zcKIBvVc8?MJHN+Jjs5wZ)1a{p3Bj8ZKhzB@%6_Wt+V(P|U8RwAV@dEr?cl5ZhaFxg z{!uGrux7aInsR?#&bQRA}BI1>KUn7`(yZo<#DaCIyRzFaKxp&n@PkzS(wJ zy1>M%jsGu{SubpFc+73fue~ngaBJbJUyC|qn)($Mua(`#Bqua+Z|K**L0b+_X)n%G ztNYk&cueHB>VfTte{X+m|3KVVfW@ALt?gw0oML^k&32b7l{WDe=;wwD?PHT!wyM=` z@%O@ntSK6v6Id6l;_o`q|6$^jQ_e}pDj66gEI{W1Jbdcw$sSeqrw`P4e8zUkdS5*A zoQQqPX80&=60FN^<4u~L&cwbV>)`VXme2E;^SUpoa&KY?`RXZnQ+9`Rg!P_1avwT6 zWLB^GK5dh2TBM`EoHqG$tTR%d7l0OC_qwDM*YID9+IV_C^Y4|fb}!9v_H5Q+2(68D zDPw-eXvU?#p6!mR(sO3sqcZZQZ*MhkJN^o^n7Sz;!_Bh%*31sj$b+hl-gCW#sW+bT zH`IFVj88uaHo@Jc?CAH5TJt?~81$IRgeK0ved@4Xsz!jg_xWS}(V)&DtE!Sc>pCS{ zc9{pfH4ULxEFU-uTwz%5`qITv`?UIpM4H9H>SI!%)Ye!6ewlxo!Ft`nqpKZ zzow$$tIUSzPO+P7S=PwkopfNqjb_!@sP(Ig8Mjb5^b5pR%?QG)Tny{LV+!b)Qr(InK>>4`EZ<#QwoN;cQQP9siurbA7Wm zojG~REmU4;;@Xe)D{Pbbd70mdPt0y84*A+$wB@`+a?i;pb8hdxllx-5OA6~BjT;;e zN&IKo-B!FRP0ft(G2&Q2h3R^FX6gk)c6osCbI@ z;gZ{?OVpR1*GzW?^<{DnZJwyV`0Y2I2kJZiyM$IB2`CiWVKgm|>6BOs-=eEzTbzQMK$&xAqaEDH}joh>9NxKTIk(wpZOKeIS~ zV84|9)b7=s-@cZ&lexTIuCcE>pg-w!iE%-Z#r@sxFANX2&OCIr{qW&p{`CjWU+G`d z$r`=4tvHYG|NVPA+fN3Da{ehl$-<-}a46bU@J1|?hTxUfevZ{jN=i(N*shq`*k~|4 z3>6WZ!Mncc7MGM@BS#wKx0(uPP*_JV|FVeKIl1e_~k)ZU!q9C)o z{qc(D$yZLj`m*zU;Utym%*wf+^#pgW@w&G$O(NNiaXEuJqqLY^o!E>C%U=5awc8N- zQ*iC6AN$mnWLB*w=66y-SX>d=erWg*WA5#id+`6 z)HJfWH+Riz23fNN8h(Y5}Vfv#L-?#^$G3JjUG3PmJ>{wAtCZjrZU|QURJww^B%+V3#RUP&ycn(^H<7# z-W!H3Rr7Z}>N#?eO(NNCab5WDz~FUO*P2p$ZZebxTgXaWd-TwPP2kuJ-3vyA?#2#b zJyD&8Y1Ssq2d=NI4|`H66}oPn$K@?gf7)sbd?{xRP<`EYr@j8|_lIj(&6*x0JxH3J z{95AyM?whm$8yH_&C$6_gUt7jAF|(fBDV-&&cO4oiKNYI^*%+&&OX! zJmoqdQEZX5x61t7tmiLOwZqrN91k=2sh{Ao`uOE_63J~$)eOHEP2N?%{Ezu_&5)hD ziWI`?UkXhuTr1~d>~Z;v;{%rDGnogTHx?c^zS6Z;M3V1K-u6&~V|yB(bw=gHPrt-y zzfFB!#UnrK_j`)x&r80yr_x#~`P=);lP#(aTOCNhaPu*T)q`K}IFrx3d-3U9+?R8+ zp09gq_IOdZo>lUX4-aQPEex!mSN-kHP4>mYKl}Di|0I#z#<=*R%j4fnzc*yHB+L`p zA-scYho_kG-}+YWmfE}1?&;3fa}iGZui|_8 zXRXnVy0io~_*p?yrnbTg&wE9g^6rTOcoMwyDPG>THbFFvnJzJ@@lXqxVJrvo_`?BHYNz>~wo6lWZ>dk*MeSYndSj-7+-eT1o zesSpm`vqQClXd0%=U;ODEBik^Dit2}*|JA!R|!#s7~#DX@rYHB1YB5M%PC!h`?O>>D+u&0@1xKexZwv25*% zux);RmrK0rd(U1p_MBwnw06z8^)5?RdWE$arrAE2a&ofzeEXy$9LxpxYrhwMy&4`a z`;F_XB{RF0rWDV%9S6U0N$vc{a3wlYuKhqDv{!~1?gvm1*h|DJL_?|MDK%V@)^Ygt_Oa<%t_7W6p%=+ z+0n9((bl?CyTzYFK)R1?3VgsvB}GXjy{Y?XnoK6 z-F)}^uHrc6o{xJUFbB%iv6Mcux%9m$`pxsm$lkw=yBqa?#(i+9@6Gr1xco&d`AqJM z?kDAT|Ybj zJ@~z;eUXKY#Elc*o8~`D`NnYX+ujHIzEYnp9`x@MH@Uj8Hdn$p?M&{A`~&ri?auk# zd}T06#Zu<%Rn8qH|N9Oe{eJPqhJPu}S*cCCE|e%ZGcK}-;n&?^d-Qu#YDUuD`L2aG zzS-}}oV9P}vX`wdE`7YZ<4M<&%qsN_(o&J%in`k`=WKI)KmX(k{afD~qZ`~8Tl|?G zC$oR6Z5sb=JF(a-R)wy^x)=Vm+G@E3%JlUW|WM5U( z>lq|W&ak>RBlhCe1^UeK@0^V7(*MMJw>>FX!xkv>uJxSAJjT3ldmpUS;Olo3zPDHO z=tA}wra2rsAND?I)8KPwIL;XUJMKfx!u^vQ+5?xLb-wsJVbyz9?YGR&xWC!-yB6-4 z`1bj?xHBjGS?`@#6Xn1(r%6m|U*X$-+<%>CEj!QXE|py8A|D~oE@h_mswnx)*8?uM zJ}72Q{SmlNe2P|6piJI_>Vwj~cAxe>IHSR5?xL>48I_lLD2h+p@%_Tq*1{Zin{0JO zmqH7XQr!sg3azfgiZ7n1e%<>(SNn1+TSiRhy<~TW>(6%8Ue3F)=>2i48h?{xF`e3a z_b!%np6Ho(RHpBnLf7HL7v-;r2P}Q@MuTrV>#;?rC%tF>_Ia;D-=hNY2YWR5o-g3< zd|RX6Ays0{`J>(TTj`Z5W2w+fWlVYw&J*OB%{IP$>frBnZQ_BYk%zxGi3ZA?bI8u& z<51OB_PxBHA=y`K^}UBTI8F!Odi!7S=tIpHUu~4S4lif;xHqBg?;F;TKsjC+xuXx6 z4}{n1N2vNwe9!8=*y0c8tJ&Wp6P!fazca?}6R$b)t=zI;#e3H1F9yqEFN7#YKfQOG z@yAx#(~mUx^gr)C;2x}(BK-g83Z_z#4e287?;XSA^;!`=tK32qidp13QgR0 z(s}B#my-`n?=h@ioX6b9w|MQDHGJ-(Wo>qnp=D((Wo~OD+keCv$j#k*?@jf=dm8aPft0p-oiLo9x!SZ9R_)d_>x-ne1JJ4eb-`qo@Bm zbI&<8OLh8@|5%*6YTUIqM(i+R4>r_I;->vX!WM8mV2ci*uQmdox4k z?SZ{J|B6SObsfuT{$~*XtlDwfnJriH4}Wh;Uu}5CY?p^6Myg0UVSh7Z&Syfo13So8M+$JwYKWeGhxnlW7(0iM7BqF^_4f5 zytGfG9!Nbqb^Do5x89};9(@>apF1o>X7k=!TcxhU#Wng7K}ys8XH5@1S;rXq=F^)y zr#Gfa_O^@Nd!O5D+@4%|ldVGOdA8~KeR;Dd@4WrJ>CCThT2W`r&zBw$%~)`__&~B{ z>#`GWs_(^bw*2Bes`u?{{butT{U4SNBJH~ue*fv*YWIxs_o9p4>!0^k+jbqk-gtJ? z_em<2cGv4%T-LpRY9ZUV%vfQ%jtn!mV5MYiUv%_5C($kbQOEC;HvSBhnfI>Ru}RB4 zI_*%P%)4H_c9~{7i*ropHk{ig@3J;La?9o8i!AOieBF9Wy5i3FCf94_ELo>+HSU$k z{uXev_10lNlUEt6yQVxYFqypk;?frn%Zw&QRz828QdPuKZ&io?z(dRdXKFyEcXhV zq;h}3v}aEe1%KAY&pUtd+aI>M3mE)P7V#+5=vSzB9e&R=owE@YpVv||E{Qgd8cZ>tj~C-7+!PxV$M2;wYJmU3M*`_Rz^5|p3<|QLFnki@QA%i z$BQpi>pj-{U6m%%ZqItoU39(lO5aIpE`<_{4(fz2`f57gWxBrq!e^7GE}eeDKjqi# z;+4JCQV*uA;d66&$N28#t#cpm2D(pDd9LPZbUJVQml~J=j0^SqzyVy5lPX$$#Q^grJc8u3@88aN@<=sf$piDZ8#lix zG+*$u(LpyiJvjQ+4kinY)7`1Msqs!z?b{dMyu&f4IWBqoqSNi{zvDiXO#bB`uz&gd zMUz|SfBCfI<$)C%eD}E@R3Efm!BoMrYJv_s-}djf)?fJjDZ|97-0B1KeeS%EdlSrN zz4*K%Cg7CZ0q1?)qN+rBAnwe*RPI zIvn0;U8`@g`)tPbA(1t2KlU%=`?CMcz4z;xF7Etn>wa#Ms?y`% zpKAKPsd-M)D_Y%>xAVe9`8EE&h0I%-w)ReH{THC0RknPe_@2zeug>>BDzMr$rMP1A z`NsuMHa05MKKs0V7uU3>DG6aB?ZKP&#OxE-abFwJd+uY9{x2IjU#>r=ZQZ8j{180 z`L{1Vvrs+#u)sp5&(y_b-_2Ks7PqFaQ}NV0zcsz%#FuHk$1d{4IOx8=vWd$QWVnTl zXvxB_>x{m6O;X`5pR1s>o>9fqNbKyayB#;TiExK~1(fX4L%Eg7;5m8LN42k}gQiAeET;w&rgwC3bK^niA>D2ym|7;DK`;|aF=--imZd;#4;Cllw8;Fp7cb*TD)TY z^=Z$=m5QSLzVT(jNQ6zNyy*eP>>-StVS zcDcmXUnQ<}`bu|?Zp{6+nSbgDuWxtNJvZ4FxOd*^R=Ol>FhS*{%Yzj{H&45$oI3fh z_tPYuWY?65Q*ZO1J$t1iQprf~`g4=qRNI)f8><4@a+4wFFxyO&;H2y;Irx`KBW|{M-K>THh31 zsWg6Uu;o&Pwi%|n~%0ee>HzPnUjD0gu9C_+}q`3X74B& zrD(q9f?TNLZqJ2(<4(Q5_$U7on`o_`#+L1CCdkgaEgz&9uJgrulT+Dcr{A`sn|^le zN)#36K?rl0TY@5-HaQtzj^Iw%dbxf7^{P`rQ@*u-T{il<^Mk*O8t5-{X{hl<>+vSO>_IBl{D|-aH zU7mEs%zvz5{>n#uqGec~glOqZ*OZ`j=QmDqZ#sW+{WsB9DQSCpuQl#tig;49Nd}a6 zBZ|uwik;n|ZTkB0&N znFoTq?Kdqte|?3y!y9is^^ivS0PSeD0;!$1HnFaAKRvxs%QyA;e)-Tiqho=243Q20 zVi!zq+GNM5_VnBFuoHgHy{?i!t!BC|>pt-~_R5-2*H1Ic?ys5<9hITKazgCH+x5$x z*8TXmiRMsVXgI6`T0seTRPW=e2Mfav6>y4 z{#Nq8#+KFpmi_s=WrNeUANG5?Lv`CEf2vID*8ZjQ?8@wD#b}@Z-c|aU{r_f{ z-T%0Z``(^O-e2k`Z``x!eA34!?pi6&MQ-h1ekW_v{_}CGUKH0Y{F@%ORU*v>J{tAt4T8^?*A6Q`o-r~r)s~}oR4?)#H2nY@iW z1u8K4j%$gWdi7+bws%_dnNvEE>EhGYObgCCc`M3g-sYmmn(GyRS_{6^J2O}1q|Yhc z$o7=e37(U3POsvsKbEa@$=1nNO`5lHa(@g-mk8$-*YB@&$^tTg)PAoZCz8Y{b#l@SaN*JgOol71_lOC LS3j3^P6~}U&3=9eko-U3d6?5LqEuSHMb?brp^d-4bwYaXRM2z&_s2Yl>Kofza=m<{?cU_{B8{m@C_P%t<*Sq)2|894Aa{k^|Zr7B)jw!#+<-dzH_I4=~o_M_B zRa{*6!2}7Fz27)Ow(|bi8g6r}{8jXUI)~2ndEV>uxYx^kIK|Gu&*09O-00lk?wXR+ z7ybT8?C!?(@9G{*KQQlr_<`?x%F37oCdM)_&d$aGpf1N-V%c@1y3CRZm}GyZ3nS+OcOw3O@J9O(lO z8CFHH{yDaKw_B+C%2&qsmi+#@qd3L%z_)vkGZV@e*f=je+|YSo<^kQ>T3NQ{!~~Y# z8q>eX_A`d@Jcug{^=04`{3*OaKaYR)`acJ%>s&(Tf9tE~ui@LnxL}nybH|BoN<}go z6gMnZfBk;p*CQ%1$+MX1mag)AkSw^9+d{yCamOijd8Tv0S9kyVD8<8enBnE>jkm5< z|MLp9Kc^^uqVQeh{g0>beKxDzvp@b@Yf0;>ZIAeP89%g5{an~Smv4i_k0aK1qxFl} z-&ZbNW%m2k{O|M1&rAq^Fmd0?JOc?f@AZcr1O@Lb#NVV|N3IhmLWXx<__D% zx{YBEg4SPWeV3J{CVOx5{nm$}cN8D|I*_;T7xUid;=dQJKA0epR3*hW@6FnEYuRO5 ztaq+C5W4DDlm9!#2Q~^yO3{qL4WX9rLSKK4C}Yw4_A2jP`?~$d=03R>?;^)4ceFHr zLqU7fdnWk@-&*ve>RV(){_Wk>tx}WC#cXzR4kPEu%s#GLh!1rN7$CbzHto#nn z-Mo8~{4Ob;wuNq?AD!~<9XIv*=PtDUc%e(wIrVyhcNa8ufBQdBzxQ$KyfYT}e@aT` z{ukR|vvZ4M%#-Z@jO*Wt#NXxI!De{Zja}f|-2EKe*=N}O7hLz+N&5m%hx&HUW3TsK zS^l26AH?E1Mu>+Ke<`v2`!+40!3(JNNP|9H2P z^WB~+5f3s$Ywewv+wR$Rk9A(?Rlf5tH%nA_-3_&KNvVzb-duR#@vEa8ReSf_Hsn8A zXY$Xxwm4WRi02J|Nyhb6OAaPTq*?V|-C!~=aZSip)#-Zvz4%02*6nY_^KukFr10H*xh=Q+*!822KdLt@(%HnjE%*NG$$zca{dV#{voZI# z-uyRv4=jsJ$={ayJ8k}(ny`LmpW@}Yw~K2xnLpTN@#RQ-?(KOGC+8k`UOWGw@V4CW zUn%JimR)|?nVx%l-x>92#yL}5zm?wJcK-Xxe>@h}-EWd^Z}b0ra-Qq-&v|O`x3<-; z@&D$sz^FTCcJA%=Un%{p>rN1WLeGqz56HG7W}Wey{-QJ?Kx>-9aAk+_MgyLe@gLprJLnMXS2`7Stk{5U*5ViMfQGSwf-i}`-SfMn`HMr zzPIna^2hBHfByV&^3T5dgRl0!GSN0ZRrxpf#GcB}fA(>IzrF46VI6Tv9yaHD9GC9i z+MX_KBEi#U>S-hQUo|!|nB&&AxofjC4J3Geri9n5Zb?hJn_$qx)w9t^f@g74f{mR0 z+3xnU%zry9>m;=T)2qC+eD#1EH>`zrG(r08LL(^%{ley)f&I%iy2#X ztXPuptL3A#+jRZ-Dhn}p_9e<;VPYq@Mj0u*dj0x3KU?$L)YR0O+7s($cCyTQyz129 z; zvW9P+T4Lh1%#Cf+>8lMJ8?0;kH{E$u>#nj@@}1a+=gi9$tK>2!FPS4Qm3H*po2Q@b z7NlR?I?=UXq@C-P>x_ikW$i3Cx%i}{8{603t>R`TN8A4N=LWE>v2F0?P}_b&Ey#R#UbyI9y_s*W%dtmhW_0bn zd?6&9SD@2HM$qZ#TGs7+uDAa#^gnzcLT8(&i4^bCNh{Z{kKg~?_}A)FpFWstoj&|n zcH(=6+(nVj##Jfb-n?kLm|>D_HG9|1(%skMVt1#S*QTAdk+HB3J;1}@%la(q)UC4S zjnaFjSJr;H^;1Z*s&bNterQG z#TQHpYA*;m{N~2R$S3WsbLzr+d$;~xy}R?!w+7`Cu^A7Ri;9YBOH04*3%~e#qXk?0 z%>(B&{`;_fJu~Zc_P^Jq;q%#gL#JK8vgCG7M%P}3HEfdsz)Xk`t<7RuPdZyC218bZq8FYvC(1mqURw~uj_QUEnfI2z|r`_ z>{FjU_}lzsZ(!CweOTIM@kPUmRsRaEa6xuR8*B zj-Ff~7g8K~cG9k8yOMQE8Z$mfg988H+n?+q{}^_$FX;LgI{Dg^SFc{_zfQX4b;oh&;xj*(kjo1IW+j#979sd5$DeIhXF5aXxM|WBNg(HtYc7JGn znDRFA>`dXg3*PY=vMw@WEt$4x`6`v!yEs=}Yt$2%(O%$TFmBnH{6jJoASmOj^LalqER#WS%JM*dvdV71LJEH2{GKHrKhwS89vS(r9F}bFHLJwmf z_==_%8J#d)d-UyfhSQ->KK)vD>vH4#r~)TYG~Mfs-_{~rRr|LsarxTC31%OdMR&$s z+}!Bg?c8d=U8Pj^gndJrX!<7CgUq>|ec6s;Trq+7Lw+ki5b-_9dh=G8h4@A>?Hdl= z3g+LJrU!=z*$6+ZI6jHF;EO=Z(P_@#<9c50LP~G6Wp!qR_%beiG?U&k4z5e-M z^ajgBZpU>ZPc&9LJl^{<@pf6z#o)ca?=~%-d;4YQ32zSet5>gn-FEqB!^Yg-*SF>R zd)jZ3TKz5M;L8JStD?dK1OM(m^=X#Z1JMWSA1n5(&R+8=D7DgeiRwi|-VFAeW{X$O zkLueuGbqk6)og>$QA=Z?PKzfGZe_36WioUAu`u+(oT);4mv7RkDM@`Q%3YguaKY8U zxWK^AOj;*UXxp{SZ`h+J-9Sl$H z6cxS79}?OkedO=;QZ22lfBdPzqO}WG<@|bVI{m6np}O4DtOv83?yPz-<m1jR)`EW`}?u0tE*pmqDPSG z*W!d)$9G{n7Oh(K>aWc9ABS?yYm7fwC(MbGZU4G#I>&7$#nTsObWG_GwpqGL>CW28 z3kuvzE5A0k9((-sy zpP%NRq4j`Oqx)-JYO3$`N3$R6u;^%dyuEn)wWQW2DeaHjdiXp3+z$V1BoMPL=jJoJ zgYJw<6FrzRuJsu1TT~xt5gxKEq0lGL@%WKdn_k-H?VjhA`FzifD=ULk10>*Z+U|Wk=kR-d^r4>|wJP z2W&T=A;f7ndEIJ_)jOAM`qb6>_3PK$OiL|3MQ!iaQJ?$o@#nYOZ+@JYw|v6)2BH6V zrYD}=oOJYgG=t-Xb8;1-k!Sacie9ZhQ|23b^ULwTTFwmu&$s3jF?ekEVbNz^arjx} z66^iH#iZCPc`Y1U|A%_kU9!*?dwFfkC!GVS(_^nOEr{L!v{&Zh(M-$IJNGv(d+|rM z`-C?`W5Z-!Vb60vGaEuq6+N#Dtun4~cDv@8?f%n=MJCaG&)p8zvLKJC)27v3y0j_F zpTTvr-qq^sd!i!c_L)xa(Yh!0;o8D~oLjm!&D#0(>(~907Zk72U|)TTwIhTf?|R6R z<9pumZ93!R8M#t7()O>{_1bX$igVwTx&p#NLPFLst(Y6Ud*{=L*P;Ha>y!m9#L7CX zSvPe$sQ%pGkQe;D_V=^j-Qsf@&%EEWeuL(Pu&}Uck_}lA%_ibY_vz$qJ@7l3EhB4{ zwT0?RrTg-$eym@ay~_HS&`rr7w}P_IHL-H5%`G~m`A^}cU&vqUy3=X%JYVwM2))R# zL-^&nyTnsQ>)s*3Grre>f)HX0p&?ED&G4=IZ6k3XAUEYj0w@YqGQ1*SD7o4y#P4ZQSoO*J|t9jT`egu1s`Yuw;t-wbh;solYppOxs?#MZbgp`X$fD`u(?$NQ+hJ0nd@9W^$Z!9fO{b$o zo-tVO`G0WH<=VIJ*{b~czrUSbq-5Rg;rV`2w!V^((8Qcb?cY61V|Z%TF5(V(Qu(0! zn#=DP21j`|8J)^qOSUM4g+xUx|B#x!=#(nWO#ie9d191yj6=IK4Q^#mg8@ zojNs3be@aFuC^2^jYbzxJVK8%mFuvY#f z;msdg|Htk3)tI=?@eLte%R}d!WS#Wp%Y@Pik7X9JEij!@6MJ-~jKE&Y=-(4PR4&eX zapROzUoq3B;OIqtF4_qk1^o%ETvcb z9x|L91Hb3_ z)~#DhV%9(MDRYTq$;en?%W)$%xN-KcKbmXL@i%UFd9o!=^?KYf#`WDNWCSHQoR6xk z{PFZq!tr$-|1JpL+`q|YkGG0YBx^uq*yraB8@8{Q)BE_3*@8QBd0z1=P4u|5?Jb{g zr2A?M^_5u$sfA0sj4NXf?(kC&aui$2b%XgK&-S;k&e`8O^=X#W@kw_@UcU&qxa04f zhAUPlJ~D`kK0MA8WZ^jFvEZ@}HuDu)-0?gUxLz@9oqO^q;nmZUXtAOhU7`F2iFov38TP}ypQH~Opo&2Y5{i;3BEM#mY-1&2IUs@b)>MmfKyK-}L zP{o=Ra}>0euZcLwb^ZCJogCl$cbM}r{nJ(2FFG;*%YWflPS4KH{$3mZ)A;r_c3Cdt zpp1-FzpX9KhfKTfQZ@bD9<#D;S4ZFFyAKLnydhG3s`2MNt|tuw6SWj<`RciLxP-=^ zDLfg~{{86xBiePGR~XD!W}ORtX4?8XU9~)PO8EMZ_9ExmKV4tj*(bZFb-m)!g)8-V zcIBs5{y1_k#q~+zgX*|KQ3K%_i&yPkw)oSh!{vUwkq4ajx$m#PqC9iK)jF#~)9%LT z{_0q9&*Vzms+F0~__+Sd^(=hV*xc~k^@*C`%?gg&vc5hHc`R`v6BCPr-l%`KT*W*~ zUseay8d_0Q>gjo~(fMwfiPYABbZd3ZZwz|+tgjl)U6$OhYf}q;p`o%ko%Nl|-UrJT z_A*^xk>&1xeVuN~mo-K|l>?Tol3(LEmB)6%#m%Rl2tEi3jlFUC@mJ`0{G{i3#R?EOBBJvt5@gXJJ0i{C&B6GgqbM)o#%X;P7ETCp@tz^sn!??B$y|E z{rP-;zN%92wFQgX8aMjOKi$V)6Ye5+@Naq4>^T9O-%8F@%iUqloF_g}qriGYg~ilY zuJd^dzHhn1aee*Xc!uPYu@Dd;F|XU=E(A8?iba?{Hkp68tr&7;LcPv|-S?7X)0DDrGF^&tyOoj47gBLt{Gr|)2FpXaJZ#O1^XC*E zlXO4+_~YNpPZc)2ytA`dT|aWu6aJGaM*XWm!xrMZ-)uU~^592FWQgc_`{&j_gHK=Z z_hUNuYH^Ox4*nm)H_JE3_4X{U4;EX`xSgT7FrDM!udT9tZ?5#e4rBPwYWGQQ{sSwI zZ4b^VtL=Hb)iCVK^aJ;5CwMdRGnYSlD^+{e^!l9WkdP~xYnm8dJ$t)z{cEB zs$C@t-{YhOCUXB)xVCtI=&>|2md77|B<}kZbbDL8{GP5ho6lVD+W%MV6FsSXcE>{5 z;!x9QtEp=$++Kw|;JS0xZ1Y7no9^s6a*S~Sp~mwk&Hf^PvU*3o%J=V27b$$0vA)JW zZ^D|yl8OI5On>xCtapaQPMZY>);dIl{+89d%CG#jr+ohIkkZ~fPtz{XdjHGyDz#mL zKFMLs*ZG1DY;_0;-7j}eTJ_K-&b;%y3GD$s;e5~k{yKSihvVJ<*Y9)x&R8<-fm-06 z(9rvm8>YQB+s<^A`KPksv8*qj!|$vsdB3x-jg9-p5o{_TEg{)2bs1<(I8B(HHZ&VSf;$!1U6`_~TXS@&wz$8BZc zby&P=+n4W2f|{)B4&Ck9zFcIE|HE%#)pv{!Tu>KdPG=}zk+pxH{=~oZfCH7p^a0zWU zeqZV*lsJ=NNpq7w*HM#+9H$$16x;r1c=qU9h~6RDd9hMmytPRV>(#I3J3rlN6Vv~C z^|X`q4f9vOYHkiWZ@?pwoccoFwdAR~SAD(N$5;DU^bY%OV0*XDuwU)arc#Y*|3!@j zEhTnzUv18weBkPiy(_nB-lz@{?mvG1*j+aMg8e!Fd_B*yr%Le5W=MRXzoR(%_~WWs z^ZCx4UL4nP;^~gh(KG8WoM+s&>e)T!3lsSJ4oBdPiQg(#4IMT7+ufg@-+!<1wM}(y-4-JrF=HN+ zHK83RPVRWw&0TwSK9l;&SDSxcJY^svk(?TlEimzO!Qr$&_g-{2Dt~@CJ59o%`(>B2 z>9JEA$`q9B+1D+s-t%bofxuO}RP3W9*_v~2hdPAr%K64?(o^N~L?p~SM4zc$!g=er zgr2F1A&)DU{-5`*?UiQ2r(JUv7Uv$}Vdnk&)H`8Q`JA|a^_NzkK2!5S`cB2c^Ac<> zDdKlT-zdd@-QVzj=7yOU{cYszWp8N5@?El>`Fn#}o^el|lVL8q-1!yJvm&2g)lZvY zCi<0Wl04J3@1gs-Wzu=BMjhr%X}P^;j(aLkTb;7f(F4r~uI+oJ->^9JYxkdwREfMZ zbEYPm7Zeq#ne|6X9WpV^FC}*4PD>}68?fK73dk$WZRw`mD*tq@_qhI*d`lp_% zhozJ{W*6x6a&9;5iEv5bzT;VKZyfTqvF1f`#O4`^3lc*Vlo;mg=Hos6tic6?MS_9{@3tP3pJU@6`u^l(uQr>+o~emTj9GtdTfax5JecdSRhuN6 zl$(yyCb@v=fws8{(zB%8$z9`8z!$n;_6s(JeQOxu#zI`I!r8)f%QO+2EYB+VfHW7RCi&6+Q* zx^i!eGl?%dohFeX;Tgj+<<}|m)vu=CY~g(^b}T~DO(?kLxa@&9HZKz;8bKlLqM-Df z@%Hakawd_Y*K!|y{4w#skrGReIWMgLpOm_OBB8+2cyWz;+!li#m2>LKcb@ID(MmQ@ zP;z__5`R_e!THLd;|5NK#bIp|4+I`Kw(ry5wDXWyB%nYMLA9N@1Bjc58l8{{pC%bSg!%--AZwdQGcsOe1oR32sV$GZ|vn75}+ zkw4om)F$X@ePNoOL~<%b=zKF@n_x%o?R4h!%$&TY z($k>{wibZrXHxMl^;^~I@m&&b><24s?!D5sPq_VUW#m%cwuQ;ddp5m{lq?cr>8g2p zs75m>;`t53#W_7w71fWG9-N^6>+a^PmD7Z;K9XT5-LY|tpZvG^`RgX+drVl}P+Ks4 z&wj3>B}x3gy;`%fQ-m8UUly(E{e1k~rKN|<4zCbVyQRV0$GDC0n6>6N*~<&^`EJ|( zZZHgMtJzrU_H*w&y#gJzt|F#}l$5lHD9vPN$2eBAPoe8Y880$+PncX3Z|>kYA)e>? zU!k>knhSEapHgW2l2{z^EMmh(uI;T^Ul%5ZJk_bG{MozF=t+0szQ<{yxo5R*vU@ep zS$->X#XPpU^|y92nv|r6PJNRWIkzpV^H5A37 zsobvIv%PZZwXB=R1l1Piq-m~K_o}FLa`~OI1=3-2)D89>EF!a1r5_S+_^XB(IQ^yEwdd(pZ2fH$>;QEWLG~_+q2{$|4e|7rz#rj)Xo?Z%QU~6?^ z5%FL=n^@VTvV5x9u1GzusF`aH$s6nSuW}Yi2<5Df;PdY~U+u7vsh#Ui?!D{jFIK84 z-+6W{aYyID3(|kzMe>SwX8qGBn6y62@?O9H!=9k-e8H*tf)_(=WADpMD_-(@zTLgA z+qd~lub+D6it5W#+q6^InQYd^ax<=HJpV9n*2Z3~;@O8c`DXg)OTT%Y#d*4>RDGpj z#L5ExJpZS=nc9V(9DOErbN7}od+9fOudy6!zPsVrN2lClKUT5XeBl%|G7WLz{P4YG zF4uhy(LkZ7t+%=!XKlH1Vr7Zss_(KlbVV+6t}HWisyvaMzkHh6x)&Q6Q;i#UI-DuG z5%oaif%12eWZCx1e;=(B*<8RII$O)VHECD6#%&38rTF$m1qWu#;M{rlbzmt&OO zm+*?7%AXaSBiHqEN`TM)<&SpNGtBNXl3lQ5Mzyo+lohvUGdfI>Z|~CJ6b&>|J9g-T z)-~bORqy|Vysv$?_q!Dfs3>AzdLj3L*@t+N+w@`YPAz)R{RR zF0x9ux=PmWQ!Ej<7^ZZqYgJM2ww32)T`oWW{lSi(^_^$sF>1};HSoy9COVpmjhnf_2ANsIMk%!eW zK{&qBLhU3^Ti%MS)g2`lQkNWiHc4KO>C`#Dl?_1n3nRWB{e%HHg*xjOx~X3y&_?uVEj^v)4?QT15z z|Mn!-gf;ob7x)G1W_!m?+5Wq_zb2t)s$%?)-q5Pg4Mv97mPF%G1 zvTx$r0s1RGY%3|P{1)STfLCE%z(eH+PcKE)Rw{g# zl)kJlocL4dhC{;Zr=gqf{rdWAYrLA^w8yO5f-BUooJx*as~b7%^pe%fm*-dr{QcFH zdz-UhZv86 zX4g+#UbLre_vQ0>^PW_{JsKl_>YCrNSBvG{cd+bGyW$tSs6q33I2)HVrth}$%to5*v^ah{9pXv`X*uT7{Ez9)iF z+Rr|2R~384O@gthmNE=;8!z7Gn&UQoVbxVZKAx+u)SU}=Uz+hxu3T=JBu7UPM}c8% z+bh%4k2*dIzP-GpHf+`wOMwKV5BclUxJ9JR-9tG%7R1Cvt=|6CyZ-v^zftj5B^sS4 z%if(+)7};TDDV6?i4PGMw!QrYDMa6=O(|!Yceb=q)n@IEjaeG!f1h7jG&|xCcfy|M zCvJv!z5eQa>gj=J3id4D1QXd?%LU`KVo%1}TH12OEPkXbpmX45*`~SYHA}vVq<@{d zEx_mb*3i@UWxIv<cpMIrSe$}h#`MjI%5$3bsi&)Y{giJu?&4i9^=D;2xxYw;FNbqa`{51kZ#<6u zPBK^{=<gSo~^1K$B8J#bgoO;4@!n@AjzGbe5r5r=UJ5DSwc{=;lowvslUVxh2pE~O`EG~M> zCL4U|0JU5m@yAPgU;niCAcKME4YR)nehb@bKKa*dj6aa_;H%BcB#Fcu+y1g%co~;i z71mbsslu(Y$Zm>351-HZQxnWXz9tJsx?J~quuw@UYtDZj2OGKjQt^Fz6)rrm-e1t0 zof2`qa*kfIDWmzBREL{vJlV3mDR1(OSHzrWJFHMCv*SScydJ}_HaUahu(q1d6>dL& zgBpgP43C|f5FYY1c~|vjdBsbQ^^Dp|=Ooz3)t?KmJGAZXsXdv=5#c+zt-e3yW?0U2 z{i(m~VUHtB-#*)xozl%S;Njk$KE?li;HeFM$!(2odls+CXV(9*icer-?x)4QiA$0| zoskFcV>$D-`5oTntGc25SK=HeUgcKn#>kS~bCqfdn{KQ-d}G^R#t)9Wa;n1G1RGb? zd40dzS1vqp@u#KziBCWwG4V)m!+nQP#`^P<_1bKN`;VJ5d0l?0U~s|MC3ufv3C`;S$t8{|R#Gmb-`j*QfH zM(>)Z@?9Mt{~Jprr%FVw$g(!L9iIB|+d7`t7N8|Q8`l5n$-N!^)K|Ls;8V2(tBTnj zhi)nr&0X~`Uar*Wi6r-rdG9}-1@&$kR;^>Id%Aj4L-yG=q1R@h-pR@{O#fbM%Qw8% z$ck_`Ja)=JDex*wz_h@-3QEbJ7xpXa$F$DwDKs*;Y0)a>rn9PQdq)h5%(KwkuGwD8 zl=8hKuSsmn-OspZqTcLzpzfTg$InyKyH33O8FXxdz0dhm28#l(UUz-M7PFW&fZ@)| z%5B@91ezW;5bi(j?2x!ChjIUB+kX?ES~V-q|1;^`4winWejn@;vA2ow%4*xM;5RW!KPoTD>pVC|<9X z@C-TqGvW_}gX}!rwU^uOt&`+geQ48a)tJsr#v4RGxM(a>=h+r3Xem+Avrfc_!9M6} z^`@94iKj;%f3*I1ob6fQ^o6O4hg>e%cYQbVS3eY_E%0r2+VMpS>9YlMRdw7M6&YUs zdv9kY@Xh7!ch@Di@0_2oSxaYk)CZ$mZ)yye*+1mNt3-7P7J*FidsL7`H(QB>4T#faeNB93O__^dEo!dFubv z+hwu$wn*}D7p!>Z!Vntv(|>JN`l72-#h-s)IOCh;5|7q?*VyFN4<7?o?w+=3`u96h zQAhq4Y%hC#a^LYF^1z z{l62anfEdwh~b+r|9_UQ=w+w>F?hDSCMW+&eOIcyrFr`aobKlMpsjjv^5$ge>nv@d=oGWC&*b~Qsar-^#& z^kZTl`2;PMR;Nn4&uG~+Q+3ZYjYm^C1!Eshj|^4a&Dzv+bS^hbM&`|lwKMfp zWcN+to5tF8!!N=8{hq1+cpCmsJ9EYEdqn70XThBeKNhdA>gxCt9$IgC;d-XT&o#D( z4+N_&5Uvz+xMR7xGuLxl$nmw_iwnf~(itNTNgj}|%G`N5!gANHjahT`qOGsqaqMFL zkhjiZQNvTAX`j85?y5I%-?s30c%FfE?VLTUg6?rd+*y6dkHf;jJL2EPb#wN_&DA@< zC*Hev&azWBErs`9D>A6us<0K9CNFyQ%iJ^BY)+?3Zr&-}5!>Q?dHrd|uG=p%R!+=R z-CC6!b#2p(<$UbF^y2OR?qh!-*!0I!w$3+v{i+S0iv!oOEc$!VH}t=XQmMn%^}o0T ze+Go+zq`(D+9TByoRR;dtuA-vyJM?%dVMRBiDNn+;24y!w0zILL-S`Ho+N4XNIipf z#`;UO``ua(bKkkKBTwa!Q0P;>1epuV3d9fX-QhQR_wolnpK0A({9k{Qwf6c6b3-a4 zKk$g|>6*>?ka>Z_)a+S@jjXG=vsy#;CWjj?<4i{PVUR}j2U6T5oQ&8|B+n$}mt*f0~*MtWhuUaL; zyQU!jc+WNMl-u)eg)J1i;n4b?eac(Wbst|^wyr3#Iws*)}_#E1H zu_gDm{*7(5@xL~PNo$8p?bxQZ<#*O(mn~PTzgQhtjyvyV)YhPTbxy|z+4VnyGJTc{ zUSwGn6}6mSd#>B!8=jML^-?D(%fv^muGe05`MY=b3^tw5=OVQymq=M^9}TTIT&8{C z{IPSFmcA@be)XmB%I$K0i)}l-z9ltmX?g0)MIL#SBT6=$$ zDcyP%*HoSP%XZ#!**j}Bm2PG2R6bb}{qARv=Z}96)-udv+4F3*9_v3nC3l`Jv4>Bj zyq&pON=@a!@g)o=XRH_6H}_v=7XRlszlLgN&GQMK(`*t?ZB9=5Rh4eJ$dmW9GShOV zj>Bm?q%{;K%$txG*8VptD`o$?R|%!RCPex$#l1ZL`puQ-8}VB_zfG?!;y8~gKSM3W1n>2`uFT#Z_0}nV zxAl`M-<<+)&FafGYKf=sdGGmvMXS7Bo_O5J-F@kOu;2%GLCf$^!{TY{zAd*uFYTGU?(uGyU309epM-Goq-mIktax=>sYu`hM~T#H1%r5(V=G_r z{=9t7Kx9T@g8YUD6>Hw@Rc|e4*~h=&(6X7=x2XJJYxHB@+|ltZ<-)HcGt~at2u>5- zvAW^tLWzrK;%)^fmiRR(pL)D-#yty}?~;5r@@twK_g{RvK|5_Au9QYs5sJ^-F$v?{OyY>4Ta#{AI*S zIsCspS$tL8M){4>o1L=`=r7R-^lIgjfApa!bMLpxJfGc3!rartPTj~`z1q2DRh^nr zJ7az8IaYy&?#5b|CnBMLGgiFMmZ)p`Sn($;{-^8hZR<~}?a{j=G)?XJZ1#;h>-1)> z{LiML`>4-F+PL9tVBLfj6Bj#g{Uxx2Z|bF|X$uzdwEAD_J#dym?1*Kk+Vb{z?ZcZK z8Quxq5a||MJ$G$Yj^j-o!D;i_|ME$#y8b&l=#Dto2h9(>51OXEG}@oC%eS+X2bi7ce!g%1YBM3@uvkQFQZCc`dL;gGa9xE|Efg2kf!_BUH zY}MG$+Vtu}NO7-??y2kpi53-@C27~SCmvD1BX|E@(>61}C!aBA0W*h|Oka`Gx`jn7 zQqJB#Z%(+Qv#4*^KYxCv1vwoCtQL~j15^cHIT^}Mn7nlUrKr84KO`qGFfEd4vhKNc zR=Co1fy~ajz27n$6?!f1czidp78d*_xn|$ZfU8SZO?&t&>E~lf-2}A{TRbP)R7F%j zTO;;Bpe*@}i?ysaBZt+V>6`8p^L;V-KSlN_n~oWq$I@Mst}o|2`eoTOt;%y;1uCcP z_(VANG=2I$$*R^a*pA`-k|oAs>z2!1XXcP+WYM|zeZI!ptLGb%g%d61Zt$n_3x;Xz zN!I+_oxH1J>$R5l1;2k!d|FyoJc0MXOI(}_*2RDc#+hnZo{y)Qohhyh8v-gj5;?~l>@1Uy3 zcgs1~H*-q4i7N&1Y?*m=-I^7v{DddoZm2x4Z(p(FoimHmyHC7zSo`Y26HenVb1Q7@ z7X5xKksM! zx6bN|WF+tE$&%6;ZH?K2N}G0f*f8B;o>3_-uVm!tvhHZFjm4#UzfjrGy<*>OSF;)Y zy~4EP{|A0%`7RG1m$D-p+zgLp=^ps47}x&W*`#t#O^1hrOC8%D?mu&6-dU~MMHqnpYV50c`f&Z$Jxg~uK)bksqve0e^1+!nfyXrNr**{W!<5(5n0E+ z*zIAdDQ>*`@_6;)RjV7S-t#|5dcQH1f6@JqavdkCcSy?1vC0LX6>?3GFmT-U?J~3Z z_Nj(piy8FmFUQ2JFS`HCmQCk_G3c4`-f?l(=XR@nm$^>Y-4s`^Wb*kWR~O~-BsYfr%F`W+4lj>;y{{B~E%*L=>ej8ZH)iGM>kCcH z=b7)<<`}>g(vV|<%??!@`U zJNAXQ33??bKi>Jz=a|}^G!aFm*$?yPRf*L`GwMW!AIf!E!m)#=eA3=2>*ls@Dy*`) zbIicV@S)jaiO|0hq2~|2b+x%Z`_HbHRog1>Jr{0_{=B9yQNrL@mdK)2|Brp0W5;dv z-Pj~H#Ua!_^lEWqe)2MtYg(Z4+$;X4?(J>uo3nM+Jd_Wut^Mo5X<=XP@@|#h>bh+k zH@?#my}NvqO-*LhvXz<7zVTh-Zwfp9R#SJ!j-@-3-Bg4mFU~s__iFlWmnU%xxHQ=B zA6xy}V%0CEf(0FO_)H$<>E6G6;etUECzD|O&$@(&o>1rDT;>x`PJQ~Yy?ycDoQP?g zmmX4G^o#9-&Y_D3UheoTy({5hQ$x~Uxrc3;mzBJwXT9Rn($f5)TJUt%mEr{}vWyE_ zJMQq9FfM-*xm2)q)jdU}@64hOssVG-r?#~oJ9bR>%BvsV>8)K#HEpLRukHM{T6v>o`1fqvvK!1zYgTEj|5q5bY@udZ=c;X?p;x}_`kDLp>euSY zNt0K7TGd{B($wr|p3~0Fi|8N<@3ruf|pLxMaBYOv$fx6IwMZ;Hq|` ztmHEL$2H2A;#y9{t>_WmdXGtL@f+@_=oq0lm%ml+aldMi)jbmN8QfGZ%<@X2g%SfHSte8Ryd*2eGR`cW=?cEI&G_U4?az2n~_4P+6d( zsXu?;3h}E)yevPa#PQelK2V*qjs8)!Jb7Zl;;;rjmDeUi`S0Qm{#3 za>$qb-riDsAGNPH69V`Onm##ReHyCIXkvO*_LYU-s#Tkw)k{ky=d*FGIL52#{h7VS zdOm;Vd94|no-tQ9ySO|Jayhp$f0eDJYD?jE>-Z&)e9B~Aw=QbxdwD=y>sG}5h~L4D zvR61$?!F0{$|d-3jhAFV*9l#oqJN1uub=K?P>Xm~a^J}NsjBzamU-)?epZ}(@@(a+ zjz5miq(f_OMK6&EykdU!pTB|T`xP(l^8I?gt*@!o*LP$7u5{}%!L4%H{$g_yS-;vZ zD)NtZKe(KCb5{T9Yxgvl&za;D$<-1ycTsNWWcTi#~x-P85g=9S%D_x5Dd^pG!Mf@$h=oBYA6WADXP%vf=US%l*gv*_QmH#R2k z54!kT<*AK8uUqri%~}2>7xqU^d-|`fHM)U&(Z!7C26wl;WzV_2&fmW6OoXZF**kJy z3?3{5En(NvT2;TgfN|03!>JFi7cM>(9yZmte$T2^SwELfciR_Ko>ZYOxHB$9Z`GPL zXZB?-`{d*rS>YDyT4DCVyhZkP+V!_a5_5Gu-}02G2(A2IVy(CTv&ds|{e2iQ&Pp)N{y!tm`+GvB=l%G3;E(GuIRV9%B59Ht@% z&4gUyf*O-}!~{NUsXx$(-D&{vn+vo3nEF?DsEz_xJwuoyIe(Kiw%lZ`-czQ0}_; zr5C@~;$I4fWL($VTFkNMOA&T^*L!^O`HaHUeyPu@=F?_fzIDq=>FAY7mA+>m?sk0| zD7aHs%sY?8;OIYo-H9GQ7DX*LNIkbo;i=KCpva{vNh{rja?AfMyJoojZ2Sj}qil1u zf+`l@`;qkHFZ;B8Tn|LPERp&&&F$Px=VwgTmtTIFQNKHI8{?DD=L&m!gatkX7JiE9 zF$#V#@yV(uuQx^%DW77yP&{katY_0pyK;JtPC7rW>6&%J$EnIwKD(yyerQ;9pDFH; zcFat_!|6wm-?#1)$C4Vqn<>q_p`L&1JpyY$Z_*1H_z9pxGRYvPg zf6c6?eOod6?Vn@kw%IBFcK;`n$@!mm;_2O0;rdgXIFlpPE6f@6Id{3c>b-gO%F1-2 z2T$teoBoe3EL>%-^lWw0y?Jk6@3;~>wQAq$-H+uQpYQzmExIPSX7l3hi|=b%^hxMB z{`~#n_s{Ff6Hf#NNVx7?vU~S$MIS{zlP_JJU3(NWE?>AX&7V2i?#4oHhi}`rF6F;l z$<9*4A(HPQAak*}@i~KwCI5lXbIf}+br=E+C)=1@{M+f0blj!dMsuB5&nusXJ?i4- zQeQ$#wy#)u<)P5T`o#;B_@*@f%->qw7Oxhr8qfZhXT#1l@-i|dZl4~iis?6#y6jQtAz^OZqC?r`#_16ZC5*MTGuRIi8|gKuOqjvi|t=y!@i~C zaqj7FW%rcQa(GX*xvcrSQZ3zt_s!A+{Y5)tB3iTscGmsrKbqb5$!OVz$i#UHc~*1f zietaWYxryHgh^JrU-WPMKW(Gg#DFK|2Y$~xap+_96P*X)@;}`qCXo#2J%B_eoU>I<(&2Rb`cDQXuSl+)(q_XAX@1OEfGcNw!Xa2jv*m=_au#jDi!pgc2 zPfh;6$yo2o%UG+W{>-uFUz;*slmtfhgV6n<9F@|E>M~ZR-j{vBi&XsdDZLipm)1z)&XJ$;ScRd>Ys5O$mL9A}YBVEu|Q#pYMjh zy(<(QjAq_Z*3xcx9QsAmMNGS@`Src8%O45eVs3Fs@hvWX;r1ZR|H-Ru+rGTJxw-%E z&I7j_qR$--9HF9{TOh z_vF2;Off5q$)SgRQ~jRVWIgn_r<+kxT>icG`O(L3^_izkTKWHU;M8xjOB#QCd~xGo z*c9KqH_Yy)f|vL0_SKqNB_2^`@mxdK_VnrV@2_5FWBIfH(zR*#=AKQ{|32r>#$fAB z?`8>}yKgl!>z4KEhK7ch&98T@_xm|xvrv})eWz+GrmV=?|*$cj_C^56W-|T^`A4RGnHStkhC`T z*=0SZNn5uZD7|*;;iPXl38k`Yw_bavm+7DQ=kl$rMb~aEoK&VaVfEtP=MSf{$h2jeD#~)R~f6d?dHU|N1x@K zoN;*HdHMM+ug_P{HtqZ-cmMe`&n>b0&QJ8*@=t5RIh9+llFGt^cJC=FJ$k~sF^cv2 zD(R#e-utV?L;q|%6~|PwuC2^{YAxf@rdHvP=e4Q@d;hENi*UEzeadcmUzt^m^wrMA zpI>Dx{4rm1y1G@JQ10RDZUxd3phy(30L8p=(|-o<^^0E`9aZdPU|?YIboFyt=akR{ E0L1WIm;e9( diff --git a/akka-docs/rst/images/stage_filter.png b/akka-docs/rst/images/stage_filter.png deleted file mode 100644 index 743b675dd0a1165d9ba4e300232bc3372e0538a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16165 zcmeAS@N?(olHy`uVBq!ia0y~yVANq?V7S4-#=yW3$a(J^0|Ns~v6E*A2L}g74M$1` z0|NtRfk$L91A}B02s4)KeKD7TfkCpwHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^# z_B$IX1_lKNPZ!6KiaBrRrq7VRdbQ!c@uX|nI}@zh7?ypPs>)z<;^bU7b5@IxgqM@y zy;Z971#Vn2Yd$zdL19aPulGXrg=|co2UspEPPyQuzU^u3`>b={lhex5Q$1g=y;XGo z`Nhq<%Fo@gTzz%U-tXr$nf7q3aj&}LL_Yth57yR>SITr zdxrYzomW^DrKrSU+%RQT9HW9#a$|R4@AbY_zw+1r|9+sqVRAz@ld~-IANKOHuMz9( zl$#G4Bymcu(cL@!{QqBxe`FiCHf(QP%Y6FC_dWC3FJDb?ZA=a+t+S80onX*o(8TuI z=D{|H-Am<<-8cB~`JU48T07>rSM9H*c-jO#E+o{hUN!&Q=O6!c-X@0H7Fa&H9~SyH zU6zOKFvmjsSoUdE_Tju=_CET1=Txx{tAk6K*hDwMnX`=B48z!(7b-k_=Q?fn_Pz7f zJ5GonXkPVeR>vR4^5(yMf-||-@SR}_V_x_A_-kpNHbK97sWt44-y1a##5|aOK=eT7 zj(MNjEA$J#A3qmz)%@4TUu?~ZEy_Fo`6oAC=YE^md1Bg*d2iOQc=cS#NbrVS#EMn_ zc}}cldDAPs>9cs~-~Q|RJN$XJvxqU(hhFVxe(uY(?dVW%m7y_*jjC<$yno@*e{ z#;q22KEZ%Ty62#g1kYi%Z@5F5eL@;zWP@$)?YLJb z-*K9VO}u-4+gsOpZ@wLv>Y7rYaQj>MyfRznx{gdAsoM?@xtmb8lZ~OUY+4(^IJ4oqM~OY18#f zrVs2-*lx=;XG_s%EYnq}-k*D0oHa$dVK3JSyTsdNr4HZ1cX%><`nV?d_GRWxp(5vm zw;$N{HkfJC(RWYHb8r8PboeInU<%Wwo!^T#{{H8EdmBIB39;SNi{JllZj2Y5aCF<- z*o4UA7fTENZu(@XxqNS!;LY#Fw(n*Z#sBBDam}( z!IDeDyC%xc{=9F-n;i#!8{R$Pcjn^q895*F(@T|S&$iq)ttOw8@+K{qD)U|8%!X-&D1HJMWa3m-m#Dne|~QcU&#so{ubR zi}(1(&GmZD?8k3UD{b0&|MdDQh2N!uH`jlj6YcSBwcLrinU~`tT)uVBDf55#G-=b$ z`pZe*i{7PQyStaCV&1!#CBIxA{Bro8xGnd&-)Ua9=7mds7_aefRA>6TQ|v~9fdt#! z602H)#=qXe-WdiGZ94aaA1(g7?c-tOq+XtVgVRFqLjBy_+xp*+vr0(^+lRhfq0q~r ztC0V&<=vW9tD{i{}e zJGL*zTE6)CIoZt_7Z-JI-MV$Bf7q^o`!m)Y+4$`0l`DI$-?x%*v+M0OHV@o*uD~U4 z_1YD+>n6lFJAYz0J}DqKHP>+Yqj?Gy{`aJ3PyU!QJLcxy^1b^%rboDm2LRGgg;h8@%g)*#n1aBIc$0Ux+gzgGgoTXB;A$W!L56qdpB(5 zE9hI17wEBQvd@y-(9oSeiMj3Dl0Th%mV9qd<-(hrg?Gl?aQwSy z<+Cg6K0iCl&HDSc>`u8a&vv~mm1k_xjXi(zl>X;l!*stz6W05SOG!yx^E~TUDsj?9 zDe>&g$upLmILGz=%*@F%ruZ#aE`Fw>rYh9QmwxBjvuB09y}iO=v$nh{J+Q>*^dYB* z0&PMDI4ky0?ufeq%!{*1W?tWw(@nM8 z`z6JH`DM?38ougZWOnqE8$QpvOPzBkZa=kHhoQ{VOnp0#=6S^8_~?+nFLFYZou9y!Lfkl)2T5#~pF; zv4Q19&cUC=nXY=Dy1lJuzUcc$GotQKsquW^9TMmCW%|>L9VTXK^`W7n-i#(Ds`tfz ztXO5VP1>P0`Bjjht+h(->hO>w_SqR;ahx)lt&v;zY5uf}DDzD{tNiar)4J_jYEQO{ ztqGCq{j*&K zE&a;=_3PKy-X|*AO(J6>!=JyJ_Deit#V(_5uFk=q>J@|qY}YT;ti0Eyy(TCuG<55R zeTJ1=9asyVGyJO*6D}}%ThzcRh+Qa!tBNn^C*xBN&cOVjx?7JEPEkWngF z+x&)4N^Ops%X8FRE@O;^_EBwxU<=l6oVkLK9`FrLGYr@`V z&z@ZSxh_@0=2)M$wdYi?DeeNcB8f>Jo^4D2p4W;K*z+N{aLd8p?v>hF>Skuk_!uYg zO`Ds&hUv|+MX$Ag2|utEO*1t+cV~_DTq)_vznRikShzn-*)B3eKV|>@P%ppGFFq}g z8?WwtZ>_a3Q)B*)`;ONYyie?uzQJ-)QpqYdA=>F?^t9)n0}J`e?U`mSf8?_@_jd0+ zfm*>E3pZ{oJe&0VJL~Oj^?A3ysr`0CFUn-#-C7#?+4{xgX^Yo)M%A<3<$vO@J9BCA3%0@%+wWCT^INx`K9sBe z>p!biK<$EMo8G;<=5w3(KvLt}J)6xLYpu)Aq+VQ}wJM2MY@!!~_q5(``B_;}&JSH$ z)mLdHFTWOc?cY^LKhY=tqM{$qhp2J~h{aX8=eoY#%;2~CDvwUth3W=>^|c#L&HPvK z@WZ8W1{rrQ)>l$&+*ju_-<+nJ>mC|@<*%deX|b#B*J8^*>j!SHnVWp_b7<)E{frZO z0~mFJE>;Wf-Mws+nmL2Dhs*7!Q)ZpoWqswWj#7f`t+`%(8{`_6hE1BVweCii_0nCN z)@|y(wW$9}$hEtHv4Xore|Sxt%cwKaw{d&T&P^FN*B$t#_38Gju3g=$wO&12@uF5^ z_wuymX7Bx`Upsm;{Z4=9|0^ML{#)ETwtML=1_Aduj=z`R{wp`_MAeFYMb{$Jw=!+f z%c^B{NL<`-<$Y5bj>;-~!K<>XwX^rj_aFa!Y_6uu-|siq zl+He|nWK8qpTf-QCzF32yRtO)*s&@x1-X7}ht*2|?5<@s)ohU2|M)S(OrK}k?|-H4 zR9clA&6wyo|I_a*?d<=r^m|=z2>p2f<>kk|AM2NTPp|8Y_Ay(uX#cj{-O6DXCjSo8 zUH;%-OJYHQIrpL2A1iE_1B@3xdmkEFI^BP^neJ?VyRy7D!Xf$WI*s+E#y@WVo4jSh zbVjF%S3h-f`MIa{U;DJpT6A8}4biFhw_8u_m!3T-T=0goSn2-na=I1YHy>KXA$z~t z`-*9u-}5fFD^UyyD~0#;H+Q*z{$9Q*#q(QiIgjj?_Z#-Nf3*~-v6150^+#qR@3XVB z#b=r2MwuDuZCWTE^e50^S!>=Zv+eCq`Rco7iL362{Ac^Wcl(^%YwODX_NC0Vb^Wok zW8U2>Q}$f^e|hE7osGBt&4^$5!m6^LRUm!lfjgpHQ|2xTh zx+dypPs}KsI8!6LsYY$p)C0NyHo7PY>h`;-HCB#r_00&t*N_~K6qT4sQUk2;M7t9)|WgX*B;ny zI`QsbbbjZ~^x)v4-#TwpPk46Co0sMF*X&ARUgP_{FTyQK>fUdz>0^z!CHbf+Z%Kni z&6E2(l-}9@TDEMNX@M>4F1tjLx1SEI-Lt2LSD*htLv8!sIpxy7-WoJaZ+ZLg&+->G z6K+_)-&^|a&CSl)&VD~)TpWJoFZR8#J>0#JR`Xd89Cw^*i?nwBY~yJ@fB3+cPZ^OqrG>A`yw^zUd|91&dD+?Q9G}{yi&jMZUViyy{q1dc zr-i=GnqnWNG~N2eJ+=H^?dK~uHw%|5KD_K8 zQ2K|ZGoP{A#PsYPjqV)n6C&{oe=UnV&b4WN+S;yJvu26EnmwtTb)8rWQ^viS^ZTv# zs2!55+r4z@+m)X(egwPrW#swYyVcgid(iQK^klWQzb-vG+I`sj_H>=Fr@v2Hp7cKa z?(l-XtNu1}@s}=4iD}wUtTi?2=6&I70k_*0iTPDH>_5Ex!sH8crhWRx*1DWUFRxr_ zzGBfPt<8U=*V_k7ly3aAChEUiCd1x4_R~b;0%nBW6Z*Mlq2|w(t74jp(qBJ%bNO!X z>yFP18`891xQ!TRKd5Epl$%s#Vo?x7EU#Buyp+8j9Rv`mxLO@~?{g65)v}I(QWCFSw+jbo*;5 z&+^!y12q>~rd~B~=w(@1eEhs!uXXc|H?Q;eSM1nmSjw~^dE4C0+S=LkopuUOocucd z`ui6Lt}QBRQr=aT@T1@5$(=IwPn}Bk0Z*o_TD5CGW5=mphZ_g0f+uJ@SZ}k^xhme^ ztor27_Jx_()S1E=zpveL$gBR{yYGSC@7TjW-I>sF{IR5trDSSR*v$Nu|ISX`+_yb< zckZt*FTMAuzWcV&%q}d&ddh=RkqU`abL}QGUC!oiZ6vk>rHfzJu*WIW3qm6QBKWKTr$|Bf2KKb*}ja@gIGJdvPEi8!_wOy=pXIoZj z=$jW6Huv6bi9El;BG`FL>5?y{6P%r#SRH(i{_JPeZ*j^h|98mfDyJut!tG;+wa#7H zv}v0-WJ&>R(6yw>B>F1MYe14 zec`F{m*@RGAb4~8GNWm1`H`<%%7P2CF1;*a5tzbtLHp6i3WN2b{xdjq1SWd#IdyaK z)M(cy{k4Yowr<@ze|yTUve3eP{f8TMXKpk7BN>$X^ymAGYqz8xR=6)Y$9a0cjCWb@ z(WL*Z1)GYNb#3O)t?5nv8+LT&t1Xe|S=#>JpW$&^PpfK*#_t@1)WgDmm_tLins>Kd zcl{D@@dMkUiP|A^Rtl^8{oA$b)gSXHquj}bCHaA`#S>TOetmW7M&h>I?UsFC`M+1o zzxs&Nv3SDSfQi4-5Z-pMVwamI_6EzYVg4ZW+G z6=~hE$=^HeC1Yf_)Ydh^e;@14+?Fg@*HKVnVe`)UeRWM=$GL^G-!Axf_SPQ~FzF z-Tus+Ia?=p**w{DT8&xI?(z+b*FK__n|2v((`U}uz?GVPgUdW}&wnXH@7`0VZY_7H zOO4#+?ti}YkY9G?j<6rZnjwD@mIxoaTU{CL;wLz9 z68pFAQ}H27ZmZsL2nY@RzNaIk&55-;@e8Nu%}usT)D1c|Ya2+qx9eIOuZelbq!m(n zB>x3_TExyh409H*y8EtFs!dN#{@RNN9uIg0cY3(&`np_lVGh5Is?zrE6SwYqNw;Zv z7iJ4>VOo1y*gHdF-W0~?%k_$)kgInNNwz8Wgxhai+?EvA z{Po4+{&&TKB*$6l~mH-=%3veI_u z^ZYB^+WtM!Uv=x@*7?^H_Wu2LJDqo)U7KT)vqD^!s#iyIyuw0mMuRk)vE&Vt=U-*J zmh|vFV5n!RW4^OIO5xPL^k1T%4>z5g{pJ1vo>19|b)~LU6-=}M` zC0L67ZuqmxGMbT{{mHv+xxaPY4C6XZ|KD@n{Xq5(#&fbACoEzPf3;1BPtgBlzjaf? z-@Vtvm5Q`KNQc%I9;jn9-}=TU!LMH8L}J&Yf0I`PU;RHVO49lM$LTHiS%Vt?UFS^E zF?r%1D$e}>OWgFzpDkq!-xgnPcxv^09m^k~A4_*6N^@R4x1{0kLa}$7)R(QA|LyUP z!@bKJim#rnN{~>L@c&-t61sWSuQ{vE1zoLeC~b(kvv*C+8*Up-rFyZ6w!a-)_cK|q zdUbN~g@~Wk(((-Mt6$AK7SU_db5P15-j18b|lg=__7+-7)*C`h@!R zA2J@43R;G`aM`y05xe0ND!lkc1f$HlRmY{1O|1;rR=ZUEjx}eT{gADE-%MpA&T`J5 zOFDFdkDoKHQ9iqT)$tXtvX@>vXi)LP`;co%sm7aaT|Eoy1Fq^6Y<~W#z-q#gufIRt zl%4TDReFa<=xy%>%MJzzU3&S2Z^ysBhC&(HqK*@@cC4)HKT-U{^NxDL;wOEI?XOa8W@O=HzB z_d5~ic3QTpG1m)D{LB`=I<=zhT*OJel%!3q&Q*Ko8}cYjXNs<{|3LaX#9ALvAp_h`XbN0 z2EvmcHykc>o*l>fu0!qXESu%w)%NeOfP+WUNx(yCT$XY zx2>&t_x35L!x{_2xxTCyd=W2tz2fehzj4_W_VdpjNr^A&P&4&jKJizj`Tpq(zt8EJ z-CggR;A(tWYT1fcbCos;l)D*SdmSfz-MH?(P-TPuvEJO6$>)}r{Ac*{>bU;*gf(*; zog3N<=AU}YCG%8v^|>QY?qvkc|9tCswS9cQnrVE&&rcha1KNLwd}h9LtMBO!e^!0A zZ6}M*Jw9N0;EIpWDfZ0yc_E3n%i0>0cN<0=mI$p4aN%S5=dir|Pu2lurA^tK-?oS` zna-T?#%cM%DyvynX2tQCOYX3o6|!IL?i?SVeT+HlZJYg=pQZ1p=({J(tk@YGMsx85&JBG_4e{ayO3x^~Ak^&Oj?85Vi|4OdgkXOez=Zqu>{YTHy4K9{Pg zbr%F@<~JEe{Ox;Qv~|{fKIR+SYPIva_zoMmg#Oo5`u$ih{aE$g`>gK-CdyZT>^j_= zzv$#SrdbRZm+YI>c`_*`ysLBOj5RX8ucntst=T8?tHN$pjGEu))R^Yh^0PHHjlXBE zzu2BF&GosS#i{trvfmsBPxIUJa@;Fnf86$+$9Uox$Jlc-cw)fw_ib3SAKV>{Jf5)};BZ%f9A_t~?g$bYHJd-HUk zl+K@sQ_G9yXGpQJC2w#un794+PRqOE-6zDBURd6qQc$~g-hyK1J*+!qEv|6)GRDl; zymLnILDg}7v44-h)jV`)`}fc!M*Y#r11W)_mtKD9EV=vH;>@zWc<<1B)BqE$O(kbXBX2NxSI9C0S}}_DApj z@vF34#kS;7fSQ{9k=QD`&e?Yl8aOPu{F3)&NvdIJv74|`k$LQVp}1wMo=@?bAH$`~ zS#5F5aEIm2Rf|1y-}wLC^YQq@XHSb7<}UX9yJr9T#1|^tv-)n9$j6>JaCgTy%V3vn zIw~~KC*0;|#IQv}l_BMN|l)F65&RiA~&t>fj-dppbe~O=KbK=hr(_5+^ zuKWG>dc*a8<0)*RXBk2*?`~as;b_7O%{2b(k|OK8M%MXzT~nqz9b!8ia8P1RV8<@$ z>AaSA4;!-fCQeD@x%T2|nL>onn+b_Ro027B=dkBI+uyVNw}xxzZPygDysaq(!p}mP z?X_#B9W>Z+W7}WDybsp#_OYf6406*zYXK6{A{Nhm{bCmT-w45(F*97*g zN^^N)^uTGoc2D%rACnHHOY$_kTg{D|d`_rL)_BeA!tB*Q*Wc&gm(?azD4RE<^L*jb zpd$$<4j(;`{qMB?=cz|oZ2G-Iz9tJ+Hl3UE&${D;+p1q-nqQ41J|%wJ!1KV0o85Ao zN|Xf8-3RT@)-=!lfBU)R?QQla>$?(Jio^>n1DZbGhdw zN))bmb-hG)^S;iGoOq9W2^yklo*5r@nl7(R@!Vn{(Urh6?cj5M2ZQ)uSDc#IoL3sK zon~lQrN=gpzvQig(qrzE(mc&Brg`)Jy={2g^LT~giR1(C?)^5%ySulYyIY!vxjXmv zd*O~sQ)3zfn+n%muROK+J>K|4-YW=`4LMtaSLr(?YB1O@ay1cVBYCCr@L@BEArQ6oRd1RtnnY~w%q!O|3waSJU=^Un_)zoV)Oo&bqWQw z3;r8C*mp2|`TrAFPF_9mis52p)eEEJcZ(jUGrwlc?g+9rTRL4_y139MPdHJB;gt5p zCD*>rKIHDHu~~6C!{f#I#aiWAX2O%51^m9Ltm`~?>E3%?wUj@P!q$maD9^f5A$W2- z%abtDvW(~#nWqwv~Ks!9np+GD<+?dIHa*b>~F>b z-Zr@c#Shv04U>4qKJ1Lpd6Ut3Vv<$av6m6A8UnUGsoCDJLhHSIdgeu$1TOjC!MxtP z?j4vJb<@wOr*O)&!p$Xi4&G~h3U$5({>X@ttXEyvU3C1+mIAIr%MSecw8T!(W?Jcq zj-$&N-kwUjKYMb^6#dNPXolR!%^A&gJR3CBW=C(BuJyi0`?>y+t+wB*9*Y&Zr`h-( zVAM6dx!7i<|I?qL_fKZ#HyB2=2_@YAw)(*8y6Pi(oUS{=W#@&qr!#KgTzz;m*Jq}r z``=StrfZ*0Yj+erJ2R1U|Mz1%yFaJAnKZ-Z8OQrYG3uwBXNKA3tekjvy5z><;M$qI z^?`j~zixh@vA;gi`t`5BQjgNPlQ$KqshyAfz*Vr6gFij$r~B*mDb1GFWbkotgC2B z#G2-!ef2(x^QT44oK$^ohpJ7p^i6@zwrQprJKD@T3?tft3Qga+JQRK)Y;Tgzxnaqa zC|<6@+|EB<)6%S8GpBZDpZ+v&-G@#Fj`)I^+r&gfW*t}inipii_iy)#D8Efk_pD+p z=C#amjuBU!*FX7F(EB>Y180RxZrqsi%il6RHK|Bv1FM6W8Oy!bMaPcrYMHTzFGu&( zJDu0X={(aCJ&cmRZ(w6uer9%J=11NP_IEtn_NqR(9antjk?N0X?`%eenrrM^?fRGf zh~3~krQJ$OEc=-cE-n9N|A3Daw&|VPE3yZ`YRwX1*{oTo<33bjj=C zUu}k4r>B`_Fuh-Gefyx$HTF2B>k%E7ej8{!ox4E0<@VL151#y8{^Wr8Be@vm^NGfX zjd(o&=zl(VU~}Vi&pTl={5N(7xo}BOZiD;ZZ{k;t6s3}~*T39S{X3FrzGeg8zJp9* zOaZF*FQ4SJe48p0$J-W^z!S!Q;)>T?u4u*;1z&$e{)(`(43wHSM}PhAbzFhnpBsu8 zru9*|^=;eTV0R%=dT1xlXzs z|M26{(l=Us_J zJ0H(C|Fjer$=V?3V72^~<&$$8ivDimX>(MZ>*wAu;l5bt*T`&~rRGoj9E-baKs^*#|_pznwdKd6KEQo!jxEzxI|0n9ve4qACRZBi6x zj3@}ROMd!s?woJ+>^|zv3)yGbu2DR2W68ax@1Ff`^v-(P(YWi}BwkDI8;*&7=Ege{ zIiC`?UR=6GOH{KT97?>$ablqyTD zlQ(aZyz9Zvd(C~-EJ%g%Z`tp}o(-!kn|)1I+P}NZP?#&ve*DX1tDnc>MOxpNt3P|1 zf8XH3)aY-g6Eq~#JTp$D>h3xwF4deWVIwjd*2qs=cs*y*Wiw+P zXU$BuyzkP-5+sXm>MsAA6{p#pD6k>-xBLP7KieXOq>5%rRs5g0>fi2^SrR;!63wYE z99+y6tiJr>v1-uKgcIHSRsPuK88Xi=_g>Jw@QcscO#3)4RUWqaP75vLH|BiwIs78| z{hV(N$4sSoY>(=2@;WvdujvoHy2C`GO{6a4Tt&iEhyUr@a%UIx1h#bKFvoh;*~Te_ z^0YPmFkYiv_;F_Qp9s+EJDb_R=hgkT#QsPjsXspsCdfP%^3hqD$dSY|jWH(u zVkz@m`xScWOis;-0*3S6u|1sb?B1_Z)3MI4ncHhYcj5%WiL#Bg zOtJY1dv5bOca&Jw%3cV3et`e%Pmv#6LcAos+)Dj+2Zqj_l#yicBwc1h(|rT)LxEi# zIX$y?-+%7>;F-|MWCI=Xx{PxXOkq4fZf$#e?b3=A36)hZe(`5-TeWSfmt=Ed<%j(n z+?nUI#IaBHQ9j(Dtn`|}p0}iyGbUK6l&9_KF&$2K^FG^1VmtgPiRYSz zv&%P?2?D%7*mmr3c_qPPd#GYpzmm%lCcU#S`&O^=yq6)dD#lyk>O{kc#ofV;xy)}_ z4@_0PbTr|G*zIlqS^k{NpRM{(!_g&-CGAI(;RWxpgkHH>FK308&0A#` z25Lv&d!WxLzjU?sVQ$q6M-3c0P6Qq}*|?4;AQ0>}wYh%(r7W)G|6XV*&nQ3DOY`sn zMWxqF;m=FdL%uc#y+}6rGQsn}tGdHFobConLQHuF|1SRhhqb&i!+^*7&xJVx0-Rs; zx8~kvImlQ4kN-#9g1@XEf`uRCNUZx|yk`C*F}V-%?NfY|o%bs!RWp}b-c?`y>bPpa z@q`!RXC@V}C@IZmDra8k@crqkU+qFGQw+XvA4}*pa7p34Gv|#q>#levE$_t>4_>I3 z@c%B@($T~Ij(r)+E_0@Be-~&C`PEL({DF%zQj0+nL>0z4Bgq@l?W#`ZGM)GnADCW8zn5TDIqe z)-GYulH_4-%il0>LH5`C`=>jIJM#-p+_=M^x!Cwf+=^A#r#q-NFO2tGetC0a^WSaq zvp(y6$XhwZ=!=ZtOpZT-HiG1_EnXa~_$WnN%R5q_q0cwMlpEo(Ifb zr3RMMkZ3kN^Py}0J=QhCFTx(^gzjAga&B|8ymy6?z#V9RchSU!3Q9#*d0mea7&~?H zPMq}xIaPjv>m|BpS@Z5Z|G28^{e$dO10K6$3A}|aDav~{yv&ZZFZAkh_Gta)#1#oi zob3!sLV^>68?HCRU-oqzk=Z-@=a*m3a=K-}6S2;>{Js69)&rR{?2GyZCKeu;xWjmr zt!9pc+>y27KVtOPD<3FyP~MQ1e@xOU9eJZ{it{(JoPw%YyA zxl7pAZJgDzn=$7Fo8U}_H@q@!vzKSp2!3QQ;Jx~}cE>%w1E~kr?UhYlqNF6vwApa# z0yma_Jga#k6fejNPW;f?KXz9P4psV#?9`0KG z_+9DTj-R(n4*p(VXlF2YovAtR;Te0(ujbePzAbfU_POJCc;u8escp!7uvPM1x@n@N z-+cZ*Y&%>-_rGf9OFdw@qc!Mwa@s!G3h&3lg}gss%{ZUtGVywXZp@B?=QV#TZ#cS~ zd+A>5<;x-QeDAU6d&1bwmi+jnCx4&eJHvKH?mhdA*2{$F|FFy3ajr_|{+V(o`E{mu zZV2w^SSQGI)Nb|*jbAx!s?%f3ZYn1q>-l*lpIbqFPJvU^_Pb@)N8j&xwQBVY`}(?j zj67`3i2{~Bq1HjMkq&>O^Y@l|O%w(RdL*pO`kFR7w=DJhBDUs(0Z}fYp35)K-m-1m zyZUecTH`)`(h^ltmAjtB$+JO9O7|J13g!yzUhEj^ zn{iIzk*Ke&sQH!@(HQ0EoaD+~tIkRC+-+lO++g^Bq07ee&w@g2%L7D=zjT#Y)mj&9 zxgV!y;vQ-ra`kcH|LCu`+)o%7tXQ>pRXDTs!>YV=?=_buIEB7H_BCz&;a*Xb9tEyr zLaSbFKH#@QQT6}V-R#bq&fizOGGA3Cw?Q>8qW_?CX!M?=Di`L!Vdl9sjZ`CHh z)YP}~-6u`WRM!`6s1u*#@MN+3%hZssvZ1y-=5cwBhBsZ55>+RkTp+k)&6=FlUk}~9 zmS3KDbF=X3FQqc`LG+4(txK={YzPaxX2-Z^($y3Hzg{xWO@9y1qb@1*CeN`S;`!&=tRXXIFz}7hSdyIFPmbk6?c6)j{PvM%W0XN;&UT|Ru zyy>yj_^|7%M^}z9dCoa8_q1_b*wafoQ5V-PC|dsD&ZIe$=fwD|3Ael(`t`ihCfyB= z`yTV2Jvo1hyK*>#u=K2;^&LfZ8c+6Qv_7?EXnZX_Ym%wo?l+08UwtR^Uz@+_q1pR= zzn_(9eG>7@nEvY3tLaV2W@f7EgDgBl{6f9gyC^@Fo;A6AtwrI~$2qt2vNL?{wH5f3 zrus0vnw=)Ad*bb)qKMGY+>47gytxsovvqItaztOdwES;mozg^( zeo66LcR8c;Tc)>(JC?;y{BU1OTigDvRnwlB(8%hZ`xzNte?1fb|N8Yy^T76&+uJ!` z&ba>fGic%0md-la)g7X9TNqk4{gQ6E9}*f?`{p}n(essCaz7VZSZ&-J`>yY3(tlqS zp~uJjbZ_%tlx3~lw$ZS3g~yNlRd07&Bv$T!wr7_3-t70R0imMRYZhvLZQ43T>W)R^ zeD}h`w;Sx9l!RYhvr6xA^VA%_yw0M<2iO-Cu`F7@^2O8cQ@8fBSqeL}um%2&%*}oK z{J_rz(SLsL-Cnm+>3W0NGpW@KsajQitLE|8v=u!Gzh5^oI%do94ujq~TQ1yMr_Yoe zbzAxO_tHN>3s-#({i?t8TC&EXRqt26dhfN?U5}S{b6I}5()yJz-iLfyx5n*WR)(J( zPe54Mwx$(dBUbpO1#a~w}Jia~mx7F=!{@>&O z#mKUdGToJskVR7npXlUtq<~8=Ii{l@s8Sao!xiTqp zerQU?#tGb6TCbm3Dq7xsd+G2m$G5&mCvI<&ooDzrCh>Ni#QlU9(?IqdoHV~A* zeYfZbMXmjwDngA5s@FQL*z#bvgY~NA<+7gpgYR3s{?fMWiXW(u^ z*JO;%KGkbgO<>Cs+i9>MjRc}n}{&y1j?xpv)}+_`A zmR24!l=yXO(KXlGOs`j-c)xn}>v=2J{ky8Y>JIm=TQdq5o>QN5DEq4D#%OKrWc`lU z+B?h61o+`9oyK<%GuJ~V(SpK(b{u)$&TT?2?C-mjxtW!65KUUPN zbUm`|h~+(7$L&S+E%BevM{cTk*?VBO(iO(-;h|S!-^pi3-}$C?fp1r!qU;~rHT93g zTt2)kRh4Pf7tP4-Ucn7)v}F75fKoxFNl@#j&Mv>~EU&ju zbE}>&?+I#YYXn`sVzSv!XJyzE_GzXc=N0^Z zv|dI>=JZYNi5_RVk3a4{wfLcxf=)|$(5?8ggm-%?KX0r4-Mrmgs5DFG_^;&9&|LSY z*C#AC7Ah7tKIW!m9Kz`R|4E(29#w~*J5D_8?cIFOIVFpKOC9gTwN0|1eJsiw%qEpT zOEvgn9r@(0Ktq)E&swJ2%qhC}z9dU6nZ0~}m(I$SD=YQi8=ek2crZwoKj5C!z3!(m znVP>O^J1C8`PFxGcn3`Ev*PFVT{)xGE+A5Jw*IMQ9_ec~KEGDN{Z8#yji9CeM2|DQ z#~(|+|MBBfMvCaxC*229x3ltnkp8<*C1z8~OIwX{EvvH!tAr;$W?ebguJ+d?&0w>i z=BH*aDsrkc`Q+++*!7)q_*0Yo*c!$cVgKviuQhhvoZWGXQ|nxL^JDEzb(P*vyhB$B z)_Tr4Vam{Vbgl#2Q$Ep3u_vpZUXOau{x)etRFqgAo5zhyi~J>c+x{tq2}UpYFs19? zihYKbix+BE@)b-u5TC7`RXz8!{fQX`uk9PkL@ie?wEQVNK`LSAw5~E)PoOyopyel_mSZxCBm&jNYyXUP$qH4nOW6vVf%}q?!1jzB8XDZ9$e?5`Icfso3 zPB*{L$NSxsrI{j5y>2aeQQj=te|+w%RW~m7ozPoU)RIxLb=9g{(g*LZ*XrK#cGZiC zi;AYCdUmgP7Z@s9&9gxDa#?Gaaj5R=nV$;E_H`MXs?6f+lb^Ko_$mwb&QtwIJKqF` zhHe$OV_)W7c{@eaHpXPnwu~29qUl*0TfSs6%(+k^^W31JNb`SxmvQLkg|F}OFMOlb z`c+yg?d`L8_3jXc?`LKNey^*qcVlx_)Zvv^K6P5jgjt;XS4?$F=9l1<6JK6_T<n^lx2AI@rRP=bBhZry3R4zEhxwWubf|H!rZqiX4R!S zofAAdwyW~0?z-!C-+sqpC$Q9LqQ?~Gl+bd)AO5MSZ!fo&e7JmCrfoL!?dRg#a{uo% zmp|d~@Mq#&JGD#O9y$DQH8oSq7Uf&BuIug9J9F+>z5Xy^^3>ct%UjtFF9?c{-=CD7 zogHl>7jGi)SY4>|<79RJysf#r*Q!4^HCdLXoD&-x`TMWKb`w+6we#K|j8dAYp{=hk ze|zrqzjt;PA5V!A+o!1|9uj&r?)~@YY1tpl?}i`fb^IJTuZgRvCt&Qoo zd+>DWDy^{i`*Wf;ugrYL#&<1FLtQdCRYSD4cF}d&y=E<0u^lP#EAr><^!Gjbb6@{_ zu}@4N=KU&<7O3!i{r?<8rDDdKPZzcQzXt^bhknn#lXa50^;*c4c~AGww{Ey@DAA^S z_3G98%hHzDrEHDfxlW|kX`=q2uxLZ}hy)2q&>l^b6>|fBYkkP7?~9BT{GHqA>@U#q z+XTFCGcxD)KCTxPkM6(s=j3H;PF!FB7M8Br-j*9_rWwC*!Ts|&x3~Ruvzq%)@WW@O zP4Tz4)do3yV|dWRw8=a7ww;#3ZvKKY#iO~m?MxJQ8^=0#7tMTTzt4C1<=c!Ol{Ts0 z+V;0seYauWq3udpH|AGvdj0TOg#M9|+uQDcO$k4IHaxUL>-M($UsBW=%|#~q-q`kc zk-9bCj-?$rr?$QAW4KXb6?;Z=+s$onmoslF53;!ZCUje_z08EYauFLF-jr_3{jaDn zn~m#8bJ6bH+uPYw^bhLlP3+&DdwZXy!fl7^>h~SxHs$`l&Uka?j+M(ke-yvHO`rS3 zHKtar#rCPUzrAUA!;{d@v`PQQw%SC8ZzT^7Fm2+_xou~!@VoedJ8R1Qt+~}z4&Njm z%wXCie{0*{(+zJP9yrf+;@Q2^N8kNEx-C~;eu8e9{_}g^cQdnoPXD>k@^hiF+7I2rncs# z=yUApFH?@5zu4dK=7Y(XJo6YjQxq>%6E#I!~ zI`M2-+N~`eZ=@~X_I5-45Ho)@Xs=}L|G7$=(mXQ^B-;3oB}nqLB_96I{8DYAvGc7t S6Brm67(8A5T-G@yGywo+U3BXJ diff --git a/akka-docs/rst/images/stage_map.png b/akka-docs/rst/images/stage_map.png deleted file mode 100644 index 8d04b1be44599f171e2fb020734e13a6f8ace679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12562 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 P7#KWV{an^LB{Ts5vn1Lm diff --git a/akka-docs/rst/images/stage_msc_absorb_1.png b/akka-docs/rst/images/stage_msc_absorb_1.png deleted file mode 100644 index 7b0aa27db687f617c4312bb8c60b96c024ab111a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37948 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 Wue)DkBp4VN7(8A5T-G@yGywpP_&wzS diff --git a/akka-docs/rst/images/stage_msc_buffer.png b/akka-docs/rst/images/stage_msc_buffer.png deleted file mode 100644 index f6507381fb1f3a0aa663f1d19b4a2bc98fc07376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58128 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 diff --git a/akka-docs/rst/images/stage_msc_general.png b/akka-docs/rst/images/stage_msc_general.png deleted file mode 100644 index 583fb9131879d5d14b656cecf56df5c465ee4df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44337 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 oskuD0slI&4FSHpBocu0+zopr056k-)c^nh diff --git a/akka-docs/rst/images/stages.svg b/akka-docs/rst/images/stages.svg deleted file mode 100644 index cbc02c63ff..0000000000 --- a/akka-docs/rst/images/stages.svg +++ /dev/null @@ -1,1124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - onPush(in,ctx) - onPull(ctx) - ctx.pull() - ctx.push(out) - PushPullStage - - - - Sink - - Source - - - - - - - - - - - - - - - - onPush(in,ctx) - onPull(ctx) - ctx.pull() - ctx.push(out) - Map - - f(in) - - - - - - - - onPush(in,ctx) - onPull(ctx) - ctx.pull() - ctx.push(out) - Filter - - if p(in) - if !p(in) - - - - - - - - onPush(in,ctx) - onPull(ctx) - ctx.pull() - ctx.push(out) - Duplicator - - in - if oneLeft - if !oneLeft - - - Source - - - - - - - - - - - - - onPush(in,ctx) - onPull(ctx) - ctx.pull() - ctx.push(out) - Map - - f(in) - - - - - - - - onPush(in,ctx) - onPull(ctx) - ctx.pull() - ctx.push(out) - Duplicator - - in - if oneLeft - if !oneLeft - - - - - - - - onPush(in,ctx) - onPull(ctx) - ctx.pull() - ctx.push(out) - Filter - - if p(in) - if !p(in) - - - - Sink - - diff --git a/akka-docs/rst/images/stages_sequence_charts.svg b/akka-docs/rst/images/stages_sequence_charts.svg deleted file mode 100644 index 39e2037214..0000000000 --- a/akka-docs/rst/images/stages_sequence_charts.svg +++ /dev/null @@ -1,2310 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - ctx.pull() - onPull() - ctx.pull() - onPull() - ctx.pull() - onPull() - ctx.pull() - onPull() - ctx.pull() - onPull() - ctx.pull() - onPull() - ctx.pull() - onPull() - onPush() - ctx.push() - onPush() - ctx.push() - onPush() - ctx.push() - onPush() - ctx.push() - onPush() - ctx.push() - ... - ... - ... - ... - Source - Filter - Doubler - Sink - - - - - - - - onPull() - ctx.pull() - onPull() - ctx.pull() - onPull() - onUpstreamFinished() - ctx.finish() - ... - ... - - ctx.absorbTermination() - onPull() - - - - - ctx.pull() - onPull() - ctx.pull() - onPull() - onPush() - ctx.push() - onPush() - ctx.push() - Restoring token - - - - - - - - onPull() - ctx.pull() - onPull() - ctx.pull() - onPull() - onUpstreamFinished() - ctx.finish() - ... - ... - ctx.absorbTermination() - - - - ctx.pull() - onPull() - ctx.pull() - onPull() - onPush() - ctx.push() - - onPush() - ctx.push() - - onPush() - ctx.push() - - ctx.push() - - onPull() - - - - - - - ctx.pull() - onPull() - onPull() - onPush() - ctx.push() - ... - ... - ... - ctx.holdDownstream() - - - ctx.pushAndPull() - - onPush() - ctx.push() - - ctx.pull() - onPull() - - ctx.pull() - onPull() - - onPush() - ctx.push() - - onPush() - ctx.push() - - ctx.pull() - onPull() - - onPush() - ctx.push() - ctx.holdUpstream() - - ctx.pull() - onPull() - - - ctx.pushAndPull() - - (initialization) - 0 - 1 - - 0 - 1 - 0 - 1 - 2 - 1 - Buffer size - Buffer(capacity 2) - - diff --git a/akka-docs/rst/java/code/docs/AbstractJavaTest.scala b/akka-docs/rst/java/code/docs/AbstractJavaTest.scala new file mode 100644 index 0000000000..26c760c426 --- /dev/null +++ b/akka-docs/rst/java/code/docs/AbstractJavaTest.scala @@ -0,0 +1,13 @@ +/* + * Copyright (C) 2016 Typesafe Inc. + */ +package docs + +import org.scalatest.junit.JUnitSuite + +/** + * Base class for all runnable example tests written in Java + */ +abstract class AbstractJavaTest extends JUnitSuite { + +} diff --git a/akka-docs/rst/java/code/docs/actor/ActorDocTest.java b/akka-docs/rst/java/code/docs/actor/ActorDocTest.java index 016e90f31b..469de97077 100644 --- a/akka-docs/rst/java/code/docs/actor/ActorDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/ActorDocTest.java @@ -11,6 +11,8 @@ import akka.testkit.EventFilter; import akka.testkit.TestEvent; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; +import docs.AbstractJavaTest; +import org.scalatest.junit.JUnitSuite; import scala.PartialFunction; import scala.runtime.BoxedUnit; import static docs.actor.Messages.Swap.Swap; @@ -44,7 +46,7 @@ import scala.concurrent.Future; import static akka.pattern.Patterns.gracefulStop; //#import-graceFulStop -public class ActorDocTest { +public class ActorDocTest extends AbstractJavaTest { public static Config config = ConfigFactory.parseString( "akka {\n" + @@ -323,7 +325,7 @@ public class ActorDocTest { //#system-actorOf // ActorSystem is a heavy object: create only one per application final ActorSystem system = ActorSystem.create("MySystem", config); - final ActorRef myActor = system.actorOf(Props.create(MyActor.class), "myactor"); + final ActorRef myActor = system.actorOf(Props.create(FirstActor.class), "myactor"); //#system-actorOf try { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/actor/FSMDocTest.java b/akka-docs/rst/java/code/docs/actor/FSMDocTest.java index a624962591..ab74c21232 100644 --- a/akka-docs/rst/java/code/docs/actor/FSMDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/FSMDocTest.java @@ -20,8 +20,9 @@ import akka.actor.Props; import akka.testkit.JavaTestKit; import akka.testkit.TestProbe; import akka.testkit.AkkaSpec; +import docs.AbstractJavaTest; -public class FSMDocTest { +public class FSMDocTest extends AbstractJavaTest { static //#data diff --git a/akka-docs/rst/java/code/docs/actor/FaultHandlingTest.java b/akka-docs/rst/java/code/docs/actor/FaultHandlingTest.java index e879d3e85e..c66dcce8a5 100644 --- a/akka-docs/rst/java/code/docs/actor/FaultHandlingTest.java +++ b/akka-docs/rst/java/code/docs/actor/FaultHandlingTest.java @@ -16,6 +16,7 @@ import akka.actor.OneForOneStrategy; import akka.actor.Props; import akka.actor.Terminated; import akka.actor.UntypedActor; +import docs.AbstractJavaTest; import scala.collection.immutable.Seq; import scala.concurrent.Await; import static akka.pattern.Patterns.ask; @@ -37,7 +38,7 @@ import org.junit.BeforeClass; import org.junit.AfterClass; //#testkit -public class FaultHandlingTest { +public class FaultHandlingTest extends AbstractJavaTest { //#testkit static //#supervisor diff --git a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestJava8.java b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestJava8.java index d1f653854a..5b5795a056 100644 --- a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestJava8.java +++ b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestJava8.java @@ -14,6 +14,7 @@ import akka.japi.pf.DeciderBuilder; import akka.japi.pf.ReceiveBuilder; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; +import org.scalatest.junit.JUnitSuite; import scala.PartialFunction; import scala.concurrent.Await; import static akka.pattern.Patterns.ask; @@ -35,7 +36,7 @@ import org.junit.AfterClass; import scala.runtime.BoxedUnit; //#testkit -public class FaultHandlingTestJava8 { +public class FaultHandlingTestJava8 extends JUnitSuite { //#testkit public static Config config = ConfigFactory.parseString( diff --git a/akka-docs/rst/java/code/docs/actor/InboxDocTest.java b/akka-docs/rst/java/code/docs/actor/InboxDocTest.java index 6bfcaf1d57..23ca52d77b 100644 --- a/akka-docs/rst/java/code/docs/actor/InboxDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/InboxDocTest.java @@ -7,6 +7,7 @@ package docs.actor; import java.util.concurrent.TimeUnit; import akka.testkit.AkkaJUnitActorSystemResource; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; @@ -19,7 +20,7 @@ import akka.actor.Terminated; import akka.testkit.AkkaSpec; import akka.testkit.JavaTestKit; -public class InboxDocTest { +public class InboxDocTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/actor/InitializationDocSpecJava.java b/akka-docs/rst/java/code/docs/actor/InitializationDocSpecJava.java index 424df81f11..c9fef8c03d 100644 --- a/akka-docs/rst/java/code/docs/actor/InitializationDocSpecJava.java +++ b/akka-docs/rst/java/code/docs/actor/InitializationDocSpecJava.java @@ -7,11 +7,12 @@ import akka.actor.*; import akka.japi.Procedure; import akka.testkit.AkkaJUnitActorSystemResource; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; import scala.Option; -public class InitializationDocSpecJava { +public class InitializationDocSpecJava extends AbstractJavaTest { static public class PreStartInitExample extends UntypedActor { diff --git a/akka-docs/rst/java/code/docs/actor/InitializationDocTest.java b/akka-docs/rst/java/code/docs/actor/InitializationDocTest.java index fb3343a2e7..dab8144288 100644 --- a/akka-docs/rst/java/code/docs/actor/InitializationDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/InitializationDocTest.java @@ -7,6 +7,7 @@ package docs.actor; import akka.actor.*; import akka.japi.pf.ReceiveBuilder; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -17,7 +18,7 @@ import scala.concurrent.Await; import java.util.concurrent.TimeUnit; -public class InitializationDocTest { +public class InitializationDocTest extends AbstractJavaTest { static ActorSystem system = null; diff --git a/akka-docs/rst/java/code/docs/actor/SampleActorTest.java b/akka-docs/rst/java/code/docs/actor/SampleActorTest.java index d1ea16a1a6..f068390775 100644 --- a/akka-docs/rst/java/code/docs/actor/SampleActorTest.java +++ b/akka-docs/rst/java/code/docs/actor/SampleActorTest.java @@ -8,13 +8,14 @@ import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; -public class SampleActorTest { +public class SampleActorTest extends AbstractJavaTest { static ActorSystem system; diff --git a/akka-docs/rst/java/code/docs/actor/SchedulerDocTest.java b/akka-docs/rst/java/code/docs/actor/SchedulerDocTest.java index 5cdad7acec..b58a9aa1d4 100644 --- a/akka-docs/rst/java/code/docs/actor/SchedulerDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/SchedulerDocTest.java @@ -5,6 +5,7 @@ package docs.actor; //#imports1 import akka.actor.Props; +import docs.AbstractJavaTest; import scala.concurrent.duration.Duration; import java.util.concurrent.TimeUnit; //#imports1 @@ -20,7 +21,7 @@ import akka.testkit.AkkaSpec; import akka.testkit.AkkaJUnitActorSystemResource; import org.junit.*; -public class SchedulerDocTest { +public class SchedulerDocTest extends AbstractJavaTest { @Rule public AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/actor/TypedActorDocTest.java b/akka-docs/rst/java/code/docs/actor/TypedActorDocTest.java index 541de57881..62e048a306 100644 --- a/akka-docs/rst/java/code/docs/actor/TypedActorDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/TypedActorDocTest.java @@ -10,6 +10,7 @@ import akka.actor.*; import akka.japi.*; import akka.dispatch.Futures; +import docs.AbstractJavaTest; import scala.concurrent.Await; import scala.concurrent.Future; import scala.concurrent.duration.Duration; @@ -25,7 +26,7 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; //#imports -public class TypedActorDocTest { +public class TypedActorDocTest extends AbstractJavaTest { Object someReference = null; ActorSystem system = null; diff --git a/akka-docs/rst/java/code/docs/actor/UntypedActorDocTest.java b/akka-docs/rst/java/code/docs/actor/UntypedActorDocTest.java index 0d83ce0988..c03661213d 100644 --- a/akka-docs/rst/java/code/docs/actor/UntypedActorDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/UntypedActorDocTest.java @@ -18,6 +18,7 @@ import java.util.concurrent.TimeUnit; import akka.testkit.AkkaJUnitActorSystemResource; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; @@ -83,7 +84,7 @@ import akka.testkit.JavaTestKit; import akka.util.Timeout; //#import-ask -public class UntypedActorDocTest { +public class UntypedActorDocTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/actor/fsm/BuncherTest.java b/akka-docs/rst/java/code/docs/actor/fsm/BuncherTest.java index 678b7b8bab..8c7947c4db 100644 --- a/akka-docs/rst/java/code/docs/actor/fsm/BuncherTest.java +++ b/akka-docs/rst/java/code/docs/actor/fsm/BuncherTest.java @@ -8,6 +8,7 @@ import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -20,7 +21,7 @@ import static docs.actor.fsm.Events.SetTarget; import static docs.actor.fsm.Events.Flush.Flush; //#test-code -public class BuncherTest { +public class BuncherTest extends AbstractJavaTest { static ActorSystem system; diff --git a/akka-docs/rst/java/code/docs/actor/fsm/FSMDocTest.java b/akka-docs/rst/java/code/docs/actor/fsm/FSMDocTest.java index 155d0c02c1..3d8a42b805 100644 --- a/akka-docs/rst/java/code/docs/actor/fsm/FSMDocTest.java +++ b/akka-docs/rst/java/code/docs/actor/fsm/FSMDocTest.java @@ -6,6 +6,7 @@ package docs.actor.fsm; import akka.actor.*; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.hamcrest.CoreMatchers; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -18,7 +19,7 @@ import static docs.actor.fsm.FSMDocTest.StateType.*; import static docs.actor.fsm.FSMDocTest.Messages.*; import static java.util.concurrent.TimeUnit.*; -public class FSMDocTest { +public class FSMDocTest extends AbstractJavaTest { static ActorSystem system; @BeforeClass diff --git a/akka-docs/rst/java/code/docs/actorlambda/ActorDocTest.java b/akka-docs/rst/java/code/docs/actorlambda/ActorDocTest.java index 242c5d56d8..1501a5c7b0 100644 --- a/akka-docs/rst/java/code/docs/actorlambda/ActorDocTest.java +++ b/akka-docs/rst/java/code/docs/actorlambda/ActorDocTest.java @@ -11,6 +11,7 @@ import akka.testkit.EventFilter; import akka.testkit.TestEvent; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; +import docs.AbstractJavaTest; import scala.PartialFunction; import scala.runtime.BoxedUnit; import static docs.actorlambda.Messages.Swap.Swap; @@ -45,7 +46,7 @@ import scala.concurrent.Future; import static akka.pattern.Patterns.gracefulStop; //#import-graceFulStop -public class ActorDocTest { +public class ActorDocTest extends AbstractJavaTest { public static Config config = ConfigFactory.parseString( "akka {\n" + diff --git a/akka-docs/rst/java/code/docs/actorlambda/FaultHandlingTest.java b/akka-docs/rst/java/code/docs/actorlambda/FaultHandlingTest.java index 579c0a61d7..a9eb90fb38 100644 --- a/akka-docs/rst/java/code/docs/actorlambda/FaultHandlingTest.java +++ b/akka-docs/rst/java/code/docs/actorlambda/FaultHandlingTest.java @@ -14,6 +14,7 @@ import akka.japi.pf.DeciderBuilder; import akka.japi.pf.ReceiveBuilder; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; +import docs.AbstractJavaTest; import scala.PartialFunction; import scala.concurrent.Await; import static akka.pattern.Patterns.ask; @@ -35,7 +36,7 @@ import org.junit.AfterClass; import scala.runtime.BoxedUnit; //#testkit -public class FaultHandlingTest { +public class FaultHandlingTest extends AbstractJavaTest { //#testkit public static Config config = ConfigFactory.parseString( diff --git a/akka-docs/rst/java/code/docs/actorlambda/InitializationDocTest.java b/akka-docs/rst/java/code/docs/actorlambda/InitializationDocTest.java index 236cd0bb42..ec0997352e 100644 --- a/akka-docs/rst/java/code/docs/actorlambda/InitializationDocTest.java +++ b/akka-docs/rst/java/code/docs/actorlambda/InitializationDocTest.java @@ -10,6 +10,7 @@ import akka.actor.Props; import akka.japi.pf.FI; import akka.japi.pf.ReceiveBuilder; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -18,7 +19,7 @@ import scala.concurrent.duration.Duration; import java.util.concurrent.TimeUnit; -public class InitializationDocTest { +public class InitializationDocTest extends AbstractJavaTest { static ActorSystem system = null; diff --git a/akka-docs/rst/java/code/docs/actorlambda/SampleActorTest.java b/akka-docs/rst/java/code/docs/actorlambda/SampleActorTest.java index 141225570f..8bb74332a1 100644 --- a/akka-docs/rst/java/code/docs/actorlambda/SampleActorTest.java +++ b/akka-docs/rst/java/code/docs/actorlambda/SampleActorTest.java @@ -8,13 +8,14 @@ import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; -public class SampleActorTest { +public class SampleActorTest extends AbstractJavaTest { static ActorSystem system; diff --git a/akka-docs/rst/java/code/docs/actorlambda/fsm/BuncherTest.java b/akka-docs/rst/java/code/docs/actorlambda/fsm/BuncherTest.java index fe52e96796..d1c83dbd6c 100644 --- a/akka-docs/rst/java/code/docs/actorlambda/fsm/BuncherTest.java +++ b/akka-docs/rst/java/code/docs/actorlambda/fsm/BuncherTest.java @@ -8,6 +8,7 @@ import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -20,7 +21,7 @@ import static docs.actorlambda.fsm.Events.SetTarget; import static docs.actorlambda.fsm.Events.Flush.Flush; //#test-code -public class BuncherTest { +public class BuncherTest extends AbstractJavaTest { static ActorSystem system; diff --git a/akka-docs/rst/java/code/docs/actorlambda/fsm/FSMDocTest.java b/akka-docs/rst/java/code/docs/actorlambda/fsm/FSMDocTest.java index 8e5636198c..068ed7c9cb 100644 --- a/akka-docs/rst/java/code/docs/actorlambda/fsm/FSMDocTest.java +++ b/akka-docs/rst/java/code/docs/actorlambda/fsm/FSMDocTest.java @@ -6,6 +6,7 @@ package docs.actorlambda.fsm; import akka.actor.*; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.hamcrest.CoreMatchers; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -18,7 +19,7 @@ import static docs.actorlambda.fsm.FSMDocTest.StateType.*; import static docs.actorlambda.fsm.FSMDocTest.Messages.*; import static java.util.concurrent.TimeUnit.*; -public class FSMDocTest { +public class FSMDocTest extends AbstractJavaTest { static ActorSystem system; @BeforeClass diff --git a/akka-docs/rst/java/code/docs/camel/ActivationTestBase.java b/akka-docs/rst/java/code/docs/camel/ActivationTestBase.java index 405aa09a63..9e7b883d93 100644 --- a/akka-docs/rst/java/code/docs/camel/ActivationTestBase.java +++ b/akka-docs/rst/java/code/docs/camel/ActivationTestBase.java @@ -9,6 +9,7 @@ package docs.camel; import akka.testkit.JavaTestKit; import akka.testkit.TestKit; import akka.util.Timeout; + import docs.AbstractJavaTest; import scala.concurrent.Future; import scala.concurrent.duration.Duration; import static java.util.concurrent.TimeUnit.SECONDS; @@ -16,7 +17,7 @@ package docs.camel; import org.junit.Test; -public class ActivationTestBase { +public class ActivationTestBase extends AbstractJavaTest { @SuppressWarnings("unused") @Test diff --git a/akka-docs/rst/java/code/docs/camel/CamelExtensionTest.java b/akka-docs/rst/java/code/docs/camel/CamelExtensionTest.java index 21b48740a9..8cb3388cae 100644 --- a/akka-docs/rst/java/code/docs/camel/CamelExtensionTest.java +++ b/akka-docs/rst/java/code/docs/camel/CamelExtensionTest.java @@ -4,11 +4,12 @@ import akka.actor.ActorSystem; import akka.camel.Camel; import akka.camel.CamelExtension; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.junit.Test; -public class CamelExtensionTest { +public class CamelExtensionTest extends AbstractJavaTest { @Test public void getCamelExtension() { //#CamelExtension diff --git a/akka-docs/rst/java/code/docs/cluster/ClusterDocTest.java b/akka-docs/rst/java/code/docs/cluster/ClusterDocTest.java index b74c8eb127..1bcdcf5ea3 100644 --- a/akka-docs/rst/java/code/docs/cluster/ClusterDocTest.java +++ b/akka-docs/rst/java/code/docs/cluster/ClusterDocTest.java @@ -4,6 +4,7 @@ package docs.cluster; import com.typesafe.config.ConfigFactory; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -13,7 +14,7 @@ import akka.cluster.Cluster; import akka.testkit.JavaTestKit; -public class ClusterDocTest { +public class ClusterDocTest extends AbstractJavaTest { static ActorSystem system; diff --git a/akka-docs/rst/java/code/docs/ddata/DistributedDataDocTest.java b/akka-docs/rst/java/code/docs/ddata/DistributedDataDocTest.java index f69c4312f5..62bcbd5239 100644 --- a/akka-docs/rst/java/code/docs/ddata/DistributedDataDocTest.java +++ b/akka-docs/rst/java/code/docs/ddata/DistributedDataDocTest.java @@ -8,7 +8,10 @@ import java.util.Arrays; import java.util.Set; import java.math.BigInteger; import java.util.Optional; + +import akka.actor.*; import com.typesafe.config.ConfigFactory; +import docs.AbstractJavaTest; import scala.concurrent.duration.Duration; import scala.runtime.BoxedUnit; import static java.util.concurrent.TimeUnit.SECONDS; @@ -20,9 +23,6 @@ import org.junit.BeforeClass; import scala.concurrent.duration.FiniteDuration; import java.util.concurrent.ThreadLocalRandom; -import akka.actor.Actor; -import akka.actor.ActorLogging; -import akka.actor.ActorSystem; import akka.cluster.Cluster; import akka.cluster.ddata.*; import akka.japi.pf.ReceiveBuilder; @@ -33,26 +33,16 @@ import akka.testkit.AkkaSpec; import akka.testkit.ImplicitSender; import akka.testkit.JavaTestKit; import akka.testkit.TestProbe; -import akka.actor.ActorRef; import akka.serialization.SerializationExtension; -public class DistributedDataDocTest { +public class DistributedDataDocTest extends AbstractJavaTest { static ActorSystem system; void receive(PartialFunction pf) { } - - JavaTestKit probe = new JavaTestKit(system); - - ActorRef self() { - return probe.getRef(); - } - - ActorRef sender() { - return probe.getRef(); - } - + + @BeforeClass public static void setup() { system = ActorSystem.create("DistributedDataDocTest", @@ -67,180 +57,189 @@ public class DistributedDataDocTest { @Test public void demonstrateUpdate() { - probe = new JavaTestKit(system); + new JavaTestKit(system) { + { + //#update + final Cluster node = Cluster.get(system); + final ActorRef replicator = DistributedData.get(system).replicator(); - //#update - final Cluster node = Cluster.get(system); - final ActorRef replicator = DistributedData.get(system).replicator(); + final Key counter1Key = PNCounterKey.create("counter1"); + final Key> set1Key = GSetKey.create("set1"); + final Key> set2Key = ORSetKey.create("set2"); + final Key activeFlagKey = FlagKey.create("active"); - final Key counter1Key = PNCounterKey.create("counter1"); - final Key> set1Key = GSetKey.create("set1"); - final Key> set2Key = ORSetKey.create("set2"); - final Key activeFlagKey = FlagKey.create("active"); - - replicator.tell(new Replicator.Update(counter1Key, PNCounter.create(), - Replicator.writeLocal(), curr -> curr.increment(node, 1)), self()); + replicator.tell(new Replicator.Update(counter1Key, PNCounter.create(), + Replicator.writeLocal(), curr -> curr.increment(node, 1)), getTestActor()); - final WriteConsistency writeTo3 = new WriteTo(3, Duration.create(1, SECONDS)); - replicator.tell(new Replicator.Update>(set1Key, GSet.create(), - writeTo3, curr -> curr.add("hello")), self()); + final WriteConsistency writeTo3 = new WriteTo(3, Duration.create(1, SECONDS)); + replicator.tell(new Replicator.Update>(set1Key, GSet.create(), + writeTo3, curr -> curr.add("hello")), getTestActor()); - final WriteConsistency writeMajority = - new WriteMajority(Duration.create(5, SECONDS)); - replicator.tell(new Replicator.Update>(set2Key, ORSet.create(), - writeMajority, curr -> curr.add(node, "hello")), self()); + final WriteConsistency writeMajority = + new WriteMajority(Duration.create(5, SECONDS)); + replicator.tell(new Replicator.Update>(set2Key, ORSet.create(), + writeMajority, curr -> curr.add(node, "hello")), getTestActor()); - final WriteConsistency writeAll = new WriteAll(Duration.create(5, SECONDS)); - replicator.tell(new Replicator.Update(activeFlagKey, Flag.create(), - writeAll, curr -> curr.switchOn()), self()); - //#update + final WriteConsistency writeAll = new WriteAll(Duration.create(5, SECONDS)); + replicator.tell(new Replicator.Update(activeFlagKey, Flag.create(), + writeAll, curr -> curr.switchOn()), getTestActor()); + //#update - probe.expectMsgClass(UpdateSuccess.class); - //#update-response1 - receive(ReceiveBuilder. - match(UpdateSuccess.class, a -> a.key().equals(counter1Key), a -> { - // ok - }).build()); - //#update-response1 + expectMsgClass(UpdateSuccess.class); + //#update-response1 + receive(ReceiveBuilder. + match(UpdateSuccess.class, a -> a.key().equals(counter1Key), a -> { + // ok + }).build()); + //#update-response1 - //#update-response2 - receive(ReceiveBuilder. - match(UpdateSuccess.class, a -> a.key().equals(set1Key), a -> { - // ok - }). - match(UpdateTimeout.class, a -> a.key().equals(set1Key), a -> { - // write to 3 nodes failed within 1.second - }).build()); - //#update-response2 + //#update-response2 + receive(ReceiveBuilder. + match(UpdateSuccess.class, a -> a.key().equals(set1Key), a -> { + // ok + }). + match(UpdateTimeout.class, a -> a.key().equals(set1Key), a -> { + // write to 3 nodes failed within 1.second + }).build()); + //#update-response2 + }}; } @Test public void demonstrateUpdateWithRequestContext() { - probe = new JavaTestKit(system); + new JavaTestKit(system) { + { - //#update-request-context - final Cluster node = Cluster.get(system); - final ActorRef replicator = DistributedData.get(system).replicator(); + //#update-request-context + final Cluster node = Cluster.get(system); + final ActorRef replicator = DistributedData.get(system).replicator(); - final WriteConsistency writeTwo = new WriteTo(2, Duration.create(3, SECONDS)); - final Key counter1Key = PNCounterKey.create("counter1"); - - receive(ReceiveBuilder. - match(String.class, a -> a.equals("increment"), a -> { - // incoming command to increase the counter - Optional reqContext = Optional.of(sender()); - Replicator.Update upd = new Replicator.Update(counter1Key, - PNCounter.create(), writeTwo, reqContext, curr -> curr.increment(node, 1)); - replicator.tell(upd, self()); - }). - - match(UpdateSuccess.class, a -> a.key().equals(counter1Key), a -> { - ActorRef replyTo = (ActorRef) a.getRequest().get(); - replyTo.tell("ack", self()); - }). - - match(UpdateTimeout.class, a -> a.key().equals(counter1Key), a -> { - ActorRef replyTo = (ActorRef) a.getRequest().get(); - replyTo.tell("nack", self()); - }).build()); + final WriteConsistency writeTwo = new WriteTo(2, Duration.create(3, SECONDS)); + final Key counter1Key = PNCounterKey.create("counter1"); - //#update-request-context + receive(ReceiveBuilder. + match(String.class, a -> a.equals("increment"), a -> { + // incoming command to increase the counter + Optional reqContext = Optional.of(getRef()); + Replicator.Update upd = new Replicator.Update(counter1Key, + PNCounter.create(), writeTwo, reqContext, curr -> curr.increment(node, 1)); + replicator.tell(upd, getTestActor()); + }). + + match(UpdateSuccess.class, a -> a.key().equals(counter1Key), a -> { + ActorRef replyTo = (ActorRef) a.getRequest().get(); + replyTo.tell("ack", getTestActor()); + }). + + match(UpdateTimeout.class, a -> a.key().equals(counter1Key), a -> { + ActorRef replyTo = (ActorRef) a.getRequest().get(); + replyTo.tell("nack", getTestActor()); + }).build()); + + //#update-request-context + } + }; } @SuppressWarnings({ "unused", "unchecked" }) @Test public void demonstrateGet() { - probe = new JavaTestKit(system); + new JavaTestKit(system) { + { - //#get - final ActorRef replicator = DistributedData.get(system).replicator(); - final Key counter1Key = PNCounterKey.create("counter1"); - final Key> set1Key = GSetKey.create("set1"); - final Key> set2Key = ORSetKey.create("set2"); - final Key activeFlagKey = FlagKey.create("active"); + //#get + final ActorRef replicator = DistributedData.get(system).replicator(); + final Key counter1Key = PNCounterKey.create("counter1"); + final Key> set1Key = GSetKey.create("set1"); + final Key> set2Key = ORSetKey.create("set2"); + final Key activeFlagKey = FlagKey.create("active"); - replicator.tell(new Replicator.Get(counter1Key, - Replicator.readLocal()), self()); + replicator.tell(new Replicator.Get(counter1Key, + Replicator.readLocal()), getTestActor()); - final ReadConsistency readFrom3 = new ReadFrom(3, Duration.create(1, SECONDS)); - replicator.tell(new Replicator.Get>(set1Key, - readFrom3), self()); + final ReadConsistency readFrom3 = new ReadFrom(3, Duration.create(1, SECONDS)); + replicator.tell(new Replicator.Get>(set1Key, + readFrom3), getTestActor()); - final ReadConsistency readMajority = new ReadMajority(Duration.create(5, SECONDS)); - replicator.tell(new Replicator.Get>(set2Key, - readMajority), self()); + final ReadConsistency readMajority = new ReadMajority(Duration.create(5, SECONDS)); + replicator.tell(new Replicator.Get>(set2Key, + readMajority), getTestActor()); - final ReadConsistency readAll = new ReadAll(Duration.create(5, SECONDS)); - replicator.tell(new Replicator.Get(activeFlagKey, - readAll), self()); - //#get + final ReadConsistency readAll = new ReadAll(Duration.create(5, SECONDS)); + replicator.tell(new Replicator.Get(activeFlagKey, + readAll), getTestActor()); + //#get - //#get-response1 - receive(ReceiveBuilder. - match(GetSuccess.class, a -> a.key().equals(counter1Key), a -> { - GetSuccess g = a; - BigInteger value = g.dataValue().getValue(); - }). - match(NotFound.class, a -> a.key().equals(counter1Key), a -> { - // key counter1 does not exist - }).build()); - //#get-response1 + //#get-response1 + receive(ReceiveBuilder. + match(GetSuccess.class, a -> a.key().equals(counter1Key), a -> { + GetSuccess g = a; + BigInteger value = g.dataValue().getValue(); + }). + match(NotFound.class, a -> a.key().equals(counter1Key), a -> { + // key counter1 does not exist + }).build()); + //#get-response1 - //#get-response2 - receive(ReceiveBuilder. - match(GetSuccess.class, a -> a.key().equals(set1Key), a -> { - GetSuccess> g = a; - Set value = g.dataValue().getElements(); - }). - match(GetFailure.class, a -> a.key().equals(set1Key), a -> { - // read from 3 nodes failed within 1.second - }). - match(NotFound.class, a -> a.key().equals(set1Key), a -> { - // key set1 does not exist - }).build()); - //#get-response2 - + //#get-response2 + receive(ReceiveBuilder. + match(GetSuccess.class, a -> a.key().equals(set1Key), a -> { + GetSuccess> g = a; + Set value = g.dataValue().getElements(); + }). + match(GetFailure.class, a -> a.key().equals(set1Key), a -> { + // read from 3 nodes failed within 1.second + }). + match(NotFound.class, a -> a.key().equals(set1Key), a -> { + // key set1 does not exist + }).build()); + //#get-response2 + } + }; } @SuppressWarnings("unchecked") @Test public void demonstrateGetWithRequestContext() { - probe = new JavaTestKit(system); + new JavaTestKit(system) { + { - //#get-request-context - final ActorRef replicator = DistributedData.get(system).replicator(); - final ReadConsistency readTwo = new ReadFrom(2, Duration.create(3, SECONDS)); - final Key counter1Key = PNCounterKey.create("counter1"); + //#get-request-context + final ActorRef replicator = DistributedData.get(system).replicator(); + final ReadConsistency readTwo = new ReadFrom(2, Duration.create(3, SECONDS)); + final Key counter1Key = PNCounterKey.create("counter1"); - receive(ReceiveBuilder. - match(String.class, a -> a.equals("get-count"), a -> { - // incoming request to retrieve current value of the counter - Optional reqContext = Optional.of(sender()); - replicator.tell(new Replicator.Get(counter1Key, - readTwo), self()); - }). - - match(GetSuccess.class, a -> a.key().equals(counter1Key), a -> { - ActorRef replyTo = (ActorRef) a.getRequest().get(); - GetSuccess g = a; - long value = g.dataValue().getValue().longValue(); - replyTo.tell(value, self()); - }). - - match(GetFailure.class, a -> a.key().equals(counter1Key), a -> { - ActorRef replyTo = (ActorRef) a.getRequest().get(); - replyTo.tell(-1L, self()); - }). - - match(NotFound.class, a -> a.key().equals(counter1Key), a -> { - ActorRef replyTo = (ActorRef) a.getRequest().get(); - replyTo.tell(0L, self()); - }).build()); - //#get-request-context + receive(ReceiveBuilder. + match(String.class, a -> a.equals("get-count"), a -> { + // incoming request to retrieve current value of the counter + Optional reqContext = Optional.of(getTestActor()); + replicator.tell(new Replicator.Get(counter1Key, + readTwo), getTestActor()); + }). + + match(GetSuccess.class, a -> a.key().equals(counter1Key), a -> { + ActorRef replyTo = (ActorRef) a.getRequest().get(); + GetSuccess g = a; + long value = g.dataValue().getValue().longValue(); + replyTo.tell(value, getTestActor()); + }). + + match(GetFailure.class, a -> a.key().equals(counter1Key), a -> { + ActorRef replyTo = (ActorRef) a.getRequest().get(); + replyTo.tell(-1L, getTestActor()); + }). + + match(NotFound.class, a -> a.key().equals(counter1Key), a -> { + ActorRef replyTo = (ActorRef) a.getRequest().get(); + replyTo.tell(0L, getTestActor()); + }).build()); + //#get-request-context + } + }; } @SuppressWarnings("unchecked") - abstract class MyActor { + abstract class MyActor extends AbstractActor { //#subscribe final ActorRef replicator = DistributedData.get(system).replicator(); final Key counter1Key = PNCounterKey.create("counter1"); @@ -270,21 +269,22 @@ public class DistributedDataDocTest { @Test public void demonstrateDelete() { - probe = new JavaTestKit(system); + new JavaTestKit(system) { + { + //#delete + final ActorRef replicator = DistributedData.get(system).replicator(); + final Key counter1Key = PNCounterKey.create("counter1"); + final Key> set2Key = ORSetKey.create("set2"); - //#delete - final ActorRef replicator = DistributedData.get(system).replicator(); - final Key counter1Key = PNCounterKey.create("counter1"); - final Key> set2Key = ORSetKey.create("set2"); + replicator.tell(new Delete(counter1Key, + Replicator.writeLocal()), getTestActor()); - replicator.tell(new Delete(counter1Key, - Replicator.writeLocal()), self()); - - final WriteConsistency writeMajority = - new WriteMajority(Duration.create(5, SECONDS)); - replicator.tell(new Delete(counter1Key, - writeMajority), self()); - //#delete + final WriteConsistency writeMajority = + new WriteMajority(Duration.create(5, SECONDS)); + replicator.tell(new Delete(counter1Key, + writeMajority), getTestActor()); + //#delete + }}; } public void demonstratePNCounter() { diff --git a/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTest.java b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTest.java index 0ea2b35ffc..8662eb9748 100644 --- a/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTest.java +++ b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTest.java @@ -7,6 +7,7 @@ import akka.dispatch.ControlMessage; import akka.dispatch.RequiresMessageQueue; import akka.testkit.AkkaSpec; import com.typesafe.config.ConfigFactory; +import docs.AbstractJavaTest; import docs.actor.MyBoundedUntypedActor; import docs.actor.MyUntypedActor; import org.junit.ClassRule; @@ -36,7 +37,7 @@ import com.typesafe.config.Config; //#imports-required-mailbox -public class DispatcherDocTest { +public class DispatcherDocTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/event/EventBusDocTest.java b/akka-docs/rst/java/code/docs/event/EventBusDocTest.java index 2dd4ae911b..7d47d56e0b 100644 --- a/akka-docs/rst/java/code/docs/event/EventBusDocTest.java +++ b/akka-docs/rst/java/code/docs/event/EventBusDocTest.java @@ -7,6 +7,7 @@ import akka.event.japi.EventBus; import java.util.concurrent.TimeUnit; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; @@ -43,7 +44,7 @@ import akka.event.japi.ManagedActorEventBus; //#actor-bus -public class EventBusDocTest { +public class EventBusDocTest extends AbstractJavaTest { public static class Event {} public static class Subscriber {} diff --git a/akka-docs/rst/java/code/docs/event/LoggingDocTest.java b/akka-docs/rst/java/code/docs/event/LoggingDocTest.java index b47638c710..71e1ca413e 100644 --- a/akka-docs/rst/java/code/docs/event/LoggingDocTest.java +++ b/akka-docs/rst/java/code/docs/event/LoggingDocTest.java @@ -19,6 +19,7 @@ import akka.event.Logging.Debug; //#imports-listener +import docs.AbstractJavaTest; import org.junit.Test; import akka.testkit.JavaTestKit; import scala.Option; @@ -35,7 +36,7 @@ import akka.actor.ActorRef; import akka.actor.ActorSystem; //#imports-deadletter -public class LoggingDocTest { +public class LoggingDocTest extends AbstractJavaTest { @Test public void useLoggingActor() { @@ -79,7 +80,7 @@ public class LoggingDocTest { } } - class Listener extends UntypedActor { + static class Listener extends UntypedActor { @Override public void onReceive(Object message) throws Exception { if (message instanceof Jazz) { diff --git a/akka-docs/rst/java/code/docs/extension/ExtensionDocTest.java b/akka-docs/rst/java/code/docs/extension/ExtensionDocTest.java index fe46d37d1c..93042202cb 100644 --- a/akka-docs/rst/java/code/docs/extension/ExtensionDocTest.java +++ b/akka-docs/rst/java/code/docs/extension/ExtensionDocTest.java @@ -9,9 +9,10 @@ import java.util.concurrent.atomic.AtomicLong; //#imports +import docs.AbstractJavaTest; import org.junit.Test; -public class ExtensionDocTest { +public class ExtensionDocTest extends AbstractJavaTest { static //#extension diff --git a/akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTest.java b/akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTest.java index 058bac5a70..b3987c1849 100644 --- a/akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTest.java +++ b/akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTest.java @@ -9,6 +9,7 @@ import akka.actor.AbstractExtensionId; import akka.actor.ExtensionIdProvider; import akka.actor.ActorSystem; import akka.actor.ExtendedActorSystem; +import docs.AbstractJavaTest; import scala.concurrent.duration.Duration; import com.typesafe.config.Config; import java.util.concurrent.TimeUnit; @@ -18,7 +19,7 @@ import java.util.concurrent.TimeUnit; import akka.actor.UntypedActor; import org.junit.Test; -public class SettingsExtensionDocTest { +public class SettingsExtensionDocTest extends AbstractJavaTest { static //#extension diff --git a/akka-docs/rst/java/code/docs/future/FutureDocTest.java b/akka-docs/rst/java/code/docs/future/FutureDocTest.java index be0d2b16a5..c6d3271c10 100644 --- a/akka-docs/rst/java/code/docs/future/FutureDocTest.java +++ b/akka-docs/rst/java/code/docs/future/FutureDocTest.java @@ -5,6 +5,7 @@ package docs.future; //#imports1 import akka.dispatch.*; +import docs.AbstractJavaTest; import scala.concurrent.ExecutionContext; import scala.concurrent.Future; import scala.concurrent.Await; @@ -66,7 +67,7 @@ import akka.pattern.Patterns; import static org.junit.Assert.*; -public class FutureDocTest { +public class FutureDocTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/http/javadsl/server/HttpServerExampleDocTest.java b/akka-docs/rst/java/code/docs/http/javadsl/server/HttpServerExampleDocTest.java index 3cabf1bd1d..f6431e2ab8 100644 --- a/akka-docs/rst/java/code/docs/http/javadsl/server/HttpServerExampleDocTest.java +++ b/akka-docs/rst/java/code/docs/http/javadsl/server/HttpServerExampleDocTest.java @@ -6,8 +6,6 @@ package docs.http.javadsl.server; import akka.NotUsed; import akka.actor.ActorSystem; -import akka.dispatch.OnFailure; -import akka.http.impl.util.Util; import akka.http.javadsl.Http; import akka.http.javadsl.IncomingConnection; import akka.http.javadsl.ServerBinding; @@ -19,16 +17,11 @@ import akka.http.javadsl.model.HttpResponse; import akka.http.javadsl.model.Uri; import akka.http.scaladsl.model.HttpEntity; import akka.japi.function.Function; -import akka.japi.function.Procedure; import akka.stream.ActorMaterializer; import akka.stream.Materializer; import akka.stream.javadsl.Flow; import akka.stream.javadsl.Sink; import akka.stream.javadsl.Source; -import akka.stream.stage.Context; -import akka.stream.stage.PushStage; -import akka.stream.stage.SyncDirective; -import akka.stream.stage.TerminationDirective; import akka.util.ByteString; import java.io.BufferedReader; @@ -88,19 +81,14 @@ public class HttpServerExampleDocTest { Http.get(system).bind("localhost", 8080, materializer); Flow failureDetection = - Flow.of(IncomingConnection.class).transform(() -> - new PushStage() { - @Override - public SyncDirective onPush(IncomingConnection elem, Context ctx) { - return ctx.push(elem); - } - - @Override - public TerminationDirective onUpstreamFailure(Throwable cause, Context ctx) { + Flow.of(IncomingConnection.class).watchTermination((notUsed, termination) -> { + termination.whenComplete((done, cause) -> { + if (cause != null) { // signal the failure to external monitoring service! - return super.onUpstreamFailure(cause, ctx); - } + } }); + return NotUsed.getInstance(); + }); CompletionStage serverBindingFuture = serverSource @@ -123,18 +111,14 @@ public class HttpServerExampleDocTest { Http.get(system).bind("localhost", 8080, materializer); Flow failureDetection = - Flow.of(HttpRequest.class).transform(() -> - new PushStage() { - @Override - public SyncDirective onPush(HttpRequest elem, Context ctx) { - return ctx.push(elem); - } - - @Override - public TerminationDirective onUpstreamFailure(Throwable cause, Context ctx) { - // signal the failure to external monitoring service! - return super.onUpstreamFailure(cause, ctx); - } + Flow.of(HttpRequest.class) + .watchTermination((notUsed, termination) -> { + termination.whenComplete((done, cause) -> { + if (cause != null) { + // signal the failure to external monitoring service! + } + }); + return NotUsed.getInstance(); }); Flow httpEcho = diff --git a/akka-docs/rst/java/code/docs/io/JavaUdpMulticastTest.java b/akka-docs/rst/java/code/docs/io/JavaUdpMulticastTest.java index d79d8ef2be..7c4ae60f45 100644 --- a/akka-docs/rst/java/code/docs/io/JavaUdpMulticastTest.java +++ b/akka-docs/rst/java/code/docs/io/JavaUdpMulticastTest.java @@ -9,6 +9,7 @@ import akka.actor.ActorSystem; import akka.actor.Props; import akka.io.Udp; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -19,6 +20,9 @@ import java.net.NetworkInterface; import java.util.Enumeration; import java.util.Random; +// not part of the test suite because we have not figured out +// a way to find an interface that is sure to work on all platforms +// to listen for udp on public class JavaUdpMulticastTest { static ActorSystem system; diff --git a/akka-docs/rst/java/code/docs/io/japi/IODocTest.java b/akka-docs/rst/java/code/docs/io/japi/IODocTest.java index fceec37de1..0276812d6b 100644 --- a/akka-docs/rst/java/code/docs/io/japi/IODocTest.java +++ b/akka-docs/rst/java/code/docs/io/japi/IODocTest.java @@ -6,6 +6,7 @@ package docs.io.japi; import akka.testkit.AkkaJUnitActorSystemResource; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; @@ -29,7 +30,7 @@ import akka.util.ByteString; import akka.testkit.JavaTestKit; import akka.testkit.AkkaSpec; -public class IODocTest { +public class IODocTest extends AbstractJavaTest { static //#server diff --git a/akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTest.java b/akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTest.java index 0673211239..d99b104a81 100644 --- a/akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTest.java +++ b/akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTest.java @@ -5,6 +5,7 @@ package docs.jrouting; import akka.testkit.AkkaJUnitActorSystemResource; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; @@ -30,7 +31,7 @@ import akka.routing.ConsistentHashingRouter.ConsistentHashMapper; import akka.routing.ConsistentHashingRouter.ConsistentHashableEnvelope; //#imports2 -public class ConsistentHashingRouterDocTest { +public class ConsistentHashingRouterDocTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTest.java b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTest.java index d346d70ec5..06e32b5b9d 100644 --- a/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTest.java +++ b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTest.java @@ -10,6 +10,7 @@ import akka.routing.RoutingLogic; import akka.routing.SeveralRoutees; import akka.testkit.AkkaJUnitActorSystemResource; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; @@ -36,7 +37,7 @@ import java.util.List; //#imports1 -public class CustomRouterDocTest { +public class CustomRouterDocTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/jrouting/RouterDocTest.java b/akka-docs/rst/java/code/docs/jrouting/RouterDocTest.java index 3a4b5a0cba..73f37ecaba 100644 --- a/akka-docs/rst/java/code/docs/jrouting/RouterDocTest.java +++ b/akka-docs/rst/java/code/docs/jrouting/RouterDocTest.java @@ -5,6 +5,7 @@ package docs.jrouting; import akka.testkit.AkkaJUnitActorSystemResource; +import docs.AbstractJavaTest; import org.junit.ClassRule; import org.junit.Test; @@ -66,7 +67,7 @@ import akka.routing.TailChoppingPool; //#imports2 -public class RouterDocTest { +public class RouterDocTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.java b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.java index 2a20345b08..1043914898 100644 --- a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.java +++ b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.java @@ -8,13 +8,14 @@ import akka.actor.*; import akka.testkit.*; import akka.testkit.TestEvent.Mute; import akka.testkit.TestEvent.UnMute; +import docs.AbstractJavaTest; import org.junit.*; import scala.concurrent.duration.Duration; import scala.concurrent.duration.FiniteDuration; import java.util.Arrays; import java.util.concurrent.TimeUnit; -public class SchedulerPatternTest { +public class SchedulerPatternTest extends AbstractJavaTest { @ClassRule public static AkkaJUnitActorSystemResource actorSystemResource = diff --git a/akka-docs/rst/java/code/docs/stream/ActorPublisherDocTest.java b/akka-docs/rst/java/code/docs/stream/ActorPublisherDocTest.java index 45031232b4..9f3427ddab 100644 --- a/akka-docs/rst/java/code/docs/stream/ActorPublisherDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/ActorPublisherDocTest.java @@ -14,6 +14,7 @@ import akka.stream.actor.ActorPublisherMessage; import akka.stream.javadsl.Sink; import akka.stream.javadsl.Source; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -21,100 +22,100 @@ import org.junit.Test; import java.util.ArrayList; import java.util.List; -public class ActorPublisherDocTest { +public class ActorPublisherDocTest extends AbstractJavaTest { static ActorSystem system; - + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("ActorPublisherDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - - //#job-manager - public static class JobManagerProtocol { - final public static class Job { - public final String payload; - - public Job(String payload) { - this.payload = payload; - } + //#job-manager + public static class JobManagerProtocol { + final public static class Job { + public final String payload; + public Job(String payload) { + this.payload = payload; } - public static class JobAcceptedMessage { - @Override - public String toString() { - return "JobAccepted"; - } - } - public static final JobAcceptedMessage JobAccepted = new JobAcceptedMessage(); - - public static class JobDeniedMessage { - @Override - public String toString() { - return "JobDenied"; - } - } - public static final JobDeniedMessage JobDenied = new JobDeniedMessage(); } - public static class JobManager extends AbstractActorPublisher { - public static Props props() { return Props.create(JobManager.class); } - - private final int MAX_BUFFER_SIZE = 100; - private final List buf = new ArrayList<>(); - - public JobManager() { - receive(ReceiveBuilder. - match(JobManagerProtocol.Job.class, job -> buf.size() == MAX_BUFFER_SIZE, job -> { - sender().tell(JobManagerProtocol.JobDenied, self()); - }). - match(JobManagerProtocol.Job.class, job -> { - sender().tell(JobManagerProtocol.JobAccepted, self()); - - if (buf.isEmpty() && totalDemand() > 0) - onNext(job); - else { - buf.add(job); - deliverBuf(); - } - }). - match(ActorPublisherMessage.Request.class, request -> deliverBuf()). - match(ActorPublisherMessage.Cancel.class, cancel -> context().stop(self())). - build()); + public static class JobAcceptedMessage { + @Override + public String toString() { + return "JobAccepted"; } + } + public static final JobAcceptedMessage JobAccepted = new JobAcceptedMessage(); - void deliverBuf() { - while (totalDemand() > 0) { - /* - * totalDemand is a Long and could be larger than - * what buf.splitAt can accept - */ - if (totalDemand() <= Integer.MAX_VALUE) { - final List took = - buf.subList(0, Math.min(buf.size(), (int) totalDemand())); - took.forEach(this::onNext); - buf.removeAll(took); - break; - } else { - final List took = - buf.subList(0, Math.min(buf.size(), Integer.MAX_VALUE)); - took.forEach(this::onNext); - buf.removeAll(took); + public static class JobDeniedMessage { + @Override + public String toString() { + return "JobDenied"; + } + } + public static final JobDeniedMessage JobDenied = new JobDeniedMessage(); + } + public static class JobManager extends AbstractActorPublisher { + + public static Props props() { return Props.create(JobManager.class); } + + private final int MAX_BUFFER_SIZE = 100; + private final List buf = new ArrayList<>(); + + public JobManager() { + receive(ReceiveBuilder. + match(JobManagerProtocol.Job.class, job -> buf.size() == MAX_BUFFER_SIZE, job -> { + sender().tell(JobManagerProtocol.JobDenied, self()); + }). + match(JobManagerProtocol.Job.class, job -> { + sender().tell(JobManagerProtocol.JobAccepted, self()); + + if (buf.isEmpty() && totalDemand() > 0) + onNext(job); + else { + buf.add(job); + deliverBuf(); } + }). + match(ActorPublisherMessage.Request.class, request -> deliverBuf()). + match(ActorPublisherMessage.Cancel.class, cancel -> context().stop(self())). + build()); + } + + void deliverBuf() { + while (totalDemand() > 0) { + /* + * totalDemand is a Long and could be larger than + * what buf.splitAt can accept + */ + if (totalDemand() <= Integer.MAX_VALUE) { + final List took = + buf.subList(0, Math.min(buf.size(), (int) totalDemand())); + took.forEach(this::onNext); + buf.removeAll(took); + break; + } else { + final List took = + buf.subList(0, Math.min(buf.size(), Integer.MAX_VALUE)); + took.forEach(this::onNext); + buf.removeAll(took); } } } - //#job-manager + } + //#job-manager @Test public void demonstrateActorPublisherUsage() { diff --git a/akka-docs/rst/java/code/docs/stream/ActorSubscriberDocTest.java b/akka-docs/rst/java/code/docs/stream/ActorSubscriberDocTest.java index e8751b1538..be27428617 100644 --- a/akka-docs/rst/java/code/docs/stream/ActorSubscriberDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/ActorSubscriberDocTest.java @@ -22,6 +22,7 @@ import akka.stream.actor.RequestStrategy; import akka.stream.javadsl.Sink; import akka.stream.javadsl.Source; import akka.testkit.JavaTestKit; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -30,24 +31,24 @@ import java.util.*; import static org.junit.Assert.assertEquals; -public class ActorSubscriberDocTest { +public class ActorSubscriberDocTest extends AbstractJavaTest { static ActorSystem system; - + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("ActorSubscriberDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - //#worker-pool public static class WorkerPoolProtocol { diff --git a/akka-docs/rst/java/code/docs/stream/BidiFlowDocTest.java b/akka-docs/rst/java/code/docs/stream/BidiFlowDocTest.java index ca58f66d2f..8d38246540 100644 --- a/akka-docs/rst/java/code/docs/stream/BidiFlowDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/BidiFlowDocTest.java @@ -11,6 +11,7 @@ import java.util.concurrent.TimeUnit; import akka.NotUsed; import akka.stream.javadsl.GraphDSL; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -30,23 +31,24 @@ import scala.concurrent.duration.Duration; import scala.concurrent.duration.FiniteDuration; import static org.junit.Assert.assertArrayEquals; -public class BidiFlowDocTest { +public class BidiFlowDocTest extends AbstractJavaTest { - private static ActorSystem system; + static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("FlowDocTest"); + system = ActorSystem.create("FlowDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { - JavaTestKit.shutdownActorSystem(system); - system = null; + JavaTestKit.shutdownActorSystem(system); + system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - //#codec static interface Message {} static class Ping implements Message { @@ -132,58 +134,77 @@ public class BidiFlowDocTest { .append(bytes) .result(); } - - public static class FrameParser extends PushPullStage { - // this holds the received but not yet parsed bytes - private ByteString stash = ByteString.empty(); - // this holds the current message length or -1 if at a boundary - private int needed = -1; - + + public static class FrameParser extends GraphStage> { + public Inlet in = Inlet.create("FrameParser.in"); + public Outlet out = Outlet.create("FrameParser.out"); + private FlowShape shape = FlowShape.of(in, out); + @Override - public SyncDirective onPull(Context ctx) { - return run(ctx); + public FlowShape shape() { + return shape; } @Override - public SyncDirective onPush(ByteString bytes, Context ctx) { - stash = stash.concat(bytes); - return run(ctx); - } - - @Override - public TerminationDirective onUpstreamFinish(Context ctx) { - if (stash.isEmpty()) return ctx.finish(); - else return ctx.absorbTermination(); // we still have bytes to emit - } - - private SyncDirective run(Context ctx) { - if (needed == -1) { - // are we at a boundary? then figure out next length - if (stash.size() < 4) return pullOrFinish(ctx); - else { - needed = stash.iterator().getInt(ByteOrder.LITTLE_ENDIAN); - stash = stash.drop(4); - return run(ctx); // cycle back to possibly already emit the next chunk + public GraphStageLogic createLogic(Attributes inheritedAttributes) { + return new GraphStageLogic(shape) { + + // this holds the received but not yet parsed bytes + private ByteString stash = ByteString.empty(); + // this holds the current message length or -1 if at a boundary + private int needed = -1; + + { + setHandler(in, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + ByteString bytes = grab(in); + stash = stash.concat(bytes); + run(); + } + + @Override + public void onUpstreamFinish() throws Exception { + if (stash.isEmpty()) completeStage(); + // wait with completion and let run() complete when the + // rest of the stash has been sent downstream + } + }); + + setHandler(out, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + if (isClosed(in)) run(); + else pull(in); + } + }); } - } else if (stash.size() < needed) { - // we are in the middle of a message, need more bytes - return pullOrFinish(ctx); - } else { - // we have enough to emit at least one message, so do it - final ByteString emit = stash.take(needed); - stash = stash.drop(needed); - needed = -1; - return ctx.push(emit); - } - } - - /* - * After having called absorbTermination() we cannot pull any more, so if we need - * more data we will just have to give up. - */ - private SyncDirective pullOrFinish(Context ctx) { - if (ctx.isFinishing()) return ctx.finish(); - else return ctx.pull(); + + private void run() { + if (needed == -1) { + // are we at a boundary? then figure out next length + if (stash.size() < 4) { + if (isClosed(in)) completeStage(); + else pull(in); + } else { + needed = stash.iterator().getInt(ByteOrder.LITTLE_ENDIAN); + stash = stash.drop(4); + run(); // cycle back to possibly already emit the next chunk + } + } else if (stash.size() < needed) { + // we are in the middle of a message, need more bytes + // or in is already closed and we cannot pull any more + if (isClosed(in)) completeStage(); + else pull(in); + } else { + // we have enough to emit at least one message, so do it + final ByteString emit = stash.take(needed); + stash = stash.drop(needed); + needed = -1; + push(out, emit); + } + } + }; } } @@ -192,7 +213,7 @@ public class BidiFlowDocTest { final FlowShape top = b.add(Flow.of(ByteString.class).map(BidiFlowDocTest::addLengthHeader)); final FlowShape bottom = - b.add(Flow.of(ByteString.class).transform(() -> new FrameParser())); + b.add(Flow.of(ByteString.class).via(new FrameParser())); return BidiShape.fromFlows(top, bottom); })); //#framing diff --git a/akka-docs/rst/java/code/docs/stream/CompositionDocTest.java b/akka-docs/rst/java/code/docs/stream/CompositionDocTest.java index 60f64c4ad7..899251a348 100644 --- a/akka-docs/rst/java/code/docs/stream/CompositionDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/CompositionDocTest.java @@ -10,6 +10,7 @@ import java.util.concurrent.CompletionStage; import akka.NotUsed; import akka.stream.ClosedShape; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -26,23 +27,24 @@ import scala.concurrent.*; import scala.Option; -public class CompositionDocTest { +public class CompositionDocTest extends AbstractJavaTest { - private static ActorSystem system; + static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("FlowDocTest"); + system = ActorSystem.create("CompositionDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void nonNestedFlow() throws Exception { //#non-nested-flow diff --git a/akka-docs/rst/java/code/docs/stream/FlowDocTest.java b/akka-docs/rst/java/code/docs/stream/FlowDocTest.java index 0a5a775dd0..8625e3837b 100644 --- a/akka-docs/rst/java/code/docs/stream/FlowDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/FlowDocTest.java @@ -13,6 +13,7 @@ import java.util.stream.Stream; import akka.NotUsed; import akka.japi.Pair; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -30,22 +31,23 @@ import akka.stream.*; import akka.stream.javadsl.*; import akka.testkit.JavaTestKit; -public class FlowDocTest { +public class FlowDocTest extends AbstractJavaTest { - private static ActorSystem system; + static ActorSystem system; + static Materializer mat; - @BeforeClass - public static void setup() { - system = ActorSystem.create("FlowDocTest"); - } + @BeforeClass + public static void setup() { + system = ActorSystem.create("FlowDocTest"); + mat = ActorMaterializer.create(system); + } - @AfterClass - public static void tearDown() { - JavaTestKit.shutdownActorSystem(system); - system = null; - } - - final Materializer mat = ActorMaterializer.create(system); + @AfterClass + public static void tearDown() { + JavaTestKit.shutdownActorSystem(system); + system = null; + mat = null; + } @Test public void sourceIsImmutable() throws Exception { diff --git a/akka-docs/rst/java/code/docs/stream/FlowErrorDocTest.java b/akka-docs/rst/java/code/docs/stream/FlowErrorDocTest.java index 537cdd6ee7..f5dbfed7ea 100644 --- a/akka-docs/rst/java/code/docs/stream/FlowErrorDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/FlowErrorDocTest.java @@ -7,9 +7,11 @@ import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletionStage; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import akka.NotUsed; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -29,7 +31,7 @@ import akka.stream.javadsl.Source; import akka.japi.function.Function; import akka.testkit.JavaTestKit; -public class FlowErrorDocTest { +public class FlowErrorDocTest extends AbstractJavaTest { private static ActorSystem system; @@ -44,7 +46,7 @@ public class FlowErrorDocTest { system = null; } - @Test(expected = ArithmeticException.class) + @Test(expected = ExecutionException.class) public void demonstrateFailStream() throws Exception { //#stop final Materializer mat = ActorMaterializer.create(system); diff --git a/akka-docs/rst/java/code/docs/stream/FlowGraphDocTest.java b/akka-docs/rst/java/code/docs/stream/FlowGraphDocTest.java index e30d9dd759..d31937b384 100644 --- a/akka-docs/rst/java/code/docs/stream/FlowGraphDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/FlowGraphDocTest.java @@ -13,6 +13,7 @@ import java.util.concurrent.TimeUnit; import akka.NotUsed; import akka.stream.ClosedShape; import akka.stream.SourceShape; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -26,23 +27,24 @@ import akka.stream.*; import akka.stream.javadsl.*; import akka.testkit.JavaTestKit; -public class FlowGraphDocTest { +public class FlowGraphDocTest extends AbstractJavaTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("FlowGraphDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void demonstrateBuildSimpleGraph() throws Exception { //#simple-flow-graph diff --git a/akka-docs/rst/java/code/docs/stream/FlowParallelismDocTest.java b/akka-docs/rst/java/code/docs/stream/FlowParallelismDocTest.java index 34693fc2f2..7824d30184 100644 --- a/akka-docs/rst/java/code/docs/stream/FlowParallelismDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/FlowParallelismDocTest.java @@ -7,6 +7,7 @@ package docs.stream; import static org.junit.Assert.assertEquals; import akka.NotUsed; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -15,23 +16,24 @@ import akka.stream.*; import akka.stream.javadsl.*; import akka.testkit.JavaTestKit; -public class FlowParallelismDocTest { +public class FlowParallelismDocTest extends AbstractJavaTest { - private static ActorSystem system; + static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("FlowDocTest"); + system = ActorSystem.create("FlowParallellismDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - static class ScoopOfBatter {} static class HalfCookedPancake {} static class Pancake {} diff --git a/akka-docs/rst/java/code/docs/stream/FlowStagesDocTest.java b/akka-docs/rst/java/code/docs/stream/FlowStagesDocTest.java deleted file mode 100644 index bfcb21d29a..0000000000 --- a/akka-docs/rst/java/code/docs/stream/FlowStagesDocTest.java +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Copyright (C) 2015-2016 Typesafe Inc. - */ -package docs.stream; - -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.CompletionStage; -import java.util.concurrent.TimeUnit; -import java.util.function.Function; -import java.util.function.Predicate; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import scala.concurrent.Await; -import scala.concurrent.Future; -import scala.concurrent.duration.Duration; -import scala.concurrent.duration.FiniteDuration; - -import akka.actor.ActorSystem; -import akka.japi.Pair; -import akka.stream.*; -import akka.stream.javadsl.*; -import akka.stream.stage.*; -import akka.stream.testkit.*; -import akka.stream.testkit.javadsl.*; -import akka.testkit.JavaTestKit; - -public class FlowStagesDocTest { - - static ActorSystem system; - - @BeforeClass - public static void setup() { - system = ActorSystem.create("FlowStagesDocTest"); - } - - @AfterClass - public static void tearDown() { - JavaTestKit.shutdownActorSystem(system); - system = null; - } - - final Materializer mat = ActorMaterializer.create(system); - - static //#one-to-one - public class Map extends PushPullStage { - private final Function f; - public Map(Function f) { - this.f = f; - } - - @Override public SyncDirective onPush(A elem, Context ctx) { - return ctx.push(f.apply(elem)); - } - - @Override public SyncDirective onPull(Context ctx) { - return ctx.pull(); - } - } - //#one-to-one - - static //#many-to-one - public class Filter extends PushPullStage { - private final Predicate p; - public Filter(Predicate p) { - this.p = p; - } - - @Override public SyncDirective onPush(A elem, Context ctx) { - if (p.test(elem)) return ctx.push(elem); - else return ctx.pull(); - } - - @Override public SyncDirective onPull(Context ctx) { - return ctx.pull(); - } - } - //#many-to-one - - //#one-to-many - class Duplicator extends PushPullStage { - private A lastElem = null; - private boolean oneLeft = false; - - @Override public SyncDirective onPush(A elem, Context ctx) { - lastElem = elem; - oneLeft = true; - return ctx.push(elem); - } - - @Override public SyncDirective onPull(Context ctx) { - if (!ctx.isFinishing()) { - // the main pulling logic is below as it is demonstrated on the illustration - if (oneLeft) { - oneLeft = false; - return ctx.push(lastElem); - } else - return ctx.pull(); - } else { - // If we need to emit a final element after the upstream - // finished - if (oneLeft) return ctx.pushAndFinish(lastElem); - else return ctx.finish(); - } - } - - @Override public TerminationDirective onUpstreamFinish(Context ctx) { - return ctx.absorbTermination(); - } - - } - //#one-to-many - - static//#pushstage - public class Map2 extends PushStage { - private final Function f; - public Map2(Function f) { - this.f = f; - } - - @Override public SyncDirective onPush(A elem, Context ctx) { - return ctx.push(f.apply(elem)); - } - } - - public class Filter2 extends PushStage { - private final Predicate p; - public Filter2(Predicate p) { - this.p = p; - } - - @Override public SyncDirective onPush(A elem, Context ctx) { - if (p.test(elem)) return ctx.push(elem); - else return ctx.pull(); - } - } - //#pushstage - - static //#doubler-stateful - public class Duplicator2 extends StatefulStage { - @Override public StageState initial() { - return new StageState() { - @Override public SyncDirective onPush(A elem, Context ctx) { - return emit(Arrays.asList(elem, elem).iterator(), ctx); - } - }; - } - } - //#doubler-stateful - - @Test - public void demonstrateVariousPushPullStages() throws Exception { - final Sink>> sink = - Flow.of(Integer.class).limit(10).toMat(Sink.seq(), Keep.right()); - - //#stage-chain - final RunnableGraph>> runnable = - Source - .from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) - .transform(() -> new Filter(elem -> elem % 2 == 0)) - .transform(() -> new Duplicator()) - .transform(() -> new Map(elem -> elem / 2)) - .toMat(sink, Keep.right()); - //#stage-chain - - assertEquals(Arrays.asList(1, 1, 2, 2, 3, 3, 4, 4, 5, 5), - runnable.run(mat).toCompletableFuture().get(3, TimeUnit.SECONDS)); - } - - //#detached - class Buffer2 extends DetachedStage { - final private Integer SIZE = 2; - final private List buf = new ArrayList<>(SIZE); - private Integer capacity = SIZE; - - private boolean isFull() { - return capacity == 0; - } - - private boolean isEmpty() { - return capacity == SIZE; - } - - private T dequeue() { - capacity += 1; - return buf.remove(0); - } - - private void enqueue(T elem) { - capacity -= 1; - buf.add(elem); - } - - public DownstreamDirective onPull(DetachedContext ctx) { - if (isEmpty()) { - if (ctx.isFinishing()) return ctx.finish(); // No more elements will arrive - else return ctx.holdDownstream(); // waiting until new elements - } else { - final T next = dequeue(); - if (ctx.isHoldingUpstream()) return ctx.pushAndPull(next); // release upstream - else return ctx.push(next); - } - } - - public UpstreamDirective onPush(T elem, DetachedContext ctx) { - enqueue(elem); - if (isFull()) return ctx.holdUpstream(); // Queue is now full, wait until new empty slot - else { - if (ctx.isHoldingDownstream()) return ctx.pushAndPull(dequeue()); // Release downstream - else return ctx.pull(); - } - } - - public TerminationDirective onUpstreamFinish(DetachedContext ctx) { - if (!isEmpty()) return ctx.absorbTermination(); // still need to flush from buffer - else return ctx.finish(); // already empty, finishing - } - } - //#detached - - @Test - public void demonstrateDetachedStage() throws Exception { - final Pair,TestSubscriber.Probe> pair = - TestSource.probe(system) - .transform(() -> new Buffer2()) - .toMat(TestSink.probe(system), Keep.both()) - .run(mat); - - final TestPublisher.Probe pub = pair.first(); - final TestSubscriber.Probe sub = pair.second(); - - final FiniteDuration timeout = Duration.create(100, TimeUnit.MILLISECONDS); - - sub.request(2); - sub.expectNoMsg(timeout); - - pub.sendNext(1); - pub.sendNext(2); - sub.expectNext(1, 2); - - pub.sendNext(3); - pub.sendNext(4); - sub.expectNoMsg(timeout); - - sub.request(2); - sub.expectNext(3, 4); - - pub.sendComplete(); - sub.expectComplete(); - } - -} diff --git a/akka-docs/rst/java/code/docs/stream/GraphCyclesDocTest.java b/akka-docs/rst/java/code/docs/stream/GraphCyclesDocTest.java index a5609a8fa2..97777e3307 100644 --- a/akka-docs/rst/java/code/docs/stream/GraphCyclesDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/GraphCyclesDocTest.java @@ -3,6 +3,7 @@ package docs.stream; import java.util.Arrays; import akka.NotUsed; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -14,24 +15,24 @@ import akka.stream.scaladsl.MergePreferred.MergePreferredShape; import akka.testkit.JavaTestKit; -public class GraphCyclesDocTest { +public class GraphCyclesDocTest extends AbstractJavaTest { static ActorSystem system; - + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("GraphCyclesDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - final static SilenceSystemOut.System System = SilenceSystemOut.get(); final Source source = Source.from(Arrays.asList(1, 2, 3, 4, 5)); diff --git a/akka-docs/rst/java/code/docs/stream/GraphStageDocTest.java b/akka-docs/rst/java/code/docs/stream/GraphStageDocTest.java index 3bdca026eb..a313dca4e5 100644 --- a/akka-docs/rst/java/code/docs/stream/GraphStageDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/GraphStageDocTest.java @@ -18,6 +18,7 @@ import akka.stream.testkit.TestPublisher; import akka.stream.testkit.TestSubscriber; import akka.testkit.JavaTestKit; import akka.japi.Function; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -37,22 +38,23 @@ import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; -public class GraphStageDocTest { +public class GraphStageDocTest extends AbstractJavaTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("FlowGraphDocTest"); + system = ActorSystem.create("GraphStageDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - //#simple-source public class NumbersSource extends GraphStage> { diff --git a/akka-docs/rst/java/code/docs/stream/IntegrationDocTest.java b/akka-docs/rst/java/code/docs/stream/IntegrationDocTest.java index 3c785de436..e508927d57 100644 --- a/akka-docs/rst/java/code/docs/stream/IntegrationDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/IntegrationDocTest.java @@ -14,6 +14,7 @@ import akka.testkit.TestProbe; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; +import docs.AbstractJavaTest; import docs.stream.TwitterStreamQuickstartDocTest.Model.Author; import docs.stream.TwitterStreamQuickstartDocTest.Model.Tweet; import org.junit.AfterClass; @@ -32,11 +33,12 @@ import static docs.stream.TwitterStreamQuickstartDocTest.Model.AKKA; import static docs.stream.TwitterStreamQuickstartDocTest.Model.tweets; import static junit.framework.TestCase.assertTrue; -public class IntegrationDocTest { +public class IntegrationDocTest extends AbstractJavaTest { private static final SilenceSystemOut.System System = SilenceSystemOut.get(); static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { @@ -51,15 +53,16 @@ public class IntegrationDocTest { "akka.actor.default-mailbox.mailbox-type = akka.dispatch.UnboundedMailbox\n"); system = ActorSystem.create("ActorPublisherDocTest", config); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); class AddressSystem { //#email-address-lookup diff --git a/akka-docs/rst/java/code/docs/stream/RateTransformationDocTest.java b/akka-docs/rst/java/code/docs/stream/RateTransformationDocTest.java index ceb36117f3..ae6ed8019a 100644 --- a/akka-docs/rst/java/code/docs/stream/RateTransformationDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/RateTransformationDocTest.java @@ -14,6 +14,7 @@ import java.util.stream.DoubleStream; import java.util.stream.Stream; import akka.NotUsed; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -36,23 +37,24 @@ import scala.concurrent.Future; import scala.concurrent.duration.Duration; import scala.util.Random; -public class RateTransformationDocTest { +public class RateTransformationDocTest extends AbstractJavaTest { - private static ActorSystem system; + static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RateTransformationDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - final Random r = new Random(); @Test diff --git a/akka-docs/rst/java/code/docs/stream/ReactiveStreamsDocTest.java b/akka-docs/rst/java/code/docs/stream/ReactiveStreamsDocTest.java index 04bf0f3a3a..3a249448fa 100644 --- a/akka-docs/rst/java/code/docs/stream/ReactiveStreamsDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/ReactiveStreamsDocTest.java @@ -13,10 +13,12 @@ import akka.stream.*; import akka.stream.javadsl.*; import akka.testkit.JavaTestKit; import akka.testkit.TestProbe; +import docs.AbstractJavaTest; import docs.stream.TwitterStreamQuickstartDocTest.Model.Author; import docs.stream.TwitterStreamQuickstartDocTest.Model.Tweet; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; //#imports @@ -32,24 +34,30 @@ import java.lang.Exception; import static docs.stream.ReactiveStreamsDocTest.Fixture.Data.authors; import static docs.stream.TwitterStreamQuickstartDocTest.Model.AKKA; -public class ReactiveStreamsDocTest { +public class ReactiveStreamsDocTest extends AbstractJavaTest { static ActorSystem system; + static Materializer mat; + static TestProbe storageProbe; + static TestProbe alertProbe; @BeforeClass public static void setup() { system = ActorSystem.create("ReactiveStreamsDocTest"); + mat = ActorMaterializer.create(system); + storageProbe = new TestProbe(system); + alertProbe = new TestProbe(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; + storageProbe = null; + alertProbe = null; } - final Materializer mat = ActorMaterializer.create(system); - - static class Fixture { // below class additionally helps with aligning code includes nicely static class Data { @@ -77,9 +85,6 @@ public class ReactiveStreamsDocTest { } } - final TestProbe storageProbe = TestProbe.apply(system); - final TestProbe alertProbe = TestProbe.apply(system); - final Fixture.RS rs = new Fixture.RS() { @Override public Publisher tweets() { diff --git a/akka-docs/rst/java/code/docs/stream/StreamBuffersRateDocTest.java b/akka-docs/rst/java/code/docs/stream/StreamBuffersRateDocTest.java index 194225318e..7d6e64a531 100644 --- a/akka-docs/rst/java/code/docs/stream/StreamBuffersRateDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/StreamBuffersRateDocTest.java @@ -7,6 +7,7 @@ import java.util.Arrays; import java.util.concurrent.TimeUnit; import akka.NotUsed; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -18,25 +19,26 @@ import akka.stream.*; import akka.stream.javadsl.*; import akka.testkit.JavaTestKit; -public class StreamBuffersRateDocTest { +public class StreamBuffersRateDocTest extends AbstractJavaTest { static class Job {} static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("StreamBufferRateDocTest"); + system = ActorSystem.create("StreamBuffersDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - final SilenceSystemOut.System System = SilenceSystemOut.get(); @Test diff --git a/akka-docs/rst/java/code/docs/stream/StreamPartialFlowGraphDocTest.java b/akka-docs/rst/java/code/docs/stream/StreamPartialFlowGraphDocTest.java index c1504b65b8..88f4432ce8 100644 --- a/akka-docs/rst/java/code/docs/stream/StreamPartialFlowGraphDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/StreamPartialFlowGraphDocTest.java @@ -11,6 +11,7 @@ import java.util.concurrent.TimeUnit; import akka.Done; import akka.NotUsed; +import docs.AbstractJavaTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -24,24 +25,24 @@ import akka.stream.*; import akka.stream.javadsl.*; import akka.testkit.JavaTestKit; -public class StreamPartialFlowGraphDocTest { +public class StreamPartialFlowGraphDocTest extends AbstractJavaTest { static ActorSystem system; - + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("StreamPartialFlowGraphDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void demonstrateBuildWithOpenPorts() throws Exception { //#simple-partial-flow-graph diff --git a/akka-docs/rst/java/code/docs/stream/StreamTestKitDocTest.java b/akka-docs/rst/java/code/docs/stream/StreamTestKitDocTest.java index fe906a9514..d1b917cbf0 100644 --- a/akka-docs/rst/java/code/docs/stream/StreamTestKitDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/StreamTestKitDocTest.java @@ -12,6 +12,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import akka.NotUsed; +import docs.AbstractJavaTest; import org.junit.*; import static org.junit.Assert.assertEquals; @@ -29,23 +30,24 @@ import scala.concurrent.duration.Duration; import scala.concurrent.duration.FiniteDuration; -public class StreamTestKitDocTest { +public class StreamTestKitDocTest extends AbstractJavaTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("StreamTestKitDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void strictCollection() throws Exception { //#strict-collection diff --git a/akka-docs/rst/java/code/docs/stream/TwitterStreamQuickstartDocTest.java b/akka-docs/rst/java/code/docs/stream/TwitterStreamQuickstartDocTest.java index 6789e3d572..d438048114 100644 --- a/akka-docs/rst/java/code/docs/stream/TwitterStreamQuickstartDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/TwitterStreamQuickstartDocTest.java @@ -11,6 +11,7 @@ import akka.japi.JavaPartialFunction; import akka.testkit.JavaTestKit; import akka.stream.*; import akka.stream.javadsl.*; +import docs.AbstractJavaTest; import docs.stream.TwitterStreamQuickstartDocTest.Model.Author; import docs.stream.TwitterStreamQuickstartDocTest.Model.Hashtag; import docs.stream.TwitterStreamQuickstartDocTest.Model.Tweet; @@ -36,20 +37,23 @@ import static docs.stream.TwitterStreamQuickstartDocTest.Model.AKKA; import static docs.stream.TwitterStreamQuickstartDocTest.Model.tweets; @SuppressWarnings("unused") -public class TwitterStreamQuickstartDocTest { +public class TwitterStreamQuickstartDocTest extends AbstractJavaTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("SampleActorTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } static abstract class Model { @@ -213,9 +217,6 @@ public class TwitterStreamQuickstartDocTest { } } - - final Materializer mat = ActorMaterializer.create(system); - @Test public void demonstrateFilterAndMap() { final SilenceSystemOut.System System = SilenceSystemOut.get(); diff --git a/akka-docs/rst/java/code/docs/stream/io/StreamFileDocTest.java b/akka-docs/rst/java/code/docs/stream/io/StreamFileDocTest.java index 1febdd92aa..be558fbbf9 100644 --- a/akka-docs/rst/java/code/docs/stream/io/StreamFileDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/io/StreamFileDocTest.java @@ -13,6 +13,7 @@ import akka.stream.ActorAttributes; import akka.stream.io.IOResult; import akka.stream.javadsl.Sink; import akka.stream.javadsl.FileIO; +import docs.AbstractJavaTest; import docs.stream.SilenceSystemOut; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -23,22 +24,25 @@ import akka.stream.*; import akka.testkit.JavaTestKit; import akka.util.ByteString; -public class StreamFileDocTest { +public class StreamFileDocTest extends AbstractJavaTest { static ActorSystem system; + static Materializer mat; + @BeforeClass public static void setup() { system = ActorSystem.create("StreamFileDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); final SilenceSystemOut.System System = SilenceSystemOut.get(); diff --git a/akka-docs/rst/java/code/docs/stream/io/StreamTcpDocTest.java b/akka-docs/rst/java/code/docs/stream/io/StreamTcpDocTest.java index c9367fdf1e..c795c37d63 100644 --- a/akka-docs/rst/java/code/docs/stream/io/StreamTcpDocTest.java +++ b/akka-docs/rst/java/code/docs/stream/io/StreamTcpDocTest.java @@ -8,6 +8,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import akka.NotUsed; import akka.stream.io.Framing; +import docs.AbstractJavaTest; import docs.stream.SilenceSystemOut; import java.net.InetSocketAddress; @@ -26,22 +27,24 @@ import akka.testkit.JavaTestKit; import akka.testkit.TestProbe; import akka.util.ByteString; -public class StreamTcpDocTest { +public class StreamTcpDocTest extends AbstractJavaTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("StreamTcpDocTest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); final SilenceSystemOut.System System = SilenceSystemOut.get(); @@ -77,9 +80,9 @@ public class StreamTcpDocTest { final Flow echo = Flow.of(ByteString.class) .via(Framing.delimiter(ByteString.fromString("\n"), 256, false)) - .map(bytes -> bytes.utf8String()) + .map(ByteString::utf8String) .map(s -> s + "!!!\n") - .map(s -> ByteString.fromString(s)); + .map(ByteString::fromString); connection.handleWith(echo, mat); }, mat); @@ -95,50 +98,33 @@ public class StreamTcpDocTest { final TestProbe serverProbe = new TestProbe(system); final Source> connections = - Tcp.get(system).bind(localhost.getHostName(), localhost.getPort()); // TODO getHostString in Java7 + Tcp.get(system).bind(localhost.getHostString(), localhost.getPort()); //#welcome-banner-chat-server connections.runForeach(connection -> { // server logic, parses incoming commands - final PushStage commandParser = new PushStage() { - @Override public SyncDirective onPush(String elem, Context ctx) { - if (elem.equals("BYE")) - return ctx.finish(); - else - return ctx.push(elem + "!"); - } - }; + final Flow commandParser = + Flow.create() + .takeWhile(elem -> !elem.equals("BYE")) + .map(elem -> elem + "!"); final String welcomeMsg = "Welcome to: " + connection.localAddress() + - " you are: " + connection.remoteAddress() + "!\n"; + " you are: " + connection.remoteAddress() + "!"; - final Source welcome = - Source.single(ByteString.fromString(welcomeMsg)); - final Flow echoFlow = + final Source welcome = Source.single(welcomeMsg); + final Flow serverLogic = Flow.of(ByteString.class) .via(Framing.delimiter(ByteString.fromString("\n"), 256, false)) - .map(bytes -> bytes.utf8String()) + .map(ByteString::utf8String) //#welcome-banner-chat-server .map(command -> { serverProbe.ref().tell(command, null); return command; }) //#welcome-banner-chat-server - .transform(() -> commandParser) + .via(commandParser) + .merge(welcome) .map(s -> s + "\n") - .map(s -> ByteString.fromString(s)); - - final Flow serverLogic = - Flow.fromGraph(GraphDSL.create(builder -> { - final UniformFanInShape concat = - builder.add(Concat.create()); - final FlowShape echo = builder.add(echoFlow); - - builder - .from(builder.add(welcome)).toFanIn(concat) - .from(echo).toFanIn(concat); - - return FlowShape.of(echo.in(), concat.out()); - })); + .map(ByteString::fromString); connection.handleWith(serverLogic, mat); }, mat); @@ -156,27 +142,25 @@ public class StreamTcpDocTest { final Flow> connection = Tcp.get(system).outgoingConnection(localhost.getHostString(), localhost.getPort()); //#repl-client - - final PushStage replParser = new PushStage() { - @Override public SyncDirective onPush(String elem, Context ctx) { - if (elem.equals("q")) - return ctx.pushAndFinish(ByteString.fromString("BYE\n")); - else - return ctx.push(ByteString.fromString(elem + "\n")); - } - }; + final Flow replParser = + Flow.create() + .takeWhile(elem -> !elem.equals("q")) + .concat(Source.single("BYE")) // will run after the original flow completes + .map(elem -> ByteString.fromString(elem + "\n")); final Flow repl = Flow.of(ByteString.class) .via(Framing.delimiter(ByteString.fromString("\n"), 256, false)) - .map(bytes -> bytes.utf8String()) + .map(ByteString::utf8String) .map(text -> {System.out.println("Server: " + text); return "next";}) .map(elem -> readLine("> ")) - .transform(() -> replParser); + .via(replParser); connection.join(repl).run(mat); - //#repl-client + //#repl-client } + + serverProbe.expectMsg("Hello world"); serverProbe.expectMsg("What a lovely day"); serverProbe.expectMsg("BYE"); diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeByteStrings.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeByteStrings.java index 9232d21e42..e4519ad559 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeByteStrings.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeByteStrings.java @@ -5,15 +5,11 @@ package docs.stream.javadsl.cookbook; import akka.NotUsed; import akka.actor.ActorSystem; -import akka.stream.ActorMaterializer; -import akka.stream.Materializer; +import akka.stream.*; import akka.stream.javadsl.Flow; import akka.stream.javadsl.Sink; import akka.stream.javadsl.Source; -import akka.stream.stage.Context; -import akka.stream.stage.PushPullStage; -import akka.stream.stage.PushStage; -import akka.stream.stage.SyncDirective; +import akka.stream.stage.*; import akka.testkit.JavaTestKit; import akka.util.ByteString; import org.junit.AfterClass; @@ -24,6 +20,7 @@ import scala.Tuple2; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletionStage; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; @@ -31,19 +28,21 @@ import static org.junit.Assert.assertTrue; public class RecipeByteStrings extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeByteStrings"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); final Source rawBytes = Source.from(Arrays.asList( ByteString.fromArray(new byte[] { 1, 2 }), @@ -57,42 +56,77 @@ public class RecipeByteStrings extends RecipeTest { final int CHUNK_LIMIT = 2; //#bytestring-chunker - class Chunker extends PushPullStage { + class Chunker extends GraphStage> { + private final int chunkSize; - private ByteString buffer = ByteString.empty(); + + public Inlet in = Inlet.create("Chunker.in"); + public Outlet out = Outlet.create("Chunker.out"); + private FlowShape shape = FlowShape.of(in, out); public Chunker(int chunkSize) { this.chunkSize = chunkSize; } @Override - public SyncDirective onPush(ByteString elem, Context ctx) { - buffer = buffer.concat(elem); - return emitChunkOrPull(ctx); + public FlowShape shape() { + return shape; } @Override - public SyncDirective onPull(Context ctx) { - return emitChunkOrPull(ctx); + public GraphStageLogic createLogic(Attributes inheritedAttributes) { + return new GraphStageLogic(shape) { + private ByteString buffer = ByteString.empty(); + + { + setHandler(out, new AbstractOutHandler(){ + @Override + public void onPull() throws Exception { + if (isClosed(in)) emitChunk(); + else pull(in); + } + + }); + + setHandler(in, new AbstractInHandler() { + + @Override + public void onPush() throws Exception { + ByteString elem = grab(in); + buffer = buffer.concat(elem); + emitChunk(); + } + + @Override + public void onUpstreamFinish() throws Exception { + if (buffer.isEmpty()) completeStage(); + // elements left in buffer, keep accepting downstream pulls + // and push from buffer until buffer is emitted + } + }); + } + + private void emitChunk() { + if (buffer.isEmpty()) { + if (isClosed(in)) completeStage(); + else pull(in); + } else { + Tuple2 split = buffer.splitAt(chunkSize); + ByteString chunk = split._1(); + buffer = split._2(); + push(out, chunk); + } + } + }; } - public SyncDirective emitChunkOrPull(Context ctx) { - if (buffer.isEmpty()) { - return ctx.pull(); - } else { - Tuple2 split = buffer.splitAt(chunkSize); - ByteString emit = split._1(); - buffer = split._2(); - return ctx.push(emit); - } - } } //#bytestring-chunker { //#bytestring-chunker2 Source chunksStream = - rawBytes.transform(() -> new Chunker(CHUNK_LIMIT)); + rawBytes.via(new Chunker(CHUNK_LIMIT)); //#bytestring-chunker2 CompletionStage> chunksFuture = chunksStream.limit(10).runWith(Sink.seq(), mat); @@ -119,22 +153,49 @@ public class RecipeByteStrings extends RecipeTest { final int SIZE_LIMIT = 9; //#bytes-limiter - class ByteLimiter extends PushStage { + class ByteLimiter extends GraphStage> { + final long maximumBytes; - private int count = 0; + + public Inlet in = Inlet.create("ByteLimiter.in"); + public Outlet out = Outlet.create("ByteLimiter.out"); + private FlowShape shape = FlowShape.of(in, out); public ByteLimiter(long maximumBytes) { this.maximumBytes = maximumBytes; } @Override - public SyncDirective onPush(ByteString chunk, Context ctx) { - count += chunk.size(); - if (count > maximumBytes) { - return ctx.fail(new IllegalStateException("Too much bytes")); - } else { - return ctx.push(chunk); - } + public FlowShape shape() { + return shape; + } + @Override + public GraphStageLogic createLogic(Attributes inheritedAttributes) { + return new GraphStageLogic(shape) { + private int count = 0; + + { + setHandler(out, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + pull(in); + } + }); + setHandler(in, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + ByteString chunk = grab(in); + count += chunk.size(); + if (count > maximumBytes) { + failStage(new IllegalStateException("Too much bytes")); + } else { + push(out, chunk); + } + } + }); + } + + }; } } //#bytes-limiter @@ -142,7 +203,7 @@ public class RecipeByteStrings extends RecipeTest { { //#bytes-limiter2 Flow limiter = - Flow.of(ByteString.class).transform(() -> new ByteLimiter(SIZE_LIMIT)); + Flow.of(ByteString.class).via(new ByteLimiter(SIZE_LIMIT)); //#bytes-limiter2 final Source bytes1 = Source.from(Arrays.asList( @@ -167,11 +228,12 @@ public class RecipeByteStrings extends RecipeTest { boolean thrown = false; try { bytes2.via(limiter).limit(10).runWith(Sink.seq(), mat).toCompletableFuture().get(3, TimeUnit.SECONDS); - } catch (IllegalStateException ex) { + } catch (ExecutionException ex) { + assertEquals(ex.getCause().getClass(), IllegalStateException.class); thrown = true; } - assertTrue("Expected IllegalStateException to be thrown", thrown); + } }; } @@ -187,7 +249,7 @@ public class RecipeByteStrings extends RecipeTest { ByteString.fromArray(new byte[] { 7, 8, 9 }))); //#compacting-bytestrings - Source compacted = rawBytes.map(bs -> bs.compact()); + Source compacted = rawBytes.map(ByteString::compact); //#compacting-bytestrings List got = compacted.limit(10).runWith(Sink.seq(), mat).toCompletableFuture().get(3, TimeUnit.SECONDS); diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDigest.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDigest.java index 0a9c606f6c..b8a9c8dd1d 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDigest.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDigest.java @@ -5,14 +5,10 @@ package docs.stream.javadsl.cookbook; import akka.NotUsed; import akka.actor.ActorSystem; -import akka.stream.ActorMaterializer; -import akka.stream.Materializer; +import akka.stream.*; import akka.stream.javadsl.Sink; import akka.stream.javadsl.Source; -import akka.stream.stage.Context; -import akka.stream.stage.PushPullStage; -import akka.stream.stage.SyncDirective; -import akka.stream.stage.TerminationDirective; +import akka.stream.stage.*; import akka.testkit.JavaTestKit; import akka.util.ByteString; import org.junit.AfterClass; @@ -21,6 +17,7 @@ import org.junit.Test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.Security; import java.util.Arrays; import java.util.concurrent.TimeUnit; @@ -28,54 +25,84 @@ import static org.junit.Assert.assertEquals; public class RecipeDigest extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeDigest"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); + + //#calculating-digest + class DigestCalculator extends GraphStage> { + private final String algorithm; + public Inlet in = Inlet.create("DigestCalculator.in"); + public Outlet out = Outlet.create("DigestCalculator.out"); + private FlowShape shape = FlowShape.of(in, out); + + public DigestCalculator(String algorithm) { + this.algorithm = algorithm; + } + + @Override + public FlowShape shape() { + return shape; + } + + @Override + public GraphStageLogic createLogic(Attributes inheritedAttributes) { + return new GraphStageLogic(shape) { + final MessageDigest digest; + + { + try { + digest = MessageDigest.getInstance(algorithm); + } catch(NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + + setHandler(out, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + pull(in); + } + }); + setHandler(in, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + ByteString chunk = grab(in); + digest.update(chunk.toArray()); + pull(in); + } + + @Override + public void onUpstreamFinish() throws Exception { + // If the stream is finished, we need to emit the digest + // before completing + emit(out, ByteString.fromArray(digest.digest())); + completeStage(); + } + }); + } + + + }; + } + + } + //#calculating-digest @Test public void work() throws Exception { new JavaTestKit(system) { - //#calculating-digest - public PushPullStage digestCalculator(String algorithm) - throws NoSuchAlgorithmException { - return new PushPullStage() { - final MessageDigest digest = MessageDigest.getInstance(algorithm); - - @Override - public SyncDirective onPush(ByteString chunk, Context ctx) { - digest.update(chunk.toArray()); - return ctx.pull(); - } - - @Override - public SyncDirective onPull(Context ctx) { - if (ctx.isFinishing()) { - return ctx.pushAndFinish(ByteString.fromArray(digest.digest())); - } else { - return ctx.pull(); - } - } - - @Override - public TerminationDirective onUpstreamFinish(Context ctx) { - // If the stream is finished, we need to emit the last element in the onPull block. - // It is not allowed to directly emit elements from a termination block - // (onUpstreamFinish or onUpstreamFailure) - return ctx.absorbTermination(); - } - }; - } - //#calculating-digest { Source data = Source.from(Arrays.asList( @@ -84,7 +111,7 @@ public class RecipeDigest extends RecipeTest { //#calculating-digest2 final Source digest = data - .transform(() -> digestCalculator("SHA-256")); + .via(new DigestCalculator("SHA-256")); //#calculating-digest2 ByteString got = digest.runWith(Sink.head(), mat).toCompletableFuture().get(3, TimeUnit.SECONDS); diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDroppyBroadcast.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDroppyBroadcast.java index e8824f28f8..e70134d889 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDroppyBroadcast.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeDroppyBroadcast.java @@ -20,20 +20,21 @@ import java.util.concurrent.CompletionStage; public class RecipeDroppyBroadcast extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("RecipeLoggingElements"); + system = ActorSystem.create("RecipeDroppyBroadcast"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void work() throws Exception { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeFlattenList.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeFlattenList.java index de2ae6ec15..870ac8092e 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeFlattenList.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeFlattenList.java @@ -22,20 +22,21 @@ import static org.junit.Assert.assertEquals; public class RecipeFlattenList extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeFlattenList"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void workWithMapConcat() throws Exception { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeGlobalRateLimit.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeGlobalRateLimit.java index 13655198ef..505af65848 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeGlobalRateLimit.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeGlobalRateLimit.java @@ -32,20 +32,21 @@ import static junit.framework.TestCase.assertTrue; public class RecipeGlobalRateLimit extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeGlobalRateLimit"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - static //#global-limiter-actor public class Limiter extends AbstractActor { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeHold.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeHold.java index dd851b4e11..004ba4f7a0 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeHold.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeHold.java @@ -5,20 +5,17 @@ package docs.stream.javadsl.cookbook; import akka.actor.ActorSystem; import akka.japi.Pair; -import akka.stream.ActorMaterializer; -import akka.stream.Materializer; +import akka.stream.*; import akka.stream.javadsl.Keep; import akka.stream.javadsl.Sink; import akka.stream.javadsl.Source; -import akka.stream.stage.DetachedContext; -import akka.stream.stage.DetachedStage; -import akka.stream.stage.DownstreamDirective; -import akka.stream.stage.UpstreamDirective; +import akka.stream.stage.*; import akka.stream.testkit.TestPublisher; import akka.stream.testkit.TestSubscriber; import akka.stream.testkit.javadsl.TestSink; import akka.stream.testkit.javadsl.TestSource; import akka.testkit.JavaTestKit; +import akka.util.ByteString; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -28,64 +25,112 @@ import java.util.concurrent.TimeUnit; public class RecipeHold extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("RecipeMultiGroupBy"); + system = ActorSystem.create("RecipeHold"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - //#hold-version-1 - class HoldWithInitial extends DetachedStage { - private T currentValue; + class HoldWithInitial extends GraphStage> { + + public Inlet in = Inlet.create("HoldWithInitial.in"); + public Outlet out = Outlet.create("HoldWithInitial.out"); + private FlowShape shape = FlowShape.of(in, out); + + private final T initial; public HoldWithInitial(T initial) { - currentValue = initial; + this.initial = initial; } @Override - public UpstreamDirective onPush(T elem, DetachedContext ctx) { - currentValue = elem; - return ctx.pull(); + public FlowShape shape() { + return shape; } @Override - public DownstreamDirective onPull(DetachedContext ctx) { - return ctx.push(currentValue); + public GraphStageLogic createLogic(Attributes inheritedAttributes) { + return new GraphStageLogic(shape) { + private T currentValue = initial; + + { + setHandler(in, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + currentValue = grab(in); + pull(in); + } + }); + setHandler(out, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + push(out, currentValue); + } + }); + } + + @Override + public void preStart() { + pull(in); + } + }; } } //#hold-version-1 //#hold-version-2 - class HoldWithWait extends DetachedStage { - private T currentValue = null; - private boolean waitingFirstValue = true; + class HoldWithWait extends GraphStage> { + public Inlet in = Inlet.create("HoldWithInitial.in"); + public Outlet out = Outlet.create("HoldWithInitial.out"); + private FlowShape shape = FlowShape.of(in, out); @Override - public UpstreamDirective onPush(T elem, DetachedContext ctx) { - currentValue = elem; - waitingFirstValue = false; - if (ctx.isHoldingDownstream()) { - return ctx.pushAndPull(currentValue); - } else { - return ctx.pull(); - } + public FlowShape shape() { + return shape; } @Override - public DownstreamDirective onPull(DetachedContext ctx) { - if (waitingFirstValue) { - return ctx.holdDownstream(); - } else { - return ctx.push(currentValue); - } + public GraphStageLogic createLogic(Attributes inheritedAttributes) { + return new GraphStageLogic(shape) { + private T currentValue = null; + private boolean waitingFirstValue = true; + + { + setHandler(in, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + currentValue = grab(in); + if (waitingFirstValue) { + waitingFirstValue = false; + if (isAvailable(out)) push(out, currentValue); + } + pull(in); + } + }); + setHandler(out, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + if (!waitingFirstValue) push(out, currentValue); + } + }); + } + + @Override + public void preStart() { + pull(in); + } + + }; } } //#hold-version-2 @@ -98,7 +143,7 @@ public class RecipeHold extends RecipeTest { final Sink> sink = TestSink.probe(system); Pair, TestSubscriber.Probe> pubSub = - source.transform(() -> new HoldWithInitial<>(0)).toMat(sink, Keep.both()).run(mat); + source.via(new HoldWithInitial<>(0)).toMat(sink, Keep.both()).run(mat); TestPublisher.Probe pub = pubSub.first(); TestSubscriber.Probe sub = pubSub.second(); @@ -126,7 +171,7 @@ public class RecipeHold extends RecipeTest { final Sink> sink = TestSink.probe(system); Pair, TestSubscriber.Probe> pubSub = - source.transform(() -> new HoldWithWait<>()).toMat(sink, Keep.both()).run(mat); + source.via(new HoldWithWait<>()).toMat(sink, Keep.both()).run(mat); TestPublisher.Probe pub = pubSub.first(); TestSubscriber.Probe sub = pubSub.second(); diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeKeepAlive.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeKeepAlive.java index 5d5ee3d622..2dda5845f2 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeKeepAlive.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeKeepAlive.java @@ -18,20 +18,21 @@ import java.util.concurrent.TimeUnit; public class RecipeKeepAlive extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeKeepAlive"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - class Tick {} public final Tick TICK = new Tick(); diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeLoggingElements.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeLoggingElements.java index 051416675f..e8266caba2 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeLoggingElements.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeLoggingElements.java @@ -25,20 +25,21 @@ import java.util.Arrays; public class RecipeLoggingElements extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeLoggingElements", ConfigFactory.parseString("akka.loglevel=DEBUG\nakka.loggers = [akka.testkit.TestEventListener]")); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void workWithPrintln() throws Exception { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeManualTrigger.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeManualTrigger.java index c06fd76667..f038274691 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeManualTrigger.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeManualTrigger.java @@ -22,20 +22,21 @@ import java.util.concurrent.TimeUnit; public class RecipeManualTrigger extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("RecipeKeepAlive"); + system = ActorSystem.create("RecipeManualTrigger"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - class Trigger { } diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMissedTicks.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMissedTicks.java index 63d8f4c17b..7e2157706f 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMissedTicks.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMissedTicks.java @@ -29,20 +29,21 @@ import java.util.concurrent.TimeUnit; public class RecipeMissedTicks extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("RecipeMultiGroupBy"); + system = ActorSystem.create("RecipeMissedTicks"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void work() throws Exception { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMultiGroupByTest.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMultiGroupByTest.java index 73080f89ff..905be54919 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMultiGroupByTest.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeMultiGroupByTest.java @@ -31,20 +31,21 @@ import static junit.framework.TestCase.assertTrue; public class RecipeMultiGroupByTest extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeMultiGroupBy"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - static class Topic { private final String name; diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeParseLines.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeParseLines.java index a25b62ef9a..f97bec000c 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeParseLines.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeParseLines.java @@ -22,20 +22,21 @@ import java.util.concurrent.TimeUnit; public class RecipeParseLines extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("RecipeLoggingElements"); + system = ActorSystem.create("RecipeParseLines"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void parseLines() throws Exception { final Source rawData = Source.from(Arrays.asList( diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeReduceByKeyTest.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeReduceByKeyTest.java index 4ad5cae04b..49ac2c3990 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeReduceByKeyTest.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeReduceByKeyTest.java @@ -31,20 +31,21 @@ import java.util.stream.Collectors; public class RecipeReduceByKeyTest extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { - system = ActorSystem.create("RecipeLoggingElements"); + system = ActorSystem.create("RecipeReduceByKey"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void work() throws Exception { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSeq.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSeq.java index 8957040b4e..4ddae66123 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSeq.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSeq.java @@ -24,20 +24,20 @@ import java.util.concurrent.TimeUnit; public class RecipeSeq extends RecipeTest { static ActorSystem system; - + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeLoggingElements"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void drainSourceToList() throws Exception { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSimpleDrop.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSimpleDrop.java index a4b6003f9d..fb91b893f5 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSimpleDrop.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeSimpleDrop.java @@ -25,20 +25,21 @@ import java.util.concurrent.TimeUnit; public class RecipeSimpleDrop extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeSimpleDrop"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - @Test public void work() throws Exception { new JavaTestKit(system) { diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeTest.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeTest.java index c4f93a76a3..e74b5cdeb0 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeTest.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeTest.java @@ -1,6 +1,8 @@ package docs.stream.javadsl.cookbook; -public class RecipeTest { +import docs.AbstractJavaTest; + +public abstract class RecipeTest extends AbstractJavaTest { final class Message { public final String msg; diff --git a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeWorkerPool.java b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeWorkerPool.java index c90a756ad2..2e33894122 100644 --- a/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeWorkerPool.java +++ b/akka-docs/rst/java/code/docs/stream/javadsl/cookbook/RecipeWorkerPool.java @@ -24,20 +24,21 @@ import static org.junit.Assert.assertTrue; public class RecipeWorkerPool extends RecipeTest { static ActorSystem system; + static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeWorkerPool"); + mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; + mat = null; } - final Materializer mat = ActorMaterializer.create(system); - //#worker-pool public static Flow balancer( Flow worker, int workerCount) { diff --git a/akka-docs/rst/java/http/server-side/low-level-server-side-api.rst b/akka-docs/rst/java/http/server-side/low-level-server-side-api.rst index ec883e5e26..1dc660ad0c 100644 --- a/akka-docs/rst/java/http/server-side/low-level-server-side-api.rst +++ b/akka-docs/rst/java/http/server-side/low-level-server-side-api.rst @@ -210,7 +210,7 @@ through the stream starting from the stage which failed, all the way downstream Connections Source failures ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In the example below we add a custom ``PushStage`` (see :ref:`stream-customize-java`) in order to react to the +In the example below we add a custom ``GraphStage`` (see :ref:`stream-customize-java`) in order to react to the stream's failure. We signal a ``failureMonitor`` actor with the cause why the stream is going down, and let the Actor handle the rest – maybe it'll decide to restart the server or shutdown the ActorSystem, that however is not our concern anymore. diff --git a/akka-docs/rst/java/stream/stream-cookbook.rst b/akka-docs/rst/java/stream/stream-cookbook.rst index 3775870f89..bdd138d62e 100644 --- a/akka-docs/rst/java/stream/stream-cookbook.rst +++ b/akka-docs/rst/java/stream/stream-cookbook.rst @@ -75,17 +75,15 @@ Calculating the digest of a ByteString stream **Situation:** A stream of bytes is given as a stream of ``ByteStrings`` and we want to calculate the cryptographic digest of the stream. -This recipe uses a :class:`PushPullStage` to host a mutable :class:`MessageDigest` class (part of the Java Cryptography +This recipe uses a :class:`GraphStage` to host a mutable :class:`MessageDigest` class (part of the Java Cryptography API) and update it with the bytes arriving from the stream. When the stream starts, the ``onPull`` handler of the stage is called, which just bubbles up the ``pull`` event to its upstream. As a response to this pull, a ByteString chunk will arrive (``onPush``) which we use to update the digest, then it will pull for the next chunk. Eventually the stream of ``ByteStrings`` depletes and we get a notification about this event via ``onUpstreamFinish``. -At this point we want to emit the digest value, but we cannot do it in this handler directly. Instead we call -``ctx.absorbTermination()`` signalling to our context that we do not yet want to finish. When the environment decides that -we can emit further elements ``onPull`` is called again, and we see ``ctx.isFinishing()`` returning ``true`` (since the upstream -source has been depleted already). Since we only want to emit a final element it is enough to call ``ctx.pushAndFinish`` -passing the digest ByteString to be emitted. +At this point we want to emit the digest value, but we cannot do it with ``push`` in this handler directly since there may +be no downstream demand. Instead we call ``emit`` which will temporarily replace the handlers, emit the provided value when +demand comes in and then reset the stage state. It will then complete the stage. .. includecode:: ../code/docs/stream/javadsl/cookbook/RecipeDigest.java#calculating-digest @@ -278,14 +276,11 @@ Create a stream processor that repeats the last element seen of them is slowing down the other by dropping earlier unconsumed elements from the upstream if necessary, and repeating the last value for the downstream if necessary. -We have two options to implement this feature. In both cases we will use :class:`DetachedStage` to build our custom -element (:class:`DetachedStage` is specifically designed for rate translating elements just like ``conflate``, -``expand`` or ``buffer``). In the first version we will use a provided initial value ``initial`` that will be used +We have two options to implement this feature. In both cases we will use :class:`GraphStage` to build our custom +element. In the first version we will use a provided initial value ``initial`` that will be used to feed the downstream if no upstream element is ready yet. In the ``onPush()`` handler we just overwrite the -``currentValue`` variable and immediately relieve the upstream by calling ``pull()`` (remember, implementations of -:class:`DetachedStage` are not allowed to call ``push()`` as a response to ``onPush()`` or call ``pull()`` as a response -of ``onPull()``). The downstream ``onPull`` handler is very similar, we immediately relieve the downstream by -emitting ``currentValue``. +``currentValue`` variable and immediately relieve the upstream by calling ``pull()``. The downstream ``onPull`` handler +is very similar, we immediately relieve the downstream by emitting ``currentValue``. .. includecode:: ../code/docs/stream/javadsl/cookbook/RecipeHold.java#hold-version-1 @@ -296,9 +291,9 @@ case: if the very first element is not yet available. We introduce a boolean variable ``waitingFirstValue`` to denote whether the first element has been provided or not (alternatively an :class:`Optional` can be used for ``currentValue`` or if the element type is a subclass of Object a null can be used with the same purpose). In the downstream ``onPull()`` handler the difference from the previous -version is that we call ``holdDownstream()`` if the first element is not yet available and thus blocking our downstream. The -upstream ``onPush()`` handler sets ``waitingFirstValue`` to false, and after checking if ``holdDownstream()`` has been called it -either relieves the upstream producer, or both the upstream producer and downstream consumer by calling ``pushAndPull()`` +version is that we check if we have received the the first value and only emit if we have. This leads to that when the +first element comes in we must check if there possibly already was demand from downstream so that we in that case can +push the element directly. .. includecode:: ../code/docs/stream/javadsl/cookbook/RecipeHold.java#hold-version-2 @@ -343,14 +338,14 @@ Chunking up a stream of ByteStrings into limited size ByteStrings the same sequence, but capping the size of ByteStrings. In other words we want to slice up ByteStrings into smaller chunks if they exceed a size threshold. -This can be achieved with a single :class:`PushPullStage`. The main logic of our stage is in ``emitChunkOrPull()`` +This can be achieved with a single :class:`GraphStage`. The main logic of our stage is in ``emitChunk()`` which implements the following logic: -* if the buffer is empty, we pull for more bytes +* if the buffer is empty, and upstream is not closed we pull for more bytes, if it is closed we complete * if the buffer is nonEmpty, we split it according to the ``chunkSize``. This will give a next chunk that we will emit, and an empty or nonempty remaining buffer. -Both ``onPush()`` and ``onPull()`` calls ``emitChunkOrPull()`` the only difference is that the push handler also stores +Both ``onPush()`` and ``onPull()`` calls ``emitChunk()`` the only difference is that the push handler also stores the incoming chunk by appending to the end of the buffer. .. includecode:: ../code/docs/stream/javadsl/cookbook/RecipeByteStrings.java#bytestring-chunker @@ -363,7 +358,7 @@ Limit the number of bytes passing through a stream of ByteStrings **Situation:** Given a stream of ByteStrings we want to fail the stream if more than a given maximum of bytes has been consumed. -This recipe uses a :class:`PushStage` to implement the desired feature. In the only handler we override, +This recipe uses a :class:`GraphStage` to implement the desired feature. In the only handler we override, ``onPush()`` we just update a counter and see if it gets larger than ``maximumBytes``. If a violation happens we signal failure, otherwise we forward the chunk we have received. diff --git a/akka-docs/rst/java/stream/stream-flows-and-basics.rst b/akka-docs/rst/java/stream/stream-flows-and-basics.rst index aadc3b3bc6..2e68327e57 100644 --- a/akka-docs/rst/java/stream/stream-flows-and-basics.rst +++ b/akka-docs/rst/java/stream/stream-flows-and-basics.rst @@ -36,9 +36,8 @@ Graph is running. Processing Stage The common name for all building blocks that build up a Graph. - Examples of a processing stage would be operations like ``map()``, ``filter()``, stages added by ``transform()`` like - :class:`PushStage`, :class:`PushPullStage`, :class:`StatefulStage` and graph junctions like ``Merge`` or ``Broadcast``. - For the full list of built-in processing stages see :ref:`stages-overview_java` + Examples of a processing stage would be operations like ``map()``, ``filter()``, custom ``GraphStage`` s and graph + junctions like ``Merge`` or ``Broadcast``. For the full list of built-in processing stages see :ref:`stages-overview_java` When we talk about *asynchronous, non-blocking backpressure* we mean that the processing stages available in Akka Streams will not use blocking calls but asynchronous message passing to exchange messages between each other, and they diff --git a/akka-docs/rst/java/stream/stream-io.rst b/akka-docs/rst/java/stream/stream-io.rst index 17f2bdc12a..d3fb4fd808 100644 --- a/akka-docs/rst/java/stream/stream-io.rst +++ b/akka-docs/rst/java/stream/stream-io.rst @@ -86,16 +86,11 @@ it makes sense to make the Server initiate the conversation by emitting a "hello .. includecode:: ../code/docs/stream/io/StreamTcpDocTest.java#welcome-banner-chat-server -The way we constructed a :class:`Flow` using the :class:`GraphDSL` is explained in detail in -:ref:`constructing-sources-sinks-flows-from-partial-graphs-java`, however the basic concepts is rather simple– -we can encapsulate arbitrarily complex logic within a :class:`Flow` as long as it exposes the same interface, which means -exposing exactly one :class:`Outlet` and exactly one :class:`Inlet` which will be connected to the TCP -pipeline. In this example we use a :class:`Concat` graph processing stage to inject the initial message, and then -continue with handling all incoming data using the echo handler. You should use this pattern of encapsulating complex -logic in Flows and attaching those to :class:`StreamIO` in order to implement your custom and possibly sophisticated TCP servers. +To emit the initial message we merge a ``Source`` with a single element, after the command processing but before the +framing and transformation to ``ByteStrings`` this way we do not have to repeat such logic. In this example both client and server may need to close the stream based on a parsed command - ``BYE`` in the case -of the server, and ``q`` in the case of the client. This is implemented by using a custom :class:`PushStage` +of the server, and ``q`` in the case of the client. This is implemented by using a custom :class:`GraphStage` which completes the stream once it encounters such command. Streaming File IO diff --git a/akka-docs/rst/scala/code/docs/http/scaladsl/HttpServerExampleSpec.scala b/akka-docs/rst/scala/code/docs/http/scaladsl/HttpServerExampleSpec.scala index 2733e221ce..924a9ad6c5 100644 --- a/akka-docs/rst/scala/code/docs/http/scaladsl/HttpServerExampleSpec.scala +++ b/akka-docs/rst/scala/code/docs/http/scaladsl/HttpServerExampleSpec.scala @@ -11,7 +11,6 @@ import akka.http.scaladsl.Http.ServerBinding import akka.http.scaladsl.model._ import akka.stream.ActorMaterializer import akka.stream.scaladsl.{ Flow, Sink } -import akka.stream.stage.{ Context, PushStage } import akka.testkit.TestActors import org.scalatest.{ Matchers, WordSpec } import scala.language.postfixOps @@ -107,17 +106,9 @@ class HttpServerExampleSpec extends WordSpec with Matchers { val failureMonitor: ActorRef = system.actorOf(MyExampleMonitoringActor.props) val reactToTopLevelFailures = Flow[IncomingConnection] - .transform { () => - new PushStage[IncomingConnection, IncomingConnection] { - override def onPush(elem: IncomingConnection, ctx: Context[IncomingConnection]) = - ctx.push(elem) - - override def onUpstreamFailure(cause: Throwable, ctx: Context[IncomingConnection]) = { - failureMonitor ! cause - super.onUpstreamFailure(cause, ctx) - } - } - } + .watchTermination()((_, termination) => termination.onFailure { + case cause => failureMonitor ! cause + }) serverSource .via(reactToTopLevelFailures) @@ -134,16 +125,10 @@ class HttpServerExampleSpec extends WordSpec with Matchers { val serverSource = Http().bind(host, port) val reactToConnectionFailure = Flow[HttpRequest] - .transform { () => - new PushStage[HttpRequest, HttpRequest] { - override def onPush(elem: HttpRequest, ctx: Context[HttpRequest]) = - ctx.push(elem) - - override def onUpstreamFailure(cause: Throwable, ctx: Context[HttpRequest]) = { - // handle the failure somehow - super.onUpstreamFailure(cause, ctx) - } - } + .recover[HttpRequest] { + case ex => + // handle the failure somehow + throw ex } val httpEcho = Flow[HttpRequest] diff --git a/akka-docs/rst/scala/code/docs/stream/BidiFlowDocSpec.scala b/akka-docs/rst/scala/code/docs/stream/BidiFlowDocSpec.scala index 2182a5b190..2d3959a676 100644 --- a/akka-docs/rst/scala/code/docs/stream/BidiFlowDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/stream/BidiFlowDocSpec.scala @@ -66,52 +66,68 @@ object BidiFlowDocSpec { ByteString.newBuilder.putInt(len).append(bytes).result() } - class FrameParser extends PushPullStage[ByteString, ByteString] { - // this holds the received but not yet parsed bytes - var stash = ByteString.empty - // this holds the current message length or -1 if at a boundary - var needed = -1 + class FrameParser extends GraphStage[FlowShape[ByteString, ByteString]] { - override def onPush(bytes: ByteString, ctx: Context[ByteString]) = { - stash ++= bytes - run(ctx) - } - override def onPull(ctx: Context[ByteString]) = run(ctx) - override def onUpstreamFinish(ctx: Context[ByteString]) = - if (stash.isEmpty) ctx.finish() - else ctx.absorbTermination() // we still have bytes to emit + val in = Inlet[ByteString]("FrameParser.in") + val out = Outlet[ByteString]("FrameParser.out") + override val shape = FlowShape.of(in, out) - private def run(ctx: Context[ByteString]): SyncDirective = - if (needed == -1) { - // are we at a boundary? then figure out next length - if (stash.length < 4) pullOrFinish(ctx) - else { - needed = stash.iterator.getInt - stash = stash.drop(4) - run(ctx) // cycle back to possibly already emit the next chunk + override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) { + + // this holds the received but not yet parsed bytes + var stash = ByteString.empty + // this holds the current message length or -1 if at a boundary + var needed = -1 + + setHandler(out, new OutHandler { + override def onPull(): Unit = { + if (isClosed(in)) run() + else pull(in) + } + }) + setHandler(in, new InHandler { + override def onPush(): Unit = { + val bytes = grab(in) + stash = stash ++ bytes + run() } - } else if (stash.length < needed) { - // we are in the middle of a message, need more bytes - pullOrFinish(ctx) - } else { - // we have enough to emit at least one message, so do it - val emit = stash.take(needed) - stash = stash.drop(needed) - needed = -1 - ctx.push(emit) - } - /* - * After having called absorbTermination() we cannot pull any more, so if we need - * more data we will just have to give up. - */ - private def pullOrFinish(ctx: Context[ByteString]) = - if (ctx.isFinishing) ctx.finish() - else ctx.pull() + override def onUpstreamFinish(): Unit = { + if (stash.isEmpty) completeStage() + // wait with completion and let run() complete when the + // rest of the stash has been sent downstream + } + }) + + private def run(): Unit = { + if (needed == -1) { + // are we at a boundary? then figure out next length + if (stash.length < 4) { + if (isClosed(in)) completeStage() + else pull(in) + } else { + needed = stash.iterator.getInt + stash = stash.drop(4) + run() // cycle back to possibly already emit the next chunk + } + } else if (stash.length < needed) { + // we are in the middle of a message, need more bytes, + // or have to stop if input closed + if (isClosed(in)) completeStage() + else pull(in) + } else { + // we have enough to emit at least one message, so do it + val emit = stash.take(needed) + stash = stash.drop(needed) + needed = -1 + push(out, emit) + } + } + } } val outbound = b.add(Flow[ByteString].map(addLengthHeader)) - val inbound = b.add(Flow[ByteString].transform(() => new FrameParser)) + val inbound = b.add(Flow[ByteString].via(new FrameParser)) BidiShape.fromFlows(outbound, inbound) }) //#framing diff --git a/akka-docs/rst/scala/code/docs/stream/FlowStagesSpec.scala b/akka-docs/rst/scala/code/docs/stream/FlowStagesSpec.scala deleted file mode 100644 index 28f79286b4..0000000000 --- a/akka-docs/rst/scala/code/docs/stream/FlowStagesSpec.scala +++ /dev/null @@ -1,192 +0,0 @@ -package docs.stream - -import akka.stream._ -import akka.stream.scaladsl.{ Sink, Source, Flow, Keep } -import akka.stream.testkit.AkkaSpec -import org.scalatest.concurrent.ScalaFutures - -import scala.collection.immutable -import scala.concurrent.Await -import scala.concurrent.duration._ - -class FlowStagesSpec extends AkkaSpec with ScalaFutures { - //#import-stage - import akka.stream.stage._ - //#import-stage - - implicit val materializer = ActorMaterializer() - - "stages demo" must { - - "demonstrate various PushPullStages" in { - - //#one-to-one - class Map[A, B](f: A => B) extends PushPullStage[A, B] { - override def onPush(elem: A, ctx: Context[B]): SyncDirective = - ctx.push(f(elem)) - - override def onPull(ctx: Context[B]): SyncDirective = - ctx.pull() - } - //#one-to-one - - //#many-to-one - class Filter[A](p: A => Boolean) extends PushPullStage[A, A] { - override def onPush(elem: A, ctx: Context[A]): SyncDirective = - if (p(elem)) ctx.push(elem) - else ctx.pull() - - override def onPull(ctx: Context[A]): SyncDirective = - ctx.pull() - } - //#many-to-one - - //#one-to-many - class Duplicator[A]() extends PushPullStage[A, A] { - private var lastElem: A = _ - private var oneLeft = false - - override def onPush(elem: A, ctx: Context[A]): SyncDirective = { - lastElem = elem - oneLeft = true - ctx.push(elem) - } - - override def onPull(ctx: Context[A]): SyncDirective = - if (!ctx.isFinishing) { - // the main pulling logic is below as it is demonstrated on the illustration - if (oneLeft) { - oneLeft = false - ctx.push(lastElem) - } else - ctx.pull() - } else { - // If we need to emit a final element after the upstream - // finished - if (oneLeft) ctx.pushAndFinish(lastElem) - else ctx.finish() - } - - override def onUpstreamFinish(ctx: Context[A]): TerminationDirective = - ctx.absorbTermination() - - } - //#one-to-many - - val keyedSink = Sink.head[immutable.Seq[Int]] - val sink = Flow[Int].grouped(10).toMat(keyedSink)(Keep.right) - - //#stage-chain - val resultFuture = Source(1 to 10) - .transform(() => new Filter(_ % 2 == 0)) - .transform(() => new Duplicator()) - .transform(() => new Map(_ / 2)) - .runWith(sink) - //#stage-chain - - Await.result(resultFuture, 3.seconds) should be(Seq(1, 1, 2, 2, 3, 3, 4, 4, 5, 5)) - - } - - "demonstrate various PushStages" in { - - import akka.stream.stage._ - - //#pushstage - class Map[A, B](f: A => B) extends PushStage[A, B] { - override def onPush(elem: A, ctx: Context[B]): SyncDirective = - ctx.push(f(elem)) - } - - class Filter[A](p: A => Boolean) extends PushStage[A, A] { - override def onPush(elem: A, ctx: Context[A]): SyncDirective = - if (p(elem)) ctx.push(elem) - else ctx.pull() - } - //#pushstage - } - - "demonstrate GraphStage" in { - - //#doubler-stateful - class Duplicator[A] extends GraphStage[FlowShape[A, A]] { - val in = Inlet[A]("Duplicator.in") - val out = Outlet[A]("Duplicator.out") - - val shape: FlowShape[A, A] = FlowShape(in, out) - - override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = - new GraphStageLogic(shape) { - setHandler(in, new InHandler { - override def onPush(): Unit = { - val elem = grab(in) - emitMultiple(out, List(elem, elem)) - } - }) - - setHandler(out, new OutHandler { - override def onPull(): Unit = pull(in) - }) - } - } - //#doubler-stateful - - val duplicator = Flow.fromGraph(new Duplicator[Int]) - val fold = Source(1 to 2).via(duplicator).runFold("")(_ + _) - whenReady(fold) { s ⇒ - s should be("1122") - } - - } - - "demonstrate DetachedStage" in { - //#detached - class Buffer2[T]() extends DetachedStage[T, T] { - private var buf = Vector.empty[T] - private var capacity = 2 - - private def isFull = capacity == 0 - private def isEmpty = capacity == 2 - - private def dequeue(): T = { - capacity += 1 - val next = buf.head - buf = buf.tail - next - } - - private def enqueue(elem: T) = { - capacity -= 1 - buf = buf :+ elem - } - - override def onPull(ctx: DetachedContext[T]): DownstreamDirective = { - if (isEmpty) { - if (ctx.isFinishing) ctx.finish() // No more elements will arrive - else ctx.holdDownstream() // waiting until new elements - } else { - val next = dequeue() - if (ctx.isHoldingUpstream) ctx.pushAndPull(next) // release upstream - else ctx.push(next) - } - } - - override def onPush(elem: T, ctx: DetachedContext[T]): UpstreamDirective = { - enqueue(elem) - if (isFull) ctx.holdUpstream() // Queue is now full, wait until new empty slot - else { - if (ctx.isHoldingDownstream) ctx.pushAndPull(dequeue()) // Release downstream - else ctx.pull() - } - } - - override def onUpstreamFinish(ctx: DetachedContext[T]): TerminationDirective = { - if (!isEmpty) ctx.absorbTermination() // still need to flush from buffer - else ctx.finish() // already empty, finishing - } - } - //#detached - } - } - -} diff --git a/akka-docs/rst/scala/code/docs/stream/GraphStageDocSpec.scala b/akka-docs/rst/scala/code/docs/stream/GraphStageDocSpec.scala index c25d68100d..54859c00c7 100644 --- a/akka-docs/rst/scala/code/docs/stream/GraphStageDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/stream/GraphStageDocSpec.scala @@ -9,6 +9,7 @@ import akka.stream.stage._ import akka.stream._ import akka.stream.testkit.{ TestPublisher, TestSubscriber, AkkaSpec } +import akka.testkit.TestLatch import scala.collection.mutable import scala.concurrent.{ Promise, Await, Future } @@ -271,6 +272,7 @@ class GraphStageDocSpec extends AkkaSpec { "Demonstrate an asynchronous side channel" in { import system.dispatcher + //#async-side-channel // will close upstream when the future completes class KillSwitch[A](switch: Future[Unit]) extends GraphStage[FlowShape[A, A]] { @@ -301,20 +303,31 @@ class GraphStageDocSpec extends AkkaSpec { //#async-side-channel // tests: + val switch = Promise[Unit]() val duplicator = Flow.fromGraph(new KillSwitch[Int](switch.future)) - // TODO this is probably racey, is there a way to make sure it happens after? - val valueAfterKill = switch.future.flatMap(_ => Future(4)) + val in = TestPublisher.probe[Int]() + val out = TestSubscriber.probe[Int]() - val result = - Source(Vector(1, 2, 3)).concat(Source.fromFuture(valueAfterKill)) - .via(duplicator) - .runFold(Seq.empty[Int])((elem, acc) => elem :+ acc) + Source.fromPublisher(in) + .via(duplicator) + .to(Sink.fromSubscriber(out)) + .withAttributes(Attributes.inputBuffer(1, 1)) + .run() + + val sub = in.expectSubscription() + + out.request(1) + + sub.expectRequest() + sub.sendNext(1) + + out.expectNext(1) switch.success(Unit) - Await.result(result, 3.seconds) should ===(Seq(1, 2, 3)) + out.expectComplete() } "Demonstrate a graph stage with a timer" in { diff --git a/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeByteStrings.scala b/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeByteStrings.scala index 28248ac255..8f3ddab71d 100644 --- a/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeByteStrings.scala +++ b/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeByteStrings.scala @@ -1,6 +1,7 @@ package docs.stream.cookbook import akka.NotUsed +import akka.stream.{ Attributes, Outlet, Inlet, FlowShape } import akka.stream.scaladsl.{ Flow, Sink, Source } import akka.util.ByteString @@ -18,34 +19,49 @@ class RecipeByteStrings extends RecipeSpec { //#bytestring-chunker import akka.stream.stage._ - class Chunker(val chunkSize: Int) extends PushPullStage[ByteString, ByteString] { - private var buffer = ByteString.empty + class Chunker(val chunkSize: Int) extends GraphStage[FlowShape[ByteString, ByteString]] { + val in = Inlet[ByteString]("Chunker.in") + val out = Outlet[ByteString]("Chunker.out") + override val shape = FlowShape.of(in, out) - override def onPush(elem: ByteString, ctx: Context[ByteString]): SyncDirective = { - buffer ++= elem - emitChunkOrPull(ctx) - } + override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) { + private var buffer = ByteString.empty - override def onPull(ctx: Context[ByteString]): SyncDirective = emitChunkOrPull(ctx) + setHandler(out, new OutHandler { + override def onPull(): Unit = { + if (isClosed(in)) emitChunk() + else pull(in) + } + }) + setHandler(in, new InHandler { + override def onPush(): Unit = { + val elem = grab(in) + buffer ++= elem + emitChunk() + } - override def onUpstreamFinish(ctx: Context[ByteString]): TerminationDirective = - if (buffer.nonEmpty) ctx.absorbTermination() - else ctx.finish() + override def onUpstreamFinish(): Unit = { + if (buffer.isEmpty) completeStage() + // elements left in buffer, keep accepting downstream pulls + // and push from buffer until buffer is emitted + } + }) - private def emitChunkOrPull(ctx: Context[ByteString]): SyncDirective = { - if (buffer.isEmpty) { - if (ctx.isFinishing) ctx.finish() - else ctx.pull() - } else { - val (emit, nextBuffer) = buffer.splitAt(chunkSize) - buffer = nextBuffer - ctx.push(emit) + private def emitChunk(): Unit = { + if (buffer.isEmpty) { + if (isClosed(in)) completeStage() + else pull(in) + } else { + val (chunk, nextBuffer) = buffer.splitAt(chunkSize) + buffer = nextBuffer + push(out, chunk) + } } - } + } } - val chunksStream = rawBytes.transform(() => new Chunker(ChunkLimit)) + val chunksStream = rawBytes.via(new Chunker(ChunkLimit)) //#bytestring-chunker val chunksFuture = chunksStream.limit(10).runWith(Sink.seq) @@ -61,17 +77,31 @@ class RecipeByteStrings extends RecipeSpec { //#bytes-limiter import akka.stream.stage._ - class ByteLimiter(val maximumBytes: Long) extends PushStage[ByteString, ByteString] { - private var count = 0 + class ByteLimiter(val maximumBytes: Long) extends GraphStage[FlowShape[ByteString, ByteString]] { + val in = Inlet[ByteString]("ByteLimiter.in") + val out = Outlet[ByteString]("ByteLimiter.out") + override val shape = FlowShape.of(in, out) - override def onPush(chunk: ByteString, ctx: Context[ByteString]): SyncDirective = { - count += chunk.size - if (count > maximumBytes) ctx.fail(new IllegalStateException("Too much bytes")) - else ctx.push(chunk) + override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) { + private var count = 0 + + setHandlers(in, out, new InHandler with OutHandler { + + override def onPull(): Unit = { + pull(in) + } + + override def onPush(): Unit = { + val chunk = grab(in) + count += chunk.size + if (count > maximumBytes) failStage(new IllegalStateException("Too much bytes")) + else push(out, chunk) + } + }) } } - val limiter = Flow[ByteString].transform(() => new ByteLimiter(SizeLimit)) + val limiter = Flow[ByteString].via(new ByteLimiter(SizeLimit)) //#bytes-limiter val bytes1 = Source(List(ByteString(1, 2), ByteString(3), ByteString(4, 5, 6), ByteString(7, 8, 9))) diff --git a/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeDigest.scala b/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeDigest.scala index 2ad50e1c27..cd43252e70 100644 --- a/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeDigest.scala +++ b/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeDigest.scala @@ -3,6 +3,7 @@ package docs.stream.cookbook import java.security.MessageDigest import akka.NotUsed +import akka.stream.{ Attributes, Outlet, Inlet, FlowShape } import akka.stream.scaladsl.{ Sink, Source } import akka.util.ByteString @@ -21,28 +22,36 @@ class RecipeDigest extends RecipeSpec { //#calculating-digest import akka.stream.stage._ - def digestCalculator(algorithm: String) = new PushPullStage[ByteString, ByteString] { - val digest = MessageDigest.getInstance(algorithm) + class DigestCalculator(algorithm: String) extends GraphStage[FlowShape[ByteString, ByteString]] { + val in = Inlet[ByteString]("DigestCalculator.in") + val out = Outlet[ByteString]("DigestCalculator.out") + override val shape = FlowShape.of(in, out) - override def onPush(chunk: ByteString, ctx: Context[ByteString]): SyncDirective = { - digest.update(chunk.toArray) - ctx.pull() - } + override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) { + val digest = MessageDigest.getInstance(algorithm) - override def onPull(ctx: Context[ByteString]): SyncDirective = { - if (ctx.isFinishing) ctx.pushAndFinish(ByteString(digest.digest())) - else ctx.pull() - } + setHandler(out, new OutHandler { + override def onPull(): Trigger = { + pull(in) + } + }) + + setHandler(in, new InHandler { + override def onPush(): Trigger = { + val chunk = grab(in) + digest.update(chunk.toArray) + pull(in) + } + + override def onUpstreamFinish(): Unit = { + emit(out, ByteString(digest.digest())) + completeStage() + } + }) - override def onUpstreamFinish(ctx: Context[ByteString]): TerminationDirective = { - // If the stream is finished, we need to emit the last element in the onPull block. - // It is not allowed to directly emit elements from a termination block - // (onUpstreamFinish or onUpstreamFailure) - ctx.absorbTermination() } } - - val digest: Source[ByteString, NotUsed] = data.transform(() => digestCalculator("SHA-256")) + val digest: Source[ByteString, NotUsed] = data.via(new DigestCalculator("SHA-256")) //#calculating-digest Await.result(digest.runWith(Sink.head), 3.seconds) should be( diff --git a/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeHold.scala b/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeHold.scala index 928392e8ca..6b8cd8b511 100644 --- a/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeHold.scala +++ b/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeHold.scala @@ -1,5 +1,6 @@ package docs.stream.cookbook +import akka.stream.Attributes import akka.stream.scaladsl.{ Sink, Source } import akka.stream.testkit._ @@ -7,40 +8,68 @@ import scala.concurrent.duration._ object HoldOps { //#hold-version-1 + import akka.stream._ import akka.stream.stage._ - class HoldWithInitial[T](initial: T) extends DetachedStage[T, T] { - private var currentValue: T = initial + final class HoldWithInitial[T](initial: T) extends GraphStage[FlowShape[T, T]] { + val in = Inlet[T]("HoldWithInitial.in") + val out = Outlet[T]("HoldWithInitial.out") - override def onPush(elem: T, ctx: DetachedContext[T]): UpstreamDirective = { - currentValue = elem - ctx.pull() - } + override val shape = FlowShape.of(in, out) - override def onPull(ctx: DetachedContext[T]): DownstreamDirective = { - ctx.push(currentValue) + override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) { + private var currentValue: T = initial + + setHandlers(in, out, new InHandler with OutHandler { + override def onPush(): Unit = { + currentValue = grab(in) + pull(in) + } + + override def onPull(): Unit = { + push(out, currentValue) + } + }) + + override def preStart(): Unit = { + pull(in) + } } } //#hold-version-1 //#hold-version-2 + import akka.stream._ import akka.stream.stage._ - class HoldWithWait[T] extends DetachedStage[T, T] { - private var currentValue: T = _ - private var waitingFirstValue = true + final class HoldWithWait[T] extends GraphStage[FlowShape[T, T]] { + val in = Inlet[T]("HoldWithWait.in") + val out = Outlet[T]("HoldWithWait.out") - override def onPush(elem: T, ctx: DetachedContext[T]): UpstreamDirective = { - currentValue = elem - waitingFirstValue = false - if (ctx.isHoldingDownstream) ctx.pushAndPull(currentValue) - else ctx.pull() + override val shape = FlowShape.of(in, out) + + override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) { + private var currentValue: T = _ + private var waitingFirstValue = true + + setHandlers(in, out, new InHandler with OutHandler { + override def onPush(): Unit = { + currentValue = grab(in) + if (waitingFirstValue) { + waitingFirstValue = false + if (isAvailable(out)) push(out, currentValue) + } + pull(in) + } + + override def onPull(): Unit = { + if (!waitingFirstValue) push(out, currentValue) + } + }) + + override def preStart(): Unit = { + pull(in) + } } - - override def onPull(ctx: DetachedContext[T]): DownstreamDirective = { - if (waitingFirstValue) ctx.holdDownstream() - else ctx.push(currentValue) - } - } //#hold-version-2 } @@ -57,7 +86,9 @@ class RecipeHold extends RecipeSpec { val source = Source.fromPublisher(pub) val sink = Sink.fromSubscriber(sub) - source.transform(() => new HoldWithInitial(0)).to(sink).run() + source.via(new HoldWithInitial(0)).to(sink) + .withAttributes(Attributes.inputBuffer(1, 1)) + .run() val subscription = sub.expectSubscription() sub.expectNoMsg(100.millis) @@ -87,7 +118,7 @@ class RecipeHold extends RecipeSpec { val source = Source.fromPublisher(pub) val sink = Sink.fromSubscriber(sub) - source.transform(() => new HoldWithWait).to(sink).run() + source.via(new HoldWithWait).to(sink).run() val subscription = sub.expectSubscription() sub.expectNoMsg(100.millis) diff --git a/akka-docs/rst/scala/code/docs/stream/io/StreamTcpDocSpec.scala b/akka-docs/rst/scala/code/docs/stream/io/StreamTcpDocSpec.scala index aad39f6f16..d861fe26ba 100644 --- a/akka-docs/rst/scala/code/docs/stream/io/StreamTcpDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/stream/io/StreamTcpDocSpec.scala @@ -8,7 +8,6 @@ import java.util.concurrent.atomic.AtomicReference import akka.stream._ import akka.stream.scaladsl.Tcp._ import akka.stream.scaladsl._ -import akka.stream.stage.{ Context, PushStage, SyncDirective } import akka.stream.testkit.AkkaSpec import akka.testkit.TestProbe import akka.util.ByteString @@ -70,46 +69,29 @@ class StreamTcpDocSpec extends AkkaSpec { import akka.stream.io.Framing //#welcome-banner-chat-server - connections runForeach { connection => + connections.runForeach { connection => - val serverLogic = Flow.fromGraph(GraphDSL.create() { implicit b => - import GraphDSL.Implicits._ + // server logic, parses incoming commands + val commandParser = Flow[String].takeWhile(_ != "BYE").map(_ + "!") - // server logic, parses incoming commands - val commandParser = new PushStage[String, String] { - override def onPush(elem: String, ctx: Context[String]): SyncDirective = { - elem match { - case "BYE" ⇒ ctx.finish() - case _ ⇒ ctx.push(elem + "!") - } - } - } + import connection._ + val welcomeMsg = s"Welcome to: $localAddress, you are: $remoteAddress!" + val welcome = Source.single(welcomeMsg) - import connection._ - val welcomeMsg = s"Welcome to: $localAddress, you are: $remoteAddress!\n" - - val welcome = Source.single(ByteString(welcomeMsg)) - val echo = b.add(Flow[ByteString] - .via(Framing.delimiter( - ByteString("\n"), - maximumFrameLength = 256, - allowTruncation = true)) - .map(_.utf8String) - //#welcome-banner-chat-server - .map { command ⇒ serverProbe.ref ! command; command } - //#welcome-banner-chat-server - .transform(() ⇒ commandParser) - .map(_ + "\n") - .map(ByteString(_))) - - val concat = b.add(Concat[ByteString]()) - // first we emit the welcome message, - welcome ~> concat.in(0) - // then we continue using the echo-logic Flow - echo.outlet ~> concat.in(1) - - FlowShape(echo.in, concat.out) - }) + val serverLogic = Flow[ByteString] + .via(Framing.delimiter( + ByteString("\n"), + maximumFrameLength = 256, + allowTruncation = true)) + .map(_.utf8String) + //#welcome-banner-chat-server + .map { command ⇒ serverProbe.ref ! command; command } + //#welcome-banner-chat-server + .via(commandParser) + // merge in the initial banner after parser + .merge(welcome) + .map(_ + "\n") + .map(ByteString(_)) connection.handleWith(serverLogic) } @@ -135,14 +117,10 @@ class StreamTcpDocSpec extends AkkaSpec { val connection = Tcp().outgoingConnection(localhost) //#repl-client - val replParser = new PushStage[String, ByteString] { - override def onPush(elem: String, ctx: Context[ByteString]): SyncDirective = { - elem match { - case "q" ⇒ ctx.pushAndFinish(ByteString("BYE\n")) - case _ ⇒ ctx.push(ByteString(s"$elem\n")) - } - } - } + val replParser = + Flow[String].takeWhile(_ != "q") + .concat(Source.single("BYE")) + .map(elem => ByteString(s"$elem\n")) val repl = Flow[ByteString] .via(Framing.delimiter( @@ -152,7 +130,7 @@ class StreamTcpDocSpec extends AkkaSpec { .map(_.utf8String) .map(text => println("Server: " + text)) .map(_ => readLine("> ")) - .transform(() ⇒ replParser) + .via(replParser) connection.join(repl).run() } diff --git a/akka-docs/rst/scala/http/low-level-server-side-api.rst b/akka-docs/rst/scala/http/low-level-server-side-api.rst index 91b7faadd2..666d9102aa 100644 --- a/akka-docs/rst/scala/http/low-level-server-side-api.rst +++ b/akka-docs/rst/scala/http/low-level-server-side-api.rst @@ -213,7 +213,7 @@ through the stream starting from the stage which failed, all the way downstream Connections Source failures ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In the example below we add a custom ``PushStage`` (see :ref:`stream-customize-scala`) in order to react to the +In the example below we add a custom ``GraphStage`` (see :ref:`stream-customize-scala`) in order to react to the stream's failure. We signal a ``failureMonitor`` actor with the cause why the stream is going down, and let the Actor handle the rest – maybe it'll decide to restart the server or shutdown the ActorSystem, that however is not our concern anymore. diff --git a/akka-docs/rst/scala/stream/stream-cookbook.rst b/akka-docs/rst/scala/stream/stream-cookbook.rst index 139f993be3..30abe02653 100644 --- a/akka-docs/rst/scala/stream/stream-cookbook.rst +++ b/akka-docs/rst/scala/stream/stream-cookbook.rst @@ -75,17 +75,15 @@ Calculating the digest of a ByteString stream **Situation:** A stream of bytes is given as a stream of ``ByteStrings`` and we want to calculate the cryptographic digest of the stream. -This recipe uses a :class:`PushPullStage` to host a mutable :class:`MessageDigest` class (part of the Java Cryptography +This recipe uses a :class:`GraphStage` to host a mutable :class:`MessageDigest` class (part of the Java Cryptography API) and update it with the bytes arriving from the stream. When the stream starts, the ``onPull`` handler of the stage is called, which just bubbles up the ``pull`` event to its upstream. As a response to this pull, a ByteString chunk will arrive (``onPush``) which we use to update the digest, then it will pull for the next chunk. Eventually the stream of ``ByteStrings`` depletes and we get a notification about this event via ``onUpstreamFinish``. -At this point we want to emit the digest value, but we cannot do it in this handler directly. Instead we call -``ctx.absorbTermination()`` signalling to our context that we do not yet want to finish. When the environment decides that -we can emit further elements ``onPull`` is called again, and we see ``ctx.isFinishing`` returning ``true`` (since the upstream -source has been depleted already). Since we only want to emit a final element it is enough to call ``ctx.pushAndFinish`` -passing the digest ByteString to be emitted. +At this point we want to emit the digest value, but we cannot do it with ``push`` in this handler directly since there may +be no downstream demand. Instead we call ``emit`` which will temporarily replace the handlers, emit the provided value when +demand comes in and then reset the stage state. It will then complete the stage. .. includecode:: ../code/docs/stream/cookbook/RecipeDigest.scala#calculating-digest @@ -271,14 +269,11 @@ Create a stream processor that repeats the last element seen of them is slowing down the other by dropping earlier unconsumed elements from the upstream if necessary, and repeating the last value for the downstream if necessary. -We have two options to implement this feature. In both cases we will use :class:`DetachedStage` to build our custom -element (:class:`DetachedStage` is specifically designed for rate translating elements just like ``conflate``, -``expand`` or ``buffer``). In the first version we will use a provided initial value ``initial`` that will be used +We have two options to implement this feature. In both cases we will use :class:`GraphStage` to build our custom +element. In the first version we will use a provided initial value ``initial`` that will be used to feed the downstream if no upstream element is ready yet. In the ``onPush()`` handler we just overwrite the -``currentValue`` variable and immediately relieve the upstream by calling ``pull()`` (remember, implementations of -:class:`DetachedStage` are not allowed to call ``push()`` as a response to ``onPush()`` or call ``pull()`` as a response -of ``onPull()``). The downstream ``onPull`` handler is very similar, we immediately relieve the downstream by -emitting ``currentValue``. +``currentValue`` variable and immediately relieve the upstream by calling ``pull()``. The downstream ``onPull`` handler +is very similar, we immediately relieve the downstream by emitting ``currentValue``. .. includecode:: ../code/docs/stream/cookbook/RecipeHold.scala#hold-version-1 @@ -289,9 +284,9 @@ case: if the very first element is not yet available. We introduce a boolean variable ``waitingFirstValue`` to denote whether the first element has been provided or not (alternatively an :class:`Option` can be used for ``currentValue`` or if the element type is a subclass of AnyRef a null can be used with the same purpose). In the downstream ``onPull()`` handler the difference from the previous -version is that we call ``holdDownstream()`` if the first element is not yet available and thus blocking our downstream. The -upstream ``onPush()`` handler sets ``waitingFirstValue`` to false, and after checking if ``holdDownstream()`` has been called it -either relieves the upstream producer, or both the upstream producer and downstream consumer by calling ``pushAndPull()`` +version is that we check if we have received the the first value and only emit if we have. This leads to that when the +first element comes in we must check if there possibly already was demand from downstream so that we in that case can +push the element directly. .. includecode:: ../code/docs/stream/cookbook/RecipeHold.scala#hold-version-2 @@ -336,14 +331,14 @@ Chunking up a stream of ByteStrings into limited size ByteStrings the same sequence, but capping the size of ByteStrings. In other words we want to slice up ByteStrings into smaller chunks if they exceed a size threshold. -This can be achieved with a single :class:`PushPullStage`. The main logic of our stage is in ``emitChunkOrPull()`` +This can be achieved with a single :class:`GraphStage`. The main logic of our stage is in ``emitChunk()`` which implements the following logic: -* if the buffer is empty, we pull for more bytes +* if the buffer is empty, and upstream is not closed we pull for more bytes, if it is closed we complete * if the buffer is nonEmpty, we split it according to the ``chunkSize``. This will give a next chunk that we will emit, and an empty or nonempty remaining buffer. -Both ``onPush()`` and ``onPull()`` calls ``emitChunkOrPull()`` the only difference is that the push handler also stores +Both ``onPush()`` and ``onPull()`` calls ``emitChunk()`` the only difference is that the push handler also stores the incoming chunk by appending to the end of the buffer. .. includecode:: ../code/docs/stream/cookbook/RecipeByteStrings.scala#bytestring-chunker @@ -354,7 +349,7 @@ Limit the number of bytes passing through a stream of ByteStrings **Situation:** Given a stream of ByteStrings we want to fail the stream if more than a given maximum of bytes has been consumed. -This recipe uses a :class:`PushStage` to implement the desired feature. In the only handler we override, +This recipe uses a :class:`GraphStage` to implement the desired feature. In the only handler we override, ``onPush()`` we just update a counter and see if it gets larger than ``maximumBytes``. If a violation happens we signal failure, otherwise we forward the chunk we have received. diff --git a/akka-docs/rst/scala/stream/stream-flows-and-basics.rst b/akka-docs/rst/scala/stream/stream-flows-and-basics.rst index d32b4dceef..0778932066 100644 --- a/akka-docs/rst/scala/stream/stream-flows-and-basics.rst +++ b/akka-docs/rst/scala/stream/stream-flows-and-basics.rst @@ -36,9 +36,8 @@ Graph is running. Processing Stage The common name for all building blocks that build up a Graph. - Examples of a processing stage would be operations like ``map()``, ``filter()``, stages added by ``transform()`` like - :class:`PushStage`, :class:`PushPullStage`, :class:`StatefulStage` and graph junctions like ``Merge`` or ``Broadcast``. - For the full list of built-in processing stages see :ref:`stages-overview_scala` + Examples of a processing stage would be operations like ``map()``, ``filter()``, custom ``GraphStage`` s and graph + junctions like ``Merge`` or ``Broadcast``. For the full list of built-in processing stages see :ref:`stages-overview_scala` When we talk about *asynchronous, non-blocking backpressure* we mean that the processing stages available in Akka Streams will not use blocking calls but asynchronous message passing to exchange messages between each other, and they diff --git a/akka-docs/rst/scala/stream/stream-io.rst b/akka-docs/rst/scala/stream/stream-io.rst index bb59479a04..d43f941c2b 100644 --- a/akka-docs/rst/scala/stream/stream-io.rst +++ b/akka-docs/rst/scala/stream/stream-io.rst @@ -86,17 +86,12 @@ it makes sense to make the Server initiate the conversation by emitting a "hello .. includecode:: ../code/docs/stream/io/StreamTcpDocSpec.scala#welcome-banner-chat-server -The way we constructed a :class:`Flow` using the :class:`GraphDSL` is explained in detail in -:ref:`constructing-sources-sinks-flows-from-partial-graphs-scala`, however the basic concepts is rather simple– -we can encapsulate arbitrarily complex logic within a :class:`Flow` as long as it exposes the same interface, which means -exposing exactly one :class:`Outlet` and exactly one :class:`Inlet` which will be connected to the TCP -pipeline. In this example we use a :class:`Concat` graph processing stage to inject the initial message, and then -continue with handling all incoming data using the echo handler. You should use this pattern of encapsulating complex -logic in Flows and attaching those to :class:`StreamIO` in order to implement your custom and possibly sophisticated TCP servers. +To emit the initial message we merge a ``Source`` with a single element, after the command processing but before the +framing and transformation to ``ByteStrings`` this way we do not have to repeat such logic. In this example both client and server may need to close the stream based on a parsed command - ``BYE`` in the case -of the server, and ``q`` in the case of the client. This is implemented by using a custom :class:`PushStage` -which completes the stream once it encounters such command. +of the server, and ``q`` in the case of the client. This is implemented by taking from the stream until ``q`` and +and concatenating a ``Source`` with a single ``BYE`` element which will then be sent after the original source completed. Streaming File IO =================