diff --git a/ws2012/Bachelor Thesis/Literatur/JEE/Real World Java EE Night Hacks - Dissecting the Business Tier - A. Bien.pdf b/ws2012/Bachelor Thesis/Literatur/JEE/Real World Java EE Night Hacks - Dissecting the Business Tier - A. Bien.pdf new file mode 100644 index 00000000..b6c2c5d0 --- /dev/null +++ b/ws2012/Bachelor Thesis/Literatur/JEE/Real World Java EE Night Hacks - Dissecting the Business Tier - A. Bien.pdf @@ -0,0 +1,91203 @@ +%PDF-1.3 +% +1 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 7 0 R>>endobj +2 0 obj<>endobj +3 0 obj<>endobj +4 0 obj[/ICCBased 465 0 R]endobj +5 0 obj<>endobj +6 0 obj<>endobj +7 0 obj<>stream +q +52 72 432 569 re +W n +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 57 632 Tm +(Real )Tj +2.13 0 Td +(W)Tj +0.963 0 Td +(orld J)Tj +2.378 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE Night Hac)Tj +6.539 0 Td +(ks )Tj +ET +Q +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +9 0 0 9 198.23 632 Tm +(\227)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +10 0 0 10 207.23 632 Tm +( Dissecting the Business )Tj +10.596 0 Td +(T)Tj +0.482 0 Td +(ier)Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 620 Tm +(b)Tj +0.538 0 Td +(y )Tj +0.741 0 Td +(Adam Bien)Tj +-1.279 -3.6 Td +(Cop)Tj +1.761 0 Td +(yright \251 2011 )Tj +(press.adam-bien.com)Tj +(. )Tj +15.996 0 Td +(All rights reserv)Tj +6.656 0 Td +(ed. )Tj +-24.413 -1.2 Td +(Published b)Tj +5.041 0 Td +(y )Tj +(press.adam-bien.com)Tj +(.)Tj +-5.041 -1.2 Td +(F)Tj +0.455 0 Td +(or more information or feedbac)Tj +13.486 0 Td +(k, contact )Tj +(abien@adam-bien.com)Tj +(.)Tj +/TT0 1 Tf +-13.941 -2.4 Td +(Co)Tj +1.211 0 Td +(v)Tj +0.488 0 Td +(er Picture: )Tj +/TT1 1 Tf +(T)Tj +5.346 0 Td +(he front picture is the por)Tj +10.882 0 Td +(c)Tj +0.482 0 Td +(h of the Moscone Center in San F)Tj +14.303 0 Td +(r)Tj +0.321 0 Td +(ancisco and w)Tj +6.207 0 Td +(as )Tj +-39.24 -1.2 Td +(taken during the 2010 J)Tj +10.049 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(aOne conference. )Tj +7.928 0 Td +(T)Tj +0.511 0 Td +(he name \223x-r)Tj +5.599 0 Td +(a)Tj +0.47 0 Td +(y\224 is inspired b)Tj +6.429 0 Td +(y the under side of the )Tj +-31.932 -1.2 Td +(por)Tj +1.433 0 Td +(c)Tj +0.482 0 Td +(h :-\). )Tj +-1.915 -1.2 Td +( )Tj +/TT0 1 Tf +0 -1.2 TD +(Co)Tj +1.211 0 Td +(v)Tj +0.488 0 Td +(er Designer)Tj +/TT1 1 Tf +(: Kinga Bien \()Tj +(http://design.gr)Tj +17.217 0 Td +(aphikerin.com)Tj +(\) )Tj +/TT0 1 Tf +-18.916 -1.2 Td +(Editor)Tj +/TT1 1 Tf +(: Karen P)Tj +6.457 0 Td +(erkins \()Tj +(http://www)Tj +7.874 0 Td +(.linkedin.com/in/karenjperkins)Tj +(\))Tj +-14.331 -6 Td +(Printing History: )Tj +T* +(April 2011 Iter)Tj +6.269 0 Td +(ation One \(F)Tj +5.373 0 Td +(irst Edition\))Tj +-11.642 -30 Td +(ISBN 978-0-557-07832-5)Tj +ET + +endstream +endobj +8 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 10 0 R>>endobj +9 0 obj<>endobj +10 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(3)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +12 0 0 12 57 630 Tm +(T)Tj +0.456 0 Td +(able of Contents)Tj +ET +Q +BT +/TT0 1 Tf +10 0 0 10 57 611.2 Tm +(F)Tj +0.455 0 Td +(orew)Tj +2.155 0 Td +(ord)Tj +ET +/CS0 CS 0 SCN +[3 3]40.55 d +q 1 0 0 1 97.55 609.5 cm +0 0 m +345.921 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 443.4715 611.2 Tm +(7)Tj +-38.647 -1.88 Td +(Preface)Tj +ET +[3 3]31.67 d +q 1 0 0 1 88.67 590.5 cm +0 0 m +4.33 0 l +S +Q +[3 3]36 d +q 1 0 0 1 93 590.5 cm +0 0 m +350.471 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 443.4715 592.4 Tm +(9)Tj +-38.647 -1.88 Td +(Setting the Stage)Tj +ET +[3 3]70.58 d +q 1 0 0 1 127.58 571.5 cm +0 0 m +310.331 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 573.6 Tm +(11)Tj +-34.491 -1.88 Td +(Gathering the Requirements)Tj +ET +[3 3]120.59 d +q 1 0 0 1 213.59 552.5 cm +0 0 m +224.322 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 554.8 Tm +(12)Tj +-34.491 -1.88 Td +(Functional Requirements and the Problem Statement)Tj +ET +[3 3]226.19 d +q 1 0 0 1 319.19 534.5 cm +0 0 m +118.721 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 536 Tm +(12)Tj +-34.491 -1.88 Td +(Non-Functional Requirements)Tj +ET +[3 3]129.49 d +q 1 0 0 1 222.49 515.5 cm +0 0 m +215.421 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 517.2 Tm +(13)Tj +-34.491 -1.88 Td +(Constr)Tj +2.767 0 Td +(aints)Tj +ET +[3 3]47.68 d +q 1 0 0 1 140.68 496.5 cm +0 0 m +297.232 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 498.4 Tm +(14)Tj +-38.091 -1.88 Td +(T)Tj +0.511 0 Td +(he Big Picture)Tj +ET +[3 3]65.13 d +q 1 0 0 1 122.13 477.5 cm +0 0 m +315.781 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 479.6 Tm +(15)Tj +-34.491 -1.88 Td +(Next Iter)Tj +3.711 0 Td +(ation: )Tj +2.65 0 Td +(T)Tj +0.511 0 Td +(he Simplest P)Tj +5.735 0 Td +(ossible \(W)Tj +4.465 0 Td +(orking\) Solution)Tj +ET +[3 3]239.09 d +q 1 0 0 1 332.09 458.5 cm +0 0 m +105.822 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 460.8 Tm +(21)Tj +-34.491 -1.88 Td +(Protected )Tj +4.243 0 Td +(V)Tj +0.612 0 Td +(ariations \205W)Tj +5.928 0 Td +(ith Distribution)Tj +ET +[3 3]172.87 d +q 1 0 0 1 265.87 439.5 cm +0 0 m +172.042 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 442 Tm +(21)Tj +-34.491 -1.88 Td +(Bac)Tj +1.593 0 Td +(k to the Roots)Tj +ET +[3 3]74.85 d +q 1 0 0 1 167.85 421.5 cm +0 0 m +270.062 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 423.2 Tm +(24)Tj +-38.091 -1.88 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y Probe)Tj +ET +[3 3]50.14 d +q 1 0 0 1 107.14 402.5 cm +0 0 m +330.771 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 404.4 Tm +(29)Tj +-34.491 -1.88 Td +(Dinosaur Infr)Tj +5.657 0 Td +(astructure)Tj +ET +[3 3]98.8 d +q 1 0 0 1 191.8 383.5 cm +0 0 m +246.111 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 385.6 Tm +(29)Tj +/C2_0 1 Tf +-34.491 -1.88 Td +<0034002900280001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +5.99 0 Td +(ation\227A Dinosaur Use Case)Tj +ET +[3 3]183.28 d +q 1 0 0 1 276.28 364.5 cm +0 0 m +161.632 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 366.8 Tm +(29)Tj +-34.491 -1.88 Td +(Inter)Tj +1.933 0 Td +(cept and F)Tj +4.457 0 Td +(orw)Tj +1.649 0 Td +(ard)Tj +ET +[3 3]94.28 d +q 1 0 0 1 187.28 346.5 cm +0 0 m +250.632 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 348 Tm +(30)Tj +-34.491 -1.88 Td +(T)Tj +0.511 0 Td +(hreads for Robustness)Tj +ET +[3 3]98.48 d +q 1 0 0 1 191.48 327.5 cm +0 0 m +246.432 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 329.2 Tm +(31)Tj +-34.491 -1.88 Td +(JMX or Logging?)Tj +ET +[3 3]70.02 d +q 1 0 0 1 163.02 308.5 cm +0 0 m +274.892 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 310.4 Tm +(35)Tj +-34.491 -1.88 Td +(T)Tj +0.511 0 Td +(he Self-Contained REST Client)Tj +ET +[3 3]134.61 d +q 1 0 0 1 227.61 289.5 cm +0 0 m +210.301 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 291.6 Tm +(39)Tj +-34.491 -1.88 Td +(HTTPRequestRESTInter)Tj +9.936 0 Td +(ceptor at Large)Tj +ET +[3 3]163.26 d +q 1 0 0 1 256.26 270.5 cm +0 0 m +181.652 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 272.8 Tm +(42)Tj +-34.491 -1.88 Td +(Sending MetaData with REST or KISS in Second Iter)Tj +22.107 0 Td +(ation)Tj +ET +[3 3]242.75 d +q 1 0 0 1 335.75 252.5 cm +0 0 m +102.161 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 254.0001 Tm +(49)Tj +-34.491 -1.88 Td +(Don't )Tj +2.65 0 Td +(T)Tj +0.456 0 Td +(est Ev)Tj +2.433 0 Td +(erything)Tj +ET +[3 3]90.4 d +q 1 0 0 1 183.4 233.5 cm +0 0 m +254.512 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 235.2001 Tm +(51)Tj +-34.491 -1.88 Td +(T)Tj +0.456 0 Td +(esting the X-r)Tj +5.656 0 Td +(a)Tj +0.47 0 Td +(y Probe)Tj +ET +[3 3]98.61 d +q 1 0 0 1 191.61 214.5 cm +0 0 m +246.301 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 216.4001 Tm +(53)Tj +-38.091 -1.88 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y REST Services)Tj +ET +[3 3]84.58 d +q 1 0 0 1 141.58 195.5 cm +0 0 m +296.331 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 197.6001 Tm +(59)Tj +-34.491 -1.88 Td +(Gi)Tj +1.038 0 Td +(v)Tj +0.488 0 Td +(e Me Some REST)Tj +ET +[3 3]88.05 d +q 1 0 0 1 181.05 176.5 cm +0 0 m +256.861 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 178.8001 Tm +(59)Tj +-34.491 -1.88 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +2.872 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansactions)Tj +ET +[3 3]104.32 d +q 1 0 0 1 197.32 158.5 cm +0 0 m +240.591 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 160.0001 Tm +(63)Tj +-34.491 -1.88 Td +(EJB and POJO Injection)Tj +ET +[3 3]101.15 d +q 1 0 0 1 194.15 139.5 cm +0 0 m +243.762 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 141.2001 Tm +(65)Tj +-34.491 -1.88 Td +(Ev)Tj +0.988 0 Td +(entual Consistenc)Tj +7.591 0 Td +(y with Singletons)Tj +ET +[3 3]159.16 d +q 1 0 0 1 252.16 120.5 cm +0 0 m +185.751 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9114 122.4001 Tm +(66)Tj +-34.491 -1.88 Td +(Singletons )Tj +4.632 0 Td +(Are Not Completely Dead)Tj +ET +[3 3]158.58 d +q 1 0 0 1 251.58 101.5 cm +0 0 m +186.331 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 103.6002 Tm +(67)Tj +-34.491 -1.88 Td +(@Async)Tj +3.394 0 Td +(hronous or Not)Tj +ET +[3 3]99.53 d +q 1 0 0 1 192.53 82.5 cm +0 0 m +245.382 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 84.8002 Tm +(70)Tj +ET + +endstream +endobj +11 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 12 0 R>>endobj +12 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(4)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +10 0 0 10 93 633.2 Tm +(P)Tj +0.511 0 Td +(ersistence for )Tj +5.909 0 Td +(A)Tj +0.612 0 Td +(v)Tj +0.476 0 Td +(ailability)Tj +ET +Q +/CS0 CS 0 SCN +[3 3]112.32 d +q 1 0 0 1 205.32 631.5 cm +0 0 m +232.591 0 l +S +Q +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +10 0 0 10 437.9115 633.2 Tm +(72)Tj +ET +Q +BT +/TT0 1 Tf +10 0 0 10 93 614.4 Tm +(When @Async)Tj +6.284 0 Td +(hronous Becomes Dangerous)Tj +ET +[3 3]188.99 d +q 1 0 0 1 281.99 612.5 cm +0 0 m +155.922 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 614.4 Tm +(76)Tj +-34.491 -1.88 Td +(Who Reads Logs\227Or Ho)Tj +10.935 0 Td +(w to Monitor )Tj +5.8 0 Td +(Y)Tj +0.482 0 Td +(our )Tj +1.686 0 Td +(Application)Tj +ET +[3 3]239.06 d +q 1 0 0 1 332.06 593.5 cm +0 0 m +105.852 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 595.6 Tm +(77)Tj +-34.491 -1.88 Td +(MXBeans\227T)Tj +5.567 0 Td +(he Easy )Tj +3.464 0 Td +(W)Tj +0.963 0 Td +(a)Tj +0.47 0 Td +(y to Expose Cohesi)Tj +8.097 0 Td +(v)Tj +0.488 0 Td +(e Data)Tj +ET +[3 3]218.83 d +q 1 0 0 1 311.83 574.5 cm +0 0 m +126.082 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 576.8 Tm +(79)Tj +-34.491 -1.88 Td +(Distributing Ev)Tj +6.324 0 Td +(ents )Tj +1.964 0 Td +(W)Tj +0.982 0 Td +(ithout JMS\227Leaner )Tj +8.54 0 Td +(T)Tj +0.511 0 Td +(han an Observ)Tj +6.323 0 Td +(er)Tj +ET +[3 3]254.77 d +q 1 0 0 1 347.7699 556.5 cm +0 0 m +90.142 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9114 558 Tm +(83)Tj +-34.491 -1.88 Td +(REST for Monitoring)Tj +ET +[3 3]86.7 d +q 1 0 0 1 179.7 537.5 cm +0 0 m +258.212 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 539.2 Tm +(86)Tj +-34.491 -1.88 Td +(XML o)Tj +2.822 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.074 0 Td +(Annotations?)Tj +ET +[3 3]99.43 d +q 1 0 0 1 192.43 518.5 cm +0 0 m +245.482 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 520.4 Tm +(90)Tj +-34.491 -1.88 Td +(Ev)Tj +0.988 0 Td +(ents...And the )Tj +6.152 0 Td +(T)Tj +0.482 0 Td +(ype Is Not Enough)Tj +ET +[3 3]155.15 d +q 1 0 0 1 248.15 499.5 cm +0 0 m +189.762 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 501.6 Tm +(91)Tj +-34.491 -1.88 Td +(REST and HTML Serialization)Tj +ET +[3 3]126.71 d +q 1 0 0 1 219.71 480.5 cm +0 0 m +218.201 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9115 482.8 Tm +(95)Tj +/C2_0 1 Tf +-34.491 -1.88 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation Ov)Tj +3.767 0 Td +(er Con)Tj +2.878 0 Td +(v)Tj +0.488 0 Td +(ention with In)Tj +5.992 0 Td +(v)Tj +0.488 0 Td +(ersion of Control)Tj +ET +[3 3]245.51 d +q 1 0 0 1 338.5099 461.5 cm +0 0 m +99.402 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 437.9114 464 Tm +(98)Tj +-34.491 -1.88 Td +(Easy Extensibility for the Unlikely Case)Tj +ET +[3 3]166.73 d +q 1 0 0 1 259.73 443.5 cm +0 0 m +172.622 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 445.2 Tm +(102)Tj +/C2_0 1 Tf +-33.935 -1.88 Td +<002E0021002F0030003E004D00440001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +7.269 0 Td +(ation)Tj +ET +[3 3]94.37 d +q 1 0 0 1 187.37 424.5 cm +0 0 m +244.982 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 426.4 Tm +(103)Tj +-33.935 -1.88 Td +(Logger Injection)Tj +ET +[3 3]69.47 d +q 1 0 0 1 162.47 405.5 cm +0 0 m +269.882 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 407.6 Tm +(106)Tj +-33.935 -1.88 Td +(Unit )Tj +2.094 0 Td +(T)Tj +0.456 0 Td +(est Is Not Integr)Tj +6.713 0 Td +(ation )Tj +2.372 0 Td +(T)Tj +0.456 0 Td +(est)Tj +ET +[3 3]132.58 d +q 1 0 0 1 225.58 386.5 cm +0 0 m +206.771 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 388.8 Tm +(109)Tj +-33.935 -1.88 Td +(Injection and Infr)Tj +7.381 0 Td +(astructure )Tj +4.427 0 Td +(T)Tj +0.456 0 Td +(esting with )Tj +4.91 0 Td +(Aliens)Tj +ET +[3 3]198.42 d +q 1 0 0 1 291.42 368.5 cm +0 0 m +140.931 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3514 370 Tm +(110)Tj +-33.935 -1.88 Td +(Accidental P)Tj +5.402 0 Td +(erformance Impro)Tj +7.711 0 Td +(v)Tj +0.488 0 Td +(ement of F)Tj +4.502 0 Td +(actor 250)Tj +ET +[3 3]222.16 d +q 1 0 0 1 315.16 349.5 cm +0 0 m +117.191 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 351.2 Tm +(118)Tj +-37.535 -1.88 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y Consumer Client)Tj +ET +[3 3]97.38 d +q 1 0 0 1 154.38 330.5 cm +0 0 m +277.972 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 332.4 Tm +(123)Tj +-33.935 -1.88 Td +(REST Client in a Class)Tj +ET +[3 3]93.93 d +q 1 0 0 1 186.93 311.5 cm +0 0 m +245.422 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 313.6 Tm +(123)Tj +-33.935 -1.88 Td +(T)Tj +0.482 0 Td +(imeouts )Tj +3.631 0 Td +(Are Crucial)Tj +ET +[3 3]90.03 d +q 1 0 0 1 183.03 292.5 cm +0 0 m +249.322 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 294.8 Tm +(126)Tj +-33.935 -1.88 Td +(V)Tj +0.612 0 Td +(elocity Integr)Tj +5.601 0 Td +(ation)Tj +ET +[3 3]83.81 d +q 1 0 0 1 176.81 274.5 cm +0 0 m +255.542 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 276 Tm +(127)Tj +-33.935 -1.88 Td +(Roller Integr)Tj +5.267 0 Td +(ation)Tj +ET +[3 3]74.35 d +q 1 0 0 1 167.35 255.5 cm +0 0 m +265.002 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 257.2 Tm +(128)Tj +-37.535 -1.88 Td +(Dev)Tj +1.766 0 Td +(elopment Process)Tj +ET +[3 3]93.24 d +q 1 0 0 1 150.24 236.5 cm +0 0 m +282.112 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 238.4001 Tm +(131)Tj +-33.935 -1.88 Td +(Build and Deplo)Tj +7.103 0 Td +(yment)Tj +ET +[3 3]97.7 d +q 1 0 0 1 190.7 217.5 cm +0 0 m +241.652 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 219.6001 Tm +(131)Tj +-33.935 -1.88 Td +(Continuous Integr)Tj +7.659 0 Td +(ation and QA)Tj +ET +[3 3]134.95 d +q 1 0 0 1 227.95 198.5 cm +0 0 m +204.402 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 200.8001 Tm +(135)Tj +-33.935 -1.88 Td +(F)Tj +0.482 0 Td +(itnesse + J)Tj +4.318 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE = Good F)Tj +6.127 0 Td +(riends)Tj +ET +[3 3]144.85 d +q 1 0 0 1 237.85 180.5 cm +0 0 m +194.501 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 182.0001 Tm +(138)Tj +-33.935 -1.88 Td +(Build )Tj +2.465 0 Td +(Y)Tj +0.482 0 Td +(our F)Tj +2.205 0 Td +(itnesse)Tj +ET +[3 3]80.42 d +q 1 0 0 1 173.42 161.5 cm +0 0 m +258.932 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 163.2001 Tm +(144)Tj +-33.935 -1.88 Td +(Continuous Quality F)Tj +9.182 0 Td +(eedbac)Tj +3.094 0 Td +(k with Sonar)Tj +ET +[3 3]176.67 d +q 1 0 0 1 269.67 142.5 cm +0 0 m +162.682 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 144.4001 Tm +(147)Tj +-33.935 -1.88 Td +(Git/Mer)Tj +3.322 0 Td +(curial in the Clouds)Tj +ET +[3 3]117.71 d +q 1 0 0 1 210.71 123.5 cm +0 0 m +221.641 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 125.6001 Tm +(148)Tj +-33.935 -1.88 Td +(...In the Real )Tj +5.688 0 Td +(W)Tj +0.963 0 Td +(orld)Tj +ET +[3 3]83.74 d +q 1 0 0 1 176.74 104.5 cm +0 0 m +255.612 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 106.8001 Tm +(149)Tj +-37.535 -1.88 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE Lo)Tj +3.1 0 Td +(v)Tj +0.488 0 Td +(es Stress and Laughs )Tj +8.966 0 Td +(About JUnit)Tj +ET +[3 3]188.25 d +q 1 0 0 1 245.25 86.5 cm +0 0 m +187.102 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 88.0001 Tm +(151)Tj +ET + +endstream +endobj +13 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 14 0 R>>endobj +14 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(5)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +10 0 0 10 93 633.2 Tm +(Stress \(T)Tj +3.401 0 Td +(est\) Kills Slo)Tj +5.157 0 Td +(wly)Tj +ET +Q +/CS0 CS 0 SCN +[3 3]101.14 d +q 1 0 0 1 194.14 631.5 cm +0 0 m +238.212 0 l +S +Q +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +10 0 0 10 432.3515 633.2 Tm +(151)Tj +ET +Q +BT +/TT0 1 Tf +10 0 0 10 93 614.4 Tm +(F)Tj +0.482 0 Td +(inding Bugs with Stress )Tj +10.097 0 Td +(T)Tj +0.456 0 Td +(ests)Tj +ET +[3 3]125.91 d +q 1 0 0 1 218.91 612.5 cm +0 0 m +213.441 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 614.4 Tm +(152)Tj +-33.935 -1.88 Td +(...and Ho)Tj +4.046 0 Td +(w Did It P)Tj +4.291 0 Td +(erform?)Tj +ET +[3 3]115.59 d +q 1 0 0 1 208.59 593.5 cm +0 0 m +223.762 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 595.6 Tm +(153)Tj +-33.935 -1.88 Td +(Lessons Learned)Tj +ET +[3 3]70.02 d +q 1 0 0 1 163.02 574.5 cm +0 0 m +269.332 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 576.8 Tm +(155)Tj +-37.535 -1.88 Td +(Entity Control Boundary: )Tj +10.82 0 Td +(T)Tj +0.511 0 Td +(he P)Tj +1.845 0 Td +(erhaps Simplest P)Tj +7.513 0 Td +(ossible )Tj +3.187 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hitecture)Tj +ET +[3 3]291.25 d +q 1 0 0 1 348.25 556.5 cm +0 0 m +84.102 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 558 Tm +(157)Tj +-33.935 -1.88 Td +(In)Tj +0.822 0 Td +(v)Tj +0.488 0 Td +(ersion of )Tj +3.928 0 Td +(T)Tj +0.511 0 Td +(hinking)Tj +ET +[3 3]89.73 d +q 1 0 0 1 182.73 537.5 cm +0 0 m +249.622 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 539.2 Tm +(157)Tj +-33.935 -1.88 Td +(Business Components)Tj +ET +[3 3]93.93 d +q 1 0 0 1 186.93 518.5 cm +0 0 m +245.422 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 520.4 Tm +(157)Tj +-33.935 -1.88 Td +(Entity Control Boundary)Tj +ET +[3 3]103.38 d +q 1 0 0 1 196.38 499.5 cm +0 0 m +235.971 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 501.6 Tm +(159)Tj +-33.935 -1.88 Td +(Boundary)Tj +ET +[3 3]41.68 d +q 1 0 0 1 134.68 480.5 cm +0 0 m +297.671 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 482.8 Tm +(159)Tj +-33.935 -1.88 Td +(Control)Tj +ET +[3 3]32.24 d +q 1 0 0 1 125.24 461.5 cm +0 0 m +3.76 0 l +S +Q +[3 3]36 d +q 1 0 0 1 129 461.5 cm +0 0 m +303.352 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 464 Tm +(160)Tj +-33.935 -1.88 Td +(Entity)Tj +ET +[3 3]23.9 d +q 1 0 0 1 116.9 443.5 cm +0 0 m +12.1 0 l +S +Q +[3 3]36 d +q 1 0 0 1 129 443.5 cm +0 0 m +303.352 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 445.2 Tm +(161)Tj +-37.535 -1.88 Td +(Some Statistics)Tj +ET +[3 3]63.35 d +q 1 0 0 1 120.35 424.5 cm +0 0 m +312.002 0 l +S +Q +BT +/TT0 1 Tf +10 0 0 10 432.3515 426.4 Tm +(165)Tj +ET + +endstream +endobj +15 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 17 0 R>>endobj +16 0 obj<>endobj +17 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(6)Tj +/TT1 1 Tf +12 0 0 12 57 600.4 Tm +( )Tj +ET + +endstream +endobj +18 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 20 0 R>>endobj +19 0 obj<>endobj +20 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(7)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +12 0 0 12 57 630 Tm +(F)Tj +0.455 0 Td +(orew)Tj +2.211 0 Td +(ord)Tj +ET +Q +BT +/TT1 1 Tf +64 0 0 64 212.312 552.8 Tm +(F)Tj +0.455 0 Td +(orew)Tj +2.211 0 Td +(ord)Tj +/TT0 1 Tf +10 0 0 10 75 474.4 Tm +(Most )Tj +2.79 0 Td +(books )Tj +3.235 0 Td +(for )Tj +1.845 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +2.011 0 Td +(dev)Tj +1.544 0 Td +(elopers )Tj +3.79 0 Td +(are )Tj +2.011 0 Td +(horizontal )Tj +5.069 0 Td +(slices )Tj +3.012 0 Td +(through )Tj +4.013 0 Td +(some )Tj +2.956 0 Td +(piece )Tj +3.012 0 Td +(of )Tj +1.512 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(tec)Tj +1.26 0 Td +(hnological )Tj +4.91 0 Td +(landscape. )Tj +/C2_0 1 Tf +4.965 0 Td +<0001>Tj +/TT0 1 Tf +(\223X )Tj +1.685 0 Td +(for )Tj +1.519 0 Td +(Dummies\224 )Tj +4.963 0 Td +(or )Tj +1.241 0 Td +(\223Ev)Tj +1.432 0 Td +(erything )Tj +3.853 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.464 0 Td +(need )Tj +2.464 0 Td +(to )Tj +1.186 0 Td +(kno)Tj +1.6 0 Td +(w )Tj +1.13 0 Td +(about )Tj +2.798 0 Td +(X.)Tj +0.834 0 Td +(\224 )Tj +/C2_0 1 Tf +0.796 0 Td +<0001>Tj +/TT0 1 Tf +(Breadth )Tj +-38.588 -1.44 Td +(and )Tj +1.99 0 Td +(lots )Tj +1.879 0 Td +(of )Tj +1.212 0 Td +(to)Tj +0.822 0 Td +(y )Tj +0.878 0 Td +(examples. )Tj +/C2_0 1 Tf +4.712 0 Td +<0001>Tj +/TT0 1 Tf +(T)Tj +0.789 0 Td +(his )Tj +1.601 0 Td +(book )Tj +2.546 0 Td +(takes )Tj +2.545 0 Td +(a )Tj +0.878 0 Td +(largely )Tj +3.267 0 Td +(orthogonal )Tj +5.047 0 Td +(approac)Tj +3.483 0 Td +(h, )Tj +1.212 0 Td +(taking )Tj +2.99 0 Td +(a )Tj +0.878 0 Td +(v)Tj +0.488 0 Td +(ertical )Tj +3.045 0 Td +(slice )Tj +-40.255 -1.44 Td +(through )Tj +3.725 0 Td +(a )Tj +0.89 0 Td +(stac)Tj +1.649 0 Td +(k )Tj +0.89 0 Td +(of )Tj +1.224 0 Td +(tec)Tj +1.26 0 Td +(hnologies )Tj +4.559 0 Td +(to )Tj +1.224 0 Td +(get )Tj +1.668 0 Td +(something )Tj +4.836 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.723 0 Td +(real )Tj +2.001 0 Td +(done. )Tj +/C2_0 1 Tf +2.836 0 Td +<0001>Tj +/TT0 1 Tf +(Adam )Tj +3.224 0 Td +(takes )Tj +2.557 0 Td +(as )Tj +1.279 0 Td +(his )Tj +1.613 0 Td +(organizing)Tj +( )Tj +-37.643 -1.44 Td +(principle )Tj +4.237 0 Td +(one )Tj +2.014 0 Td +(real )Tj +2.013 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.902 0 Td +(EE )Tj +1.402 0 Td +(application )Tj +5.238 0 Td +(that )Tj +2.014 0 Td +(is )Tj +1.069 0 Td +(not )Tj +1.792 0 Td +(a )Tj +0.902 0 Td +(to)Tj +0.822 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.68 0 Td +(and )Tj +2.014 0 Td +(goes )Tj +2.347 0 Td +(through )Tj +3.737 0 Td +(it, )Tj +1.236 0 Td +(almost )Tj +3.236 0 Td +(line-b)Tj +2.483 0 Td +(y-line )Tj +-39.755 -1.44 Td +(explaining )Tj +5.108 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.94 0 Td +(it )Tj +1.162 0 Td +(does, )Tj +2.885 0 Td +(and )Tj +2.218 0 Td +(w)Tj +0.76 0 Td +(h)Tj +0.519 0 Td +(y)Tj +0.408 0 Td +(. )Tj +/C2_0 1 Tf +0.884 0 Td +<0001>Tj +/TT0 1 Tf +(In )Tj +1.718 0 Td +(man)Tj +1.871 0 Td +(y )Tj +1.106 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(ys, )Tj +1.773 0 Td +(it )Tj +1.162 0 Td +(feels )Tj +2.551 0 Td +(like )Tj +2.162 0 Td +(J)Tj +0.266 0 Td +(ohn )Tj +2.274 0 Td +(Lions\222, )Tj +3.441 0 Td +(Lions\222 )Tj +3.163 0 Td +(classic)Tj +( )Tj +-39.366 -1.44 Td +(Commentary on UNIX 6th Edition.)Tj +1.8 -2.24 Td +(One )Tj +2.272 0 Td +(of )Tj +1.217 0 Td +(the )Tj +1.717 0 Td +(problems )Tj +4.384 0 Td +(that )Tj +1.995 0 Td +(people )Tj +3.329 0 Td +(often )Tj +2.551 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.883 0 Td +(w)Tj +0.76 0 Td +(hen )Tj +1.995 0 Td +(they )Tj +2.217 0 Td +(start )Tj +2.161 0 Td +(looking )Tj +3.607 0 Td +(at )Tj +1.161 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.883 0 Td +(is )Tj +1.05 0 Td +(that )Tj +1.995 0 Td +(they )Tj +2.217 0 Td +(get )Tj +-40.922 -1.44 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erw)Tj +1.593 0 Td +(helmed )Tj +3.661 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.938 0 Td +(the )Tj +1.772 0 Td +(v)Tj +0.476 0 Td +(ast )Tj +1.605 0 Td +(expanse )Tj +3.939 0 Td +(of )Tj +1.272 0 Td +(facilities )Tj +3.995 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable. )Tj +/C2_0 1 Tf +3.606 0 Td +<0001>Tj +/TT0 1 Tf +(Most )Tj +2.828 0 Td +(of )Tj +1.272 0 Td +(the )Tj +1.735 0 Td +(APIs )Tj +2.328 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.938 0 Td +(the )Tj +1.772 0 Td +(interesting )Tj +-37.754 -1.44 Td +(property )Tj +3.947 0 Td +(that )Tj +1.947 0 Td +(the )Tj +1.669 0 Td +(solution )Tj +3.782 0 Td +(to )Tj +1.169 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.835 0 Td +(task )Tj +2.002 0 Td +(tends )Tj +2.614 0 Td +(to )Tj +1.169 0 Td +(be )Tj +1.391 0 Td +(pretty )Tj +2.78 0 Td +(simple. )Tj +/C2_0 1 Tf +3.447 0 Td +<0001>Tj +/TT0 1 Tf +(T)Tj +0.789 0 Td +(he )Tj +1.391 0 Td +(complexity )Tj +5.114 0 Td +(is )Tj +1.002 0 Td +(in )Tj +/C2_1 1 Tf +1.169 0 Td +<005D>Tj +/TT0 1 Tf +(nding )Tj +3.337 0 Td +(that )Tj +-40.588 -1.44 Td +(simple )Tj +3.125 0 Td +(path. )Tj +/C2_0 1 Tf +2.459 0 Td +<0001>Tj +/TT0 1 Tf +(Adam's )Tj +3.792 0 Td +(book )Tj +2.459 0 Td +(sho)Tj +1.489 0 Td +(ws )Tj +1.458 0 Td +(a )Tj +0.791 0 Td +(path )Tj +2.181 0 Td +(to )Tj +1.125 0 Td +(a )Tj +0.791 0 Td +(solution )Tj +3.738 0 Td +(for )Tj +1.458 0 Td +(the )Tj +1.625 0 Td +(problem )Tj +3.903 0 Td +(he )Tj +1.347 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.18 0 Td +(trying )Tj +2.736 0 Td +(to )Tj +1.125 0 Td +(solv)Tj +1.711 0 Td +(e. )Tj +/C2_0 1 Tf +1.069 0 Td +<0001>Tj +/TT0 1 Tf +(Y)Tj +0.76 0 Td +(ou )Tj +-41.088 -1.44 Td +(can )Tj +1.861 0 Td +(treat )Tj +2.194 0 Td +(it )Tj +0.861 0 Td +(as )Tj +1.194 0 Td +(an )Tj +1.361 0 Td +(inspir)Tj +2.378 0 Td +(ation )Tj +2.473 0 Td +(to )Tj +/C2_1 1 Tf +1.139 0 Td +<005D>Tj +/TT0 1 Tf +(nd )Tj +1.973 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.75 0 Td +(o)Tj +0.544 0 Td +(wn )Tj +1.639 0 Td +(simple )Tj +3.139 0 Td +(path )Tj +2.195 0 Td +(to )Tj +1.139 0 Td +(w)Tj +0.76 0 Td +(hatev)Tj +2.322 0 Td +(er )Tj +1.138 0 Td +(problem )Tj +3.917 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.417 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.805 0 Td +(at )Tj +1.083 0 Td +(hand, )Tj +-39.754 -1.44 Td +(and guidance on ho)Tj +8.604 0 Td +(w v)Tj +/C2_1 1 Tf +1.532 0 Td +<0039004A00410047004D004B000100480041003D003B003D004B0001005D>Tj +/TT0 1 Tf +(t together\205)Tj +-8.336 -4.48 Td +(J)Tj +0.266 0 Td +(ames Gosling, F)Tj +6.836 0 Td +(ather of J)Tj +3.823 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a)Tj +-11.871 -2.24 Td +(nighthac)Tj +3.706 0 Td +(ks.com)Tj +ET + +endstream +endobj +21 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 22 0 R>>endobj +22 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(8)Tj +ET + +endstream +endobj +23 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 26 0 R>>endobj +24 0 obj<>endobj +25 0 obj<>endobj +26 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(9)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +12 0 0 12 57 630 Tm +(Preface)Tj +ET +Q +BT +/TT1 1 Tf +64 0 0 64 270.36 552.8 Tm +(Preface)Tj +/TT0 1 Tf +10 0 0 10 75 474.4 Tm +(My )Tj +/C2_0 1 Tf +1.822 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.989 0 Td +(self-published )Tj +6.436 0 Td +(book)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT3 1 Tf +2.851 0 Td +(Real )Tj +2.248 0 Td +(W)Tj +0.907 0 Td +(orld )Tj +2.137 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.933 0 Td +(EE )Tj +1.433 0 Td +(P)Tj +0.464 0 Td +(atterns\227Rethinking )Tj +8.86 0 Td +(Best )Tj +2.229 0 Td +(Pr)Tj +0.877 0 Td +(actice)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.22 0 Td +(\()Tj +(http://)Tj +-39.42 -1.44 Td +(press.adam-bien.com)Tj +(\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +10.091 0 Td +(has )Tj +1.784 0 Td +(sold )Tj +2.118 0 Td +(far )Tj +1.45 0 Td +(better )Tj +2.784 0 Td +(than )Tj +2.229 0 Td +(expected. )Tj +4.507 0 Td +(Ev)Tj +0.988 0 Td +(en )Tj +1.395 0 Td +(the )Tj +1.673 0 Td +(complementary )Tj +7.062 0 Td +(project )Tj +3.34 0 Td +(\()Tj +(http://)Tj +-39.42 -1.44 Td +(kenai.com/projects/ja)Tj +9.195 0 Td +(v)Tj +0.476 0 Td +(aee-patterns/)Tj +(\) )Tj +6.206 0 Td +(is )Tj +1.094 0 Td +(one )Tj +2.039 0 Td +(of )Tj +1.261 0 Td +(the )Tj +1.761 0 Td +(most )Tj +2.483 0 Td +(successful )Tj +4.762 0 Td +(kenai.com)Tj +( )Tj +4.928 0 Td +(projects )Tj +3.817 0 Td +(with )Tj +2.317 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +-41.367 -1.44 Td +(400 )Tj +2.032 0 Td +(members. )Tj +4.512 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT3 1 Tf +1.42 0 Td +(Real )Tj +2.179 0 Td +(W)Tj +0.907 0 Td +(orld )Tj +2.068 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.864 0 Td +(EE )Tj +1.364 0 Td +(P)Tj +0.464 0 Td +(atterns)Tj +/TT0 1 Tf +( )Tj +3.234 0 Td +(book )Tj +2.532 0 Td +(ans)Tj +1.433 0 Td +(wers )Tj +2.364 0 Td +(man)Tj +1.871 0 Td +(y )Tj +0.864 0 Td +(questions )Tj +4.422 0 Td +(I )Tj +0.642 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.864 0 Td +(been )Tj +2.476 0 Td +(asked)Tj +( )Tj +-39.755 -1.44 Td +(during )Tj +3.077 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.798 0 Td +(projects )Tj +3.688 0 Td +(and )Tj +1.91 0 Td +(consulting )Tj +4.745 0 Td +(w)Tj +0.766 0 Td +(ork. )Tj +1.891 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.354 0 Td +(old )Tj +1.688 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.798 0 Td +(2 )Tj +0.854 0 Td +(Platform, )Tj +4.188 0 Td +(Enterprise )Tj +4.521 0 Td +(Edition )Tj +3.3 0 Td +(\(J2EE\) )Tj +2.688 0 Td +(patterns )Tj +-38.81 -1.44 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.868 0 Td +(not )Tj +1.758 0 Td +(been )Tj +2.48 0 Td +(updated )Tj +3.87 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.868 0 Td +(Sun )Tj +1.98 0 Td +(or )Tj +1.257 0 Td +(Or)Tj +1.154 0 Td +(acle, )Tj +2.424 0 Td +(and )Tj +1.98 0 Td +(more )Tj +2.59 0 Td +(and )Tj +1.98 0 Td +(more )Tj +2.59 0 Td +(projects )Tj +3.758 0 Td +(are )Tj +1.701 0 Td +(being )Tj +2.758 0 Td +(migr)Tj +1.932 0 Td +(ated )Tj +2.202 0 Td +(from )Tj +-40.2 -1.44 Td +(the )Tj +1.738 0 Td +(J2EE )Tj +2.238 0 Td +(to )Tj +1.238 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.904 0 Td +(Platform, )Tj +4.294 0 Td +(Enterprise )Tj +4.627 0 Td +(Edition )Tj +3.406 0 Td +(\(J)Tj +0.544 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.904 0 Td +(EE\) )Tj +1.682 0 Td +(without )Tj +3.684 0 Td +(a )Tj +0.904 0 Td +(corresponding )Tj +6.573 0 Td +(rethinking )Tj +4.739 0 Td +(of )Tj +1.238 0 Td +(the )Tj +-40.866 -1.44 Td +(best )Tj +2.091 0 Td +(pr)Tj +0.877 0 Td +(actices. )Tj +3.591 0 Td +(Often)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.063 0 Td +(the )Tj +1.702 0 Td +(result )Tj +2.702 0 Td +(is )Tj +1.035 0 Td +(the )Tj +1.702 0 Td +(Same )Tj +2.701 0 Td +(Old )Tj +2.035 0 Td +(\(exagger)Tj +3.599 0 Td +(ated\) )Tj +2.443 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hitecture )Tj +4.147 0 Td +(\(SO)Tj +1.574 0 Td +(A )Tj +1.035 0 Td +(for )Tj +1.535 0 Td +(short )Tj +2.48 0 Td +(:-\)\) )Tj +1.535 0 Td +(or )Tj +-41.311 -1.44 Td +(bloated code on a lean platform.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT3 1 Tf +1.396 0 Td +(Real )Tj +2.155 0 Td +(W)Tj +0.907 0 Td +(orld )Tj +2.044 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.84 0 Td +(EE )Tj +1.34 0 Td +(P)Tj +0.464 0 Td +(atterns)Tj +/TT0 1 Tf +( )Tj +3.21 0 Td +(book )Tj +2.508 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.229 0 Td +(published )Tj +4.565 0 Td +(about )Tj +2.786 0 Td +(tw)Tj +1.044 0 Td +(o )Tj +0.896 0 Td +(y)Tj +0.482 0 Td +(ears )Tj +2.062 0 Td +(ago. )Tj +2.174 0 Td +(Since )Tj +2.674 0 Td +(then, )Tj +2.508 0 Td +(I )Tj +0.618 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e)Tj +( )Tj +-41.7 -1.44 Td +(recei)Tj +2.093 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.467 0 Td +(lots )Tj +1.912 0 Td +(of )Tj +1.245 0 Td +(requests )Tj +3.912 0 Td +(for )Tj +1.578 0 Td +(information )Tj +5.413 0 Td +(regarding )Tj +4.467 0 Td +(builds, )Tj +3.302 0 Td +(testing, )Tj +3.468 0 Td +(and )Tj +2.023 0 Td +(performance)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.106 0 Td +(and )Tj +2.023 0 Td +(I )Tj +0.689 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +-41.7 -1.44 Td +(recei)Tj +2.093 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.482 0 Td +(more )Tj +/C2_0 1 Tf +2.648 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +3.705 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.926 0 Td +(EE )Tj +1.426 0 Td +(questions. )Tj +4.762 0 Td +(In )Tj +1.26 0 Td +(addition, )Tj +4.262 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.926 0 Td +(blog )Tj +2.316 0 Td +(\()Tj +(http://blog.adam-bien.com)Tj +(\) )Tj +12.431 0 Td +(has )Tj +-40.755 -1.44 Td +(become )Tj +3.827 0 Td +(more )Tj +2.604 0 Td +(and )Tj +1.994 0 Td +(more )Tj +2.604 0 Td +(popular)Tj +3.261 0 Td +(. )Tj +0.66 0 Td +(Shortly )Tj +3.383 0 Td +(after )Tj +2.271 0 Td +(publishing )Tj +4.885 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.715 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.882 0 Td +(EE )Tj +1.382 0 Td +(post )Tj +2.161 0 Td +(\(these )Tj +2.883 0 Td +(are )Tj +1.715 0 Td +(the )Tj +1.716 0 Td +(most)Tj +( )Tj +-40.144 -1.44 Td +(\223dangerous\224\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.153 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.791 0 Td +(Internet )Tj +3.57 0 Td +(connection )Tj +5.127 0 Td +(comes )Tj +3.069 0 Td +(close )Tj +2.514 0 Td +(to )Tj +1.125 0 Td +(collapsing. )Tj +4.96 0 Td +(\(Y)Tj +0.76 0 Td +(ou )Tj +1.403 0 Td +(should )Tj +3.182 0 Td +(kno)Tj +1.6 0 Td +(w )Tj +1.069 0 Td +(that )Tj +1.903 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.791 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +-41.367 -1.44 Td +(resides )Tj +3.363 0 Td +(in )Tj +1.252 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.918 0 Td +(basement )Tj +4.53 0 Td +(and )Tj +2.03 0 Td +(also )Tj +2.141 0 Td +(acts )Tj +2.085 0 Td +(as )Tj +1.307 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.918 0 Td +(Internet )Tj +3.697 0 Td +(proxy)Tj +2.353 0 Td +(.\) )Tj +0.974 0 Td +(It )Tj +0.974 0 Td +(became )Tj +3.807 0 Td +(so )Tj +1.363 0 Td +(bad )Tj +2.03 0 Td +(that )Tj +2.03 0 Td +(I )Tj +0.696 0 Td +(started )Tj +3.252 0 Td +(to )Tj +-41.366 -1.44 Td +(publish )Tj +3.53 0 Td +(the )Tj +1.695 0 Td +(posts )Tj +2.529 0 Td +(w)Tj +0.76 0 Td +(hen )Tj +1.973 0 Td +(I )Tj +0.639 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.25 0 Td +(not )Tj +1.751 0 Td +(at )Tj +1.139 0 Td +(home. )Tj +3.01 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.417 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.251 0 Td +(situation )Tj +4.03 0 Td +(made )Tj +2.75 0 Td +(me )Tj +1.694 0 Td +(curious)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.779 0 Td +(so )Tj +1.306 0 Td +(I )Tj +0.639 0 Td +(started )Tj +3.195 0 Td +(to )Tj +-41.366 -1.44 Td +(look for monitoring softw)Tj +10.876 0 Td +(are so I could see in real time w)Tj +13.709 0 Td +(hat w)Tj +2.372 0 Td +(as happening on m)Tj +8.214 0 Td +(y serv)Tj +2.488 0 Td +(er)Tj +0.759 0 Td +(. )Tj +-36.618 -2.24 Td +(I couldn\222)Tj +/C2_0 1 Tf +3.799 0 Td +<004C0001005D>Tj +/TT0 1 Tf +(nd an)Tj +3.54 0 Td +(y monitoring softw)Tj +/C2_0 1 Tf +8.041 0 Td +<0039004A003D0001004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cally for the Roller weblogger )Tj +-17.18 -1.44 Td +(\()Tj +(http://rollerweblogger)Tj +9.485 0 Td +(.org/project/)Tj +(\), )Tj +6.432 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.208 0 Td +(is )Tj +1.319 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.986 0 Td +(m)Tj +0.821 0 Td +(y )Tj +1.152 0 Td +(blog )Tj +2.542 0 Td +(runs )Tj +2.486 0 Td +(on. )Tj +2.042 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +/C2_0 1 Tf +1.152 0 Td +<0048004A0047005D>Tj +/TT0 1 Tf +(lers )Tj +4.153 0 Td +(are )Tj +1.985 0 Td +(too)Tj +( )Tj +-40.81 -1.44 Td +(tec)Tj +1.26 0 Td +(hnical, )Tj +3.464 0 Td +(too )Tj +/C2_0 1 Tf +1.908 0 Td +<005D>Tj +/TT0 1 Tf +(ne)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(gr)Tj +2.766 0 Td +(ained)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.158 0 Td +(and )Tj +2.13 0 Td +(too )Tj +1.908 0 Td +(intrusi)Tj +2.65 0 Td +(v)Tj +0.488 0 Td +(e. )Tj +1.296 0 Td +(Launc)Tj +2.594 0 Td +(hing )Tj +2.408 0 Td +(a )Tj +0.981 0 Td +(W)Tj +0.963 0 Td +(ebalizer )Tj +3.963 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.mrunix.net/)Tj +-36.976 -1.44 Td +(webalizer/)Tj +(\) )Tj +5.127 0 Td +(job )Tj +1.738 0 Td +(after )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 148.027 170.4001 Tm +(eac)Tj +1.482 0 Td +(h )Tj +0.904 0 Td +(post )Tj +2.127 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.237 0 Td +(not )Tj +1.738 0 Td +(viable; )Tj +3.238 0 Td +(it )Tj +0.904 0 Td +(took )Tj +2.238 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.126 0 Td +(hours )Tj +2.738 0 Td +(to )Tj +1.182 0 Td +(process )Tj +3.571 0 Td +(all )Tj +1.404 0 Td +(the )Tj +1.682 0 Td +(logs. )Tj +2.275 0 Td +(T)Tj +0.511 0 Td +(hus, )Tj +-40.421 -1.44 Td +(the idea of building m)Tj +9.493 0 Td +(y \223x-r)Tj +2.376 0 Td +(a)Tj +0.47 0 Td +(y\224 softw)Tj +3.483 0 Td +(are w)Tj +2.371 0 Td +(as born. )Tj +-16.393 -2.24 Td +(I )Tj +0.742 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.353 0 Td +(able )Tj +2.298 0 Td +(to )Tj +1.298 0 Td +(build )Tj +2.688 0 Td +(a )Tj +0.964 0 Td +(prototype )Tj +4.577 0 Td +(in )Tj +1.298 0 Td +(a )Tj +0.964 0 Td +(fr)Tj +0.599 0 Td +(action )Tj +3.132 0 Td +(of )Tj +1.298 0 Td +(a )Tj +0.964 0 Td +(weekend )Tj +4.354 0 Td +(and )Tj +2.076 0 Td +(put )Tj +1.854 0 Td +(it )Tj +1.02 0 Td +(into )Tj +2.132 0 Td +(production. )Tj +5.467 0 Td +(It )Tj +-41.644 -1.44 Td +(w)Tj +0.766 0 Td +(orked )Tj +2.909 0 Td +(well )Tj +2.298 0 Td +(and )Tj +2.076 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.353 0 Td +(good )Tj +2.632 0 Td +(enough )Tj +3.688 0 Td +(to )Tj +1.298 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.964 0 Td +(me )Tj +1.797 0 Td +(an )Tj +1.52 0 Td +(idea )Tj +2.298 0 Td +(of )Tj +1.298 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.798 0 Td +(actually )Tj +3.854 0 Td +(happens )Tj +4.077 0 Td +(behind )Tj +3.466 0 Td +(the )Tj +-40.866 -1.44 Td +(scenes )Tj +3.317 0 Td +(on )Tj +1.595 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.983 0 Td +(blog. )Tj +2.577 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.539 0 Td +(result? )Tj +3.132 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.372 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.372 0 Td +(nothing )Tj +3.763 0 Td +(suspicious )Tj +4.93 0 Td +(going )Tj +2.873 0 Td +(on\227J)Tj +2.378 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.983 0 Td +(EE )Tj +1.483 0 Td +(is )Tj +1.15 0 Td +(just )Tj +1.984 0 Td +(more)Tj +( )Tj +-39.978 -1.44 Td +(popular than I expected. My serv)Tj +14.16 0 Td +(er w)Tj +1.871 0 Td +(as o)Tj +1.711 0 Td +(v)Tj +0.488 0 Td +(erw)Tj +1.593 0 Td +(helmed b)Tj +4.039 0 Td +(y human visitors, not bots. )Tj +ET + +endstream +endobj +27 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 28 0 R>>endobj +28 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(10)Tj +0 Tc 0 Tw -18.632 57.06 Td +(I )Tj +0.71 0 Td +(usually )Tj +3.489 0 Td +(posted )Tj +3.267 0 Td +(monthly )Tj +3.989 0 Td +(statistics )Tj +3.989 0 Td +(about )Tj +2.878 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.932 0 Td +(blog )Tj +2.322 0 Td +(manually)Tj +3.909 0 Td +(, )Tj +0.71 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.988 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.321 0 Td +(unpleasant )Tj +5.101 0 Td +(w)Tj +0.766 0 Td +(ork. )Tj +2.099 0 Td +(I )Tj +-41.922 -1.44 Td +(couldn\222)Tj +3.243 0 Td +(t )Tj +0.649 0 Td +(write )Tj +2.538 0 Td +(the )Tj +1.705 0 Td +(post )Tj +2.15 0 Td +(at )Tj +1.149 0 Td +(Starbuc)Tj +3.205 0 Td +(ks, )Tj +1.538 0 Td +(because )Tj +3.872 0 Td +(I )Tj +0.649 0 Td +(needed )Tj +3.539 0 Td +(pri)Tj +1.149 0 Td +(v)Tj +0.476 0 Td +(ate )Tj +1.649 0 Td +(access )Tj +3.149 0 Td +(to )Tj +1.205 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.871 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.649 0 Td +(Furthermore)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-36.672 -1.44 Td +(the )Tj +1.71 0 Td +(process )Tj +3.599 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(olv)Tj +1.322 0 Td +(ed )Tj +1.432 0 Td +(lots )Tj +1.877 0 Td +(of )Tj +1.21 0 Td +(error)Tj +2 0 Td +(-prone )Tj +3.21 0 Td +(cop)Tj +1.594 0 Td +(y )Tj +0.876 0 Td +(and )Tj +1.988 0 Td +(paste. )Tj +2.877 0 Td +(I )Tj +0.654 0 Td +(began )Tj +2.988 0 Td +(to )Tj +1.21 0 Td +(think )Tj +2.544 0 Td +(about )Tj +2.822 0 Td +(exposing )Tj +4.211 0 Td +(all )Tj +1.432 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(statistics )Tj +4.009 0 Td +(in )Tj +1.286 0 Td +(real )Tj +2.063 0 Td +(time )Tj +2.341 0 Td +(to )Tj +1.286 0 Td +(the )Tj +1.786 0 Td +(blog )Tj +2.342 0 Td +(visitors)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.703 0 Td +(making )Tj +3.619 0 Td +(the )Tj +1.786 0 Td +(monthly )Tj +4.009 0 Td +(statistics )Tj +4.009 0 Td +(obsolete. )Tj +4.343 0 Td +(Exposing )Tj +4.287 0 Td +(the )Tj +-40.866 -1.44 Td +(internal )Tj +3.931 0 Td +(statistics )Tj +4.209 0 Td +(via )Tj +1.93 0 Td +(Representational )Tj +7.821 0 Td +(State )Tj +2.634 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansfer )Tj +3.208 0 Td +(\(REST\) )Tj +3.375 0 Td +(made )Tj +3.041 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.152 0 Td +(a )Tj +1.152 0 Td +(more )Tj +2.874 0 Td +(interesting )Tj +-37.754 -1.44 Td +(application to discuss)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( so I started to write this book in par)Tj +24.973 0 Td +(allel. )Tj +-23.173 -2.24 Td +(As )Tj +1.408 0 Td +(in )Tj +1.186 0 Td +(the )Tj +1.686 0 Td +(case )Tj +2.241 0 Td +(of )Tj +1.186 0 Td +(the )Tj +/TT2 1 Tf +1.686 0 Td +(Real )Tj +2.167 0 Td +(W)Tj +0.907 0 Td +(orld )Tj +2.056 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.852 0 Td +(EE )Tj +1.352 0 Td +(P)Tj +0.464 0 Td +(atterns)Tj +/TT0 1 Tf +( )Tj +3.222 0 Td +(book)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.77 0 Td +(this )Tj +1.853 0 Td +(book )Tj +2.52 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.241 0 Td +(intended )Tj +4.132 0 Td +(to )Tj +1.186 0 Td +(be )Tj +1.408 0 Td +(as )Tj +1.241 0 Td +(thin )Tj +-40.532 -1.44 Td +(and )Tj +2.048 0 Td +(lean )Tj +2.27 0 Td +(as )Tj +1.325 0 Td +(possible. )Tj +4.179 0 Td +(While )Tj +3.048 0 Td +(writing )Tj +3.437 0 Td +(the )Tj +1.77 0 Td +(explanation )Tj +5.494 0 Td +(of )Tj +1.27 0 Td +(the )Tj +1.77 0 Td +(mec)Tj +1.815 0 Td +(hanics )Tj +3.215 0 Td +(behind )Tj +3.438 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.186 0 Td +(I )Tj +0.714 0 Td +(got )Tj +1.77 0 Td +(new )Tj +-40.366 -1.44 Td +(ideas, w)Tj +3.539 0 Td +(hic)Tj +1.316 0 Td +(h caused sev)Tj +5.49 0 Td +(er)Tj +0.821 0 Td +(al refactorings and extensions.)Tj +-9.366 -2.24 Td +(Writing )Tj +3.765 0 Td +(a )Tj +1.042 0 Td +(book )Tj +2.71 0 Td +(about )Tj +2.988 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.042 0 Td +(also )Tj +2.265 0 Td +(solv)Tj +1.711 0 Td +(ed )Tj +1.598 0 Td +(one )Tj +2.154 0 Td +(of )Tj +1.376 0 Td +(m)Tj +0.821 0 Td +(y )Tj +1.042 0 Td +(biggest )Tj +3.543 0 Td +(problems. )Tj +4.784 0 Td +(As )Tj +1.598 0 Td +(I )Tj +0.82 0 Td +(consultant)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.239 0 Td +(I)Tj +( )Tj +-41.922 -1.44 Td +(frequently )Tj +4.654 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.819 0 Td +(to )Tj +1.153 0 Td +(sign )Tj +2.042 0 Td +(ND)Tj +1.501 0 Td +(As, )Tj +1.653 0 Td +(often )Tj +2.487 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.375 0 Td +(before )Tj +3.042 0 Td +(accessing )Tj +4.431 0 Td +(a )Tj +0.819 0 Td +(client\222)Tj +2.576 0 Td +(s )Tj +0.708 0 Td +(building. )Tj +4.155 0 Td +(It )Tj +0.875 0 Td +(is )Tj +/C2_0 1 Tf +0.986 0 Td +<003C0041003E005D>Tj +/TT0 1 Tf +(cult )Tj +3.599 0 Td +(to )Tj +/C2_0 1 Tf +1.153 0 Td +<005D>Tj +/TT0 1 Tf +(nd )Tj +-40.532 -1.44 Td +(the )Tj +1.851 0 Td +(right )Tj +2.462 0 Td +(legal )Tj +2.573 0 Td +(people )Tj +3.463 0 Td +(from )Tj +2.517 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.073 0 Td +(to )Tj +1.351 0 Td +(get )Tj +1.795 0 Td +(permission )Tj +5.185 0 Td +(to )Tj +1.351 0 Td +(publish )Tj +3.686 0 Td +(information )Tj +5.519 0 Td +(about )Tj +2.963 0 Td +(m)Tj +0.821 0 Td +(y )Tj +1.017 0 Td +(\223real\224 )Tj +-39.701 -1.44 Td +(projects, )Tj +3.97 0 Td +(so )Tj +1.247 0 Td +(it )Tj +0.858 0 Td +(is )Tj +0.969 0 Td +(nearly )Tj +2.969 0 Td +(impossible )Tj +4.915 0 Td +(to )Tj +1.136 0 Td +(write )Tj +2.469 0 Td +(about )Tj +2.748 0 Td +(them. )Tj +2.747 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.802 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.191 0 Td +(written )Tj +3.303 0 Td +(from )Tj +2.302 0 Td +(scr)Tj +1.21 0 Td +(atc)Tj +1.26 0 Td +(h )Tj +0.858 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.802 0 Td +(me)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.885 0 Td +(so )Tj +1.247 0 Td +(I)Tj +( )Tj +-41.922 -1.44 Td +(can )Tj +1.835 0 Td +(freely )Tj +2.668 0 Td +(share )Tj +2.557 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.779 0 Td +(ideas )Tj +2.502 0 Td +(and )Tj +1.891 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.279 0 Td +(code. )Tj +2.669 0 Td +(It )Tj +0.835 0 Td +(is )Tj +0.946 0 Td +(also )Tj +2.002 0 Td +(a )Tj +0.779 0 Td +(\223real )Tj +2.334 0 Td +(w)Tj +0.766 0 Td +(orld\224 )Tj +2.446 0 Td +(application\227it )Tj +6.671 0 Td +(has )Tj +1.724 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.779 0 Td +(run )Tj +-40.755 -1.44 Td +(successfully )Tj +5.63 0 Td +(for )Tj +1.684 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.295 0 Td +(months )Tj +3.685 0 Td +(in )Tj +1.351 0 Td +(production. )Tj +5.52 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.017 0 Td +(is )Tj +1.184 0 Td +(also )Tj +2.24 0 Td +(\223mission )Tj +4.24 0 Td +(critical)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +(\224 )Tj +4.119 0 Td +(An)Tj +1.205 0 Td +(y )Tj +1.017 0 Td +(outage )Tj +3.407 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(immediately )Tj +5.849 0 Td +(noticed )Tj +3.739 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.015 0 Td +(blog )Tj +2.405 0 Td +(visitors )Tj +3.516 0 Td +(and )Tj +2.127 0 Td +(leads )Tj +2.738 0 Td +(to )Tj +1.349 0 Td +(e-mails )Tj +3.626 0 Td +(and )Tj +2.127 0 Td +(tweets\227a )Tj +4.738 0 Td +(reliable )Tj +3.738 0 Td +(emergenc)Tj +4.198 0 Td +(y )Tj +-41.7 -1.44 Td +(management system :-\). )Tj +1.8 -2.24 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.985 0 Td +(is )Tj +1.152 0 Td +(a )Tj +0.985 0 Td +(perfect )Tj +3.43 0 Td +(sample )Tj +3.541 0 Td +(application, )Tj +5.599 0 Td +(but )Tj +1.875 0 Td +(it )Tj +1.041 0 Td +(is )Tj +1.152 0 Td +(not )Tj +1.875 0 Td +(a )Tj +0.985 0 Td +(common )Tj +4.319 0 Td +(use )Tj +1.93 0 Td +(case )Tj +2.374 0 Td +(for )Tj +1.652 0 Td +(an )Tj +1.541 0 Td +(enterprise )Tj +-37.977 -1.44 Td +(project. )Tj +3.77 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.621 0 Td +(data )Tj +2.399 0 Td +(model )Tj +3.288 0 Td +(and )Tj +2.177 0 Td +(the )Tj +1.899 0 Td +(external )Tj +3.973 0 Td +(APIs )Tj +2.455 0 Td +(are )Tj +1.898 0 Td +(too )Tj +1.955 0 Td +(tri)Tj +0.871 0 Td +(vial. )Tj +2.362 0 Td +(Also)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.705 0 Td +(the )Tj +1.899 0 Td +(target )Tj +2.954 0 Td +(domain )Tj +3.844 0 Td +(and )Tj +-40.588 -1.44 Td +(functionality )Tj +5.786 0 Td +(are )Tj +1.727 0 Td +(simple; )Tj +3.506 0 Td +(I )Tj +0.672 0 Td +(tried )Tj +2.339 0 Td +(to )Tj +1.228 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.482 0 Td +(oid )Tj +1.784 0 Td +(descriptions )Tj +5.563 0 Td +(of )Tj +1.228 0 Td +(x)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.894 0 Td +(functionality )Tj +5.786 0 Td +(and )Tj +2.006 0 Td +(concentr)Tj +3.767 0 Td +(ated )Tj +2.228 0 Td +(on )Tj +-41.088 -1.44 Td +(the )Tj +1.657 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.823 0 Td +(EE )Tj +1.323 0 Td +(6 )Tj +0.879 0 Td +(functionality )Tj +5.715 0 Td +(instead. )Tj +3.658 0 Td +(I )Tj +0.601 0 Td +(assume )Tj +3.49 0 Td +(readers )Tj +3.434 0 Td +(are )Tj +1.656 0 Td +(more )Tj +2.545 0 Td +(interested )Tj +4.491 0 Td +(in )Tj +1.157 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.823 0 Td +(EE )Tj +1.323 0 Td +(6 )Tj +0.879 0 Td +(than )Tj +2.213 0 Td +(request)Tj +( )Tj +-39.088 -1.44 Td +(processing or blog softw)Tj +10.431 0 Td +(are integr)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 201.75 303.2001 Tm +(ation.)Tj +-12.675 -2.24 Td +(Y)Tj +/C2_0 1 Tf +0.482 0 Td +<0047004D0001004F0041004400440001005D>Tj +/TT0 1 Tf +(nd all the sour)Tj +9.994 0 Td +(ce code in a Git \()Tj +(http://git-scm.com/)Tj +(\) repository here: )Tj +-12.276 -1.44 Td +(http://ja)Tj +3.25 0 Td +(v)Tj +0.476 0 Td +(a.net/projects/x-r)Tj +7.212 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.499 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.851 0 Td +(see )Tj +1.684 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.795 0 Td +(in )Tj +1.129 0 Td +(action)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.213 0 Td +(just )Tj +1.796 0 Td +(visit )Tj +2.018 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.795 0 Td +(blog )Tj +2.185 0 Td +(at )Tj +1.073 0 Td +(http://blog.adam-bien.com)Tj +( )Tj +-30.751 -1.44 Td +(and look in the right upper corner)Tj +14.488 0 Td +(. )Tj +0.519 0 Td +(All the statistics sho)Tj +8.437 0 Td +(wn there are gener)Tj +8.045 0 Td +(ated b)Tj +2.65 0 Td +(y x-r)Tj +1.932 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(. )Tj +-35.149 -2.24 Td +(F)Tj +0.455 0 Td +(eedbac)Tj +3.094 0 Td +(k, )Tj +1.09 0 Td +(suggestions )Tj +5.203 0 Td +(for )Tj +1.479 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(ements, )Tj +3.646 0 Td +(and )Tj +1.924 0 Td +(discussion )Tj +4.759 0 Td +(are )Tj +1.645 0 Td +(highly )Tj +2.98 0 Td +(appreciated. )Tj +5.647 0 Td +(J)Tj +0.26 0 Td +(ust )Tj +1.535 0 Td +(send )Tj +2.313 0 Td +(me )Tj +-40.867 -1.44 Td +(an )Tj +1.645 0 Td +(e-mail )Tj +3.311 0 Td +(\()Tj +(abien@adam-bien.com)Tj +(\) )Tj +11.114 0 Td +(or )Tj +1.478 0 Td +(a )Tj +1.089 0 Td +(tweet )Tj +2.923 0 Td +(@AdamBien, )Tj +6.168 0 Td +(and )Tj +2.201 0 Td +(I'll )Tj +1.701 0 Td +(try )Tj +1.7 0 Td +(to )Tj +1.423 0 Td +(incorpor)Tj +3.656 0 Td +(ate )Tj +1.867 0 Td +(y)Tj +0.482 0 Td +(our )Tj +-40.755 -1.44 Td +(suggestions )Tj +5.239 0 Td +(in )Tj +1.182 0 Td +(a )Tj +0.848 0 Td +(future )Tj +2.849 0 Td +(update )Tj +3.294 0 Td +(of )Tj +1.182 0 Td +(the )Tj +1.682 0 Td +(book. )Tj +2.794 0 Td +(I )Tj +0.626 0 Td +(will )Tj +1.96 0 Td +(also )Tj +2.071 0 Td +(continue )Tj +4.128 0 Td +(to )Tj +1.182 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.181 0 Td +(topics )Tj +2.905 0 Td +(from )Tj +2.348 0 Td +(this )Tj +1.849 0 Td +(book )Tj +2.516 0 Td +(in )Tj +-41.366 -1.44 Td +(m)Tj +0.821 0 Td +(y blog.)Tj +0.979 -2.24 Td +(Special )Tj +3.423 0 Td +(thanks )Tj +3.09 0 Td +(to )Tj +1.145 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.811 0 Td +(wife )Tj +2.145 0 Td +(Kinga )Tj +2.756 0 Td +(\()Tj +(http://design.gr)Tj +6.658 0 Td +(aphikerin.com)Tj +(\) )Tj +6.813 0 Td +(for )Tj +1.478 0 Td +(the )Tj +1.645 0 Td +(great )Tj +2.422 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.589 0 Td +(P)Tj +0.464 0 Td +(atric)Tj +1.871 0 Td +(k )Tj +0.811 0 Td +(for )Tj +-41.033 -1.44 Td +(the )Tj +1.824 0 Td +(in-depth )Tj +4.103 0 Td +(tec)Tj +1.26 0 Td +(hnical )Tj +3.158 0 Td +(review )Tj +3.379 0 Td +(and )Tj +2.102 0 Td +(sometimes)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(unusual )Tj +8.77 0 Td +(feedbac)Tj +3.372 0 Td +(k, )Tj +1.268 0 Td +(and )Tj +2.102 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.99 0 Td +(editor )Tj +2.991 0 Td +(Karen )Tj +2.99 0 Td +(P)Tj +0.511 0 Td +(erkins )Tj +-39.644 -1.44 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.linkedin.com/in/karenjperkins)Tj +(\) for an excellent review)Tj +23.434 0 Td +(. )Tj +-26.674 -2.24 Td +(April 2011, en route from Munic)Tj +14.044 0 Td +(h to Las )Tj +3.521 0 Td +(V)Tj +0.612 0 Td +(egas \(to a J)Tj +4.601 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a conference\205\),)Tj +-23.724 -2.24 Td +(Adam Bien)Tj +ET + +endstream +endobj +29 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 31 0 R>>endobj +30 0 obj<>endobj +31 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(11)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +(Setting the Stage)Tj +64 0 0 64 443.416 507.8 Tm +(1)Tj +/TT0 1 Tf +10 0 0 10 75 429.4 Tm +(W)Tj +0.963 0 Td +(ebalizer )Tj +3.922 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.webalizer)Tj +4.427 0 Td +(.org/)Tj +(\) )Tj +2.7 0 Td +(w)Tj +0.76 0 Td +(asn't )Tj +2.478 0 Td +(able )Tj +2.311 0 Td +(to )Tj +1.311 0 Td +(process )Tj +3.7 0 Td +(the )Tj +1.774 0 Td +(Apac)Tj +2.205 0 Td +(he )Tj +1.533 0 Td +(HTTP )Tj +2.923 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.31 0 Td +(log)Tj +( )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.048 0 Td +(in )Tj +1.159 0 Td +(a )Tj +0.825 0 Td +(single )Tj +2.826 0 Td +(night )Tj +2.493 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.825 0 Td +(more. )Tj +2.751 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.381 0 Td +(statistics )Tj +3.882 0 Td +(for )Tj +1.492 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.825 0 Td +(blog )Tj +2.215 0 Td +(\()Tj +(http://blog.adam-bien.com)Tj +(\) )Tj +12.33 0 Td +(just )Tj +1.826 0 Td +(looked )Tj +-39.254 -1.44 Td +(too )Tj +1.723 0 Td +(good. )Tj +2.779 0 Td +(My )Tj +1.722 0 Td +(blog )Tj +2.223 0 Td +(is )Tj +1 0 Td +(serv)Tj +1.71 0 Td +(ed )Tj +1.389 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.833 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.556 0 Td +(v3 )Tj +1.389 0 Td +(from )Tj +2.333 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.833 0 Td +(home )Tj +2.778 0 Td +(netw)Tj +2.1 0 Td +(ork. )Tj +2 0 Td +(Sometimes, )Tj +5.278 0 Td +(the )Tj +1.667 0 Td +(tr)Tj +/C2_0 1 Tf +0.599 0 Td +<0039003E005D>Tj +/TT0 1 Tf +(c )Tj +2.167 0 Td +(is )Tj +1 0 Td +(so )Tj +-41.255 -1.44 Td +(high that I ha)Tj +5.64 0 Td +(v)Tj +0.488 0 Td +(e to kill the )Tj +5.077 0 Td +(Apac)Tj +2.205 0 Td +(he serv)Tj +3.044 0 Td +(er to be able to bro)Tj +8.214 0 Td +(wse the )Tj +3.52 0 Td +(W)Tj +0.963 0 Td +(eb or send an e-mail. )Tj +-27.351 -2.24 Td +(My )Tj +/C2_0 1 Tf +1.721 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.888 0 Td +(idea )Tj +2.166 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.221 0 Td +(to )Tj +1.166 0 Td +(split )Tj +2.111 0 Td +(the )Tj +1.629 0 Td +(Apac)Tj +2.205 0 Td +(he )Tj +1.388 0 Td +(HTTP )Tj +2.778 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +/C2_0 1 Tf +1.165 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.055 0 Td +(and )Tj +1.944 0 Td +(process )Tj +3.555 0 Td +(them )Tj +2.499 0 Td +(separ)Tj +2.266 0 Td +(ately)Tj +1.964 0 Td +(. )Tj +0.61 0 Td +(It )Tj +0.888 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +-40.254 -1.44 Td +(be )Tj +1.477 0 Td +(more )Tj +2.643 0 Td +(an )Tj +1.477 0 Td +(administr)Tj +3.989 0 Td +(ati)Tj +1.038 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.921 0 Td +(task )Tj +2.088 0 Td +(and )Tj +2.033 0 Td +(not )Tj +1.811 0 Td +(muc)Tj +1.871 0 Td +(h )Tj +0.977 0 Td +(fun )Tj +1.811 0 Td +(to )Tj +1.255 0 Td +(implement. )Tj +5.311 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.31 0 Td +(a )Tj +0.921 0 Td +(pet )Tj +1.755 0 Td +(project, )Tj +3.7 0 Td +(too )Tj +1.811 0 Td +(boring. )Tj +-39.143 -1.44 Td +(T)Tj +0.511 0 Td +(hen, )Tj +2.257 0 Td +(I )Tj +0.645 0 Td +(considered )Tj +5.091 0 Td +(using )Tj +2.646 0 Td +(Hadoop )Tj +3.869 0 Td +(with )Tj +2.257 0 Td +(Scala )Tj +2.645 0 Td +(to )Tj +1.201 0 Td +(process )Tj +3.59 0 Td +(the )Tj +1.701 0 Td +(log )Tj +/C2_0 1 Tf +1.701 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.09 0 Td +(in )Tj +1.201 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.867 0 Td +(o)Tj +0.544 0 Td +(wn )Tj +1.701 0 Td +(pri)Tj +1.149 0 Td +(v)Tj +0.476 0 Td +(ate )Tj +1.645 0 Td +(cloud )Tj +2.813 0 Td +(\(a)Tj +( )Tj +-41.422 -1.44 Td +(few )Tj +2.054 0 Td +(old )Tj +1.888 0 Td +(mac)Tj +1.815 0 Td +(hines\). )Tj +3.259 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.721 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.444 0 Td +(w)Tj +0.766 0 Td +(ork, )Tj +2.165 0 Td +(but )Tj +1.888 0 Td +(the )Tj +1.832 0 Td +(effort )Tj +2.721 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.444 0 Td +(be )Tj +1.554 0 Td +(too )Tj +1.888 0 Td +(large, )Tj +2.887 0 Td +(especially )Tj +4.777 0 Td +(since )Tj +2.721 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(Hadoop )Tj +/C2_0 1 Tf +3.936 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.602 0 Td +(and )Tj +2.046 0 Td +(setup )Tj +2.713 0 Td +(is )Tj +1.101 0 Td +(not )Tj +1.824 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.767 0 Td +(exciting. )Tj +4.102 0 Td +(Furthermore, )Tj +5.99 0 Td +(extr)Tj +1.599 0 Td +(acting )Tj +3.046 0 Td +(information )Tj +5.436 0 Td +(from )Tj +-40.2 -1.44 Td +(Apac)Tj +/C2_0 1 Tf +2.205 0 Td +<0040003D000100440047003F0001005D>Tj +/TT0 1 Tf +(les is not v)Tj +8.048 0 Td +(ery interesting for a leisure acti)Tj +13.208 0 Td +(vity)Tj +1.464 0 Td +(.)Tj +-23.125 -2.24 Td +(So, I looked for a quic)Tj +9.487 0 Td +(k hac)Tj +2.316 0 Td +(k with some \223fun factor)Tj +9.985 0 Td +(.)Tj +0.223 0 Td +(\224 )Tj +-22.011 -2.48 Td +(My )Tj +1.825 0 Td +(blog )Tj +2.326 0 Td +(runs )Tj +2.27 0 Td +(on)Tj +12 0 0 12 150.3265 244.6001 Tm +( )Tj +10 0 0 10 155.5571 244.6001 Tm +(Roller )Tj +2.992 0 Td +(\()Tj +(http://rollerweblogger)Tj +9.485 0 Td +(.org/project/)Tj +(\), )Tj +6.216 0 Td +(an )Tj +1.492 0 Td +(open )Tj +2.604 0 Td +(sour)Tj +1.822 0 Td +(ce, )Tj +1.714 0 Td +(popular)Tj +3.261 0 Td +(, )Tj +0.714 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a-)Tj +-41.367 -1.44 Td +(based )Tj +2.826 0 Td +(blogging )Tj +4.049 0 Td +(platform. )Tj +4.215 0 Td +(Roller )Tj +2.881 0 Td +(is )Tj +0.992 0 Td +(a )Tj +0.825 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.825 0 Td +(application )Tj +5.161 0 Td +(pac)Tj +1.538 0 Td +(kaged )Tj +2.881 0 Td +(as )Tj +1.214 0 Td +(a )Tj +0.788 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.344 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hi)Tj +0.816 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.825 0 Td +(\(W)Tj +1.233 0 Td +(AR\) )Tj +1.881 0 Td +(that )Tj +1.937 0 Td +(runs)Tj +( )Tj +-40.366 -1.44 Td +(on )Tj +1.446 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.667 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.834 0 Td +(2 )Tj +0.89 0 Td +(Platform, )Tj +4.224 0 Td +(Enterprise )Tj +4.557 0 Td +(Edition )Tj +3.336 0 Td +(\(J2EE\) )Tj +2.724 0 Td +(1.4 )Tj +1.687 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.39 0 Td +(container)Tj +3.983 0 Td +(, )Tj +0.612 0 Td +(and )Tj +1.946 0 Td +(it\222)Tj +0.742 0 Td +(s )Tj +0.723 0 Td +(easy )Tj +2.223 0 Td +(to )Tj +1.168 0 Td +(install, )Tj +3.169 0 Td +(run,)Tj +( )Tj +-40.477 -1.44 Td +(and )Tj +2.058 0 Td +(maintain. )Tj +4.503 0 Td +(It )Tj +1.002 0 Td +(uses )Tj +2.243 0 Td +(Apac)Tj +2.205 0 Td +(he )Tj +1.502 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +1.113 0 Td +(internally)Tj +3.965 0 Td +(, )Tj +0.724 0 Td +(but )Tj +1.836 0 Td +(it )Tj +1.002 0 Td +(does )Tj +2.447 0 Td +(not )Tj +1.836 0 Td +(rely )Tj +2.057 0 Td +(on )Tj +1.558 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.946 0 Td +(existing )Tj +3.725 0 Td +(app )Tj +-40.588 -1.44 Td +(serv)Tj +1.71 0 Td +(er functionality)Tj +6.411 0 Td +(. It is a typical Spring application.)Tj +-6.321 -2.24 Td +(As )Tj +1.52 0 Td +(a )Tj +0.964 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.964 0 Td +(dev)Tj +1.544 0 Td +(eloper)Tj +2.649 0 Td +(, )Tj +0.742 0 Td +(the )Tj +1.798 0 Td +(simplest )Tj +3.965 0 Td +(possible )Tj +3.966 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.964 0 Td +(to )Tj +1.298 0 Td +(solv)Tj +1.711 0 Td +(e )Tj +0.964 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.964 0 Td +(problem )Tj +4.076 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.41 0 Td +(be )Tj +1.52 0 Td +(to )Tj +1.298 0 Td +(slightly )Tj +-39.143 -1.44 Td +(extend )Tj +3.31 0 Td +(the )Tj +1.754 0 Td +(Roller )Tj +2.976 0 Td +(application, )Tj +5.534 0 Td +(extr)Tj +1.599 0 Td +(act )Tj +1.698 0 Td +(the )Tj +1.754 0 Td +(relev)Tj +2.087 0 Td +(ant )Tj +1.754 0 Td +(information )Tj +5.422 0 Td +(from )Tj +2.42 0 Td +(the )Tj +1.754 0 Td +(request, )Tj +3.81 0 Td +(and )Tj +2.032 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.476 0 Td +(the )Tj +-40.866 -1.44 Td +(results.)Tj +ET + +endstream +endobj +32 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 33 0 R>>endobj +33 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(12)Tj +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 593.2 Tm +(Gathering the Requirements)Tj +/TT0 1 Tf +10 0 0 10 75 570.8 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.46 0 Td +(pet )Tj +1.738 0 Td +(project )Tj +3.405 0 Td +(described )Tj +4.572 0 Td +(herein, )Tj +3.405 0 Td +(blog )Tj +2.294 0 Td +(statistics )Tj +3.961 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +1.737 0 Td +(I )Tj +0.682 0 Td +(call )Tj +1.96 0 Td +(\223x-r)Tj +1.598 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(,)Tj +0.223 0 Td +(\224 )Tj +0.848 0 Td +(has )Tj +1.849 0 Td +(24/7 )Tj +2.35 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +-38.476 -1.44 Td +(requirements. )Tj +6.171 0 Td +(I )Tj +0.559 0 Td +(didn\222)Tj +2.187 0 Td +(t )Tj +0.559 0 Td +(really )Tj +2.67 0 Td +(gather )Tj +2.948 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.781 0 Td +(other )Tj +2.504 0 Td +(requirements )Tj +5.893 0 Td +(up )Tj +1.393 0 Td +(front. )Tj +2.486 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.337 0 Td +(requirements )Tj +5.893 0 Td +(are )Tj +1.614 0 Td +(ob)Tj +1.1 0 Td +(vious, )Tj +-39.643 -1.44 Td +(since )Tj +2.774 0 Td +(I )Tj +0.829 0 Td +(am )Tj +1.884 0 Td +(the )Tj +1.885 0 Td +(domain )Tj +3.83 0 Td +(expert, )Tj +3.496 0 Td +(oper)Tj +1.933 0 Td +(ator)Tj +1.593 0 Td +(, )Tj +0.829 0 Td +(quality )Tj +3.497 0 Td +(assur)Tj +2.155 0 Td +(ance )Tj +2.607 0 Td +(department, )Tj +5.719 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitect, )Tj +3.219 0 Td +(tester)Tj +2.204 0 Td +(, )Tj +0.829 0 Td +(and )Tj +-40.588 -1.44 Td +(dev)Tj +1.544 0 Td +(eloper all in one person. )Tj +10.709 0 Td +(T)Tj +0.511 0 Td +(his is a v)Tj +3.712 0 Td +(ery comfortable situation. )Tj +-14.676 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.577 0 Td +(main )Tj +2.688 0 Td +(difference )Tj +4.8 0 Td +(between )Tj +4.189 0 Td +(a )Tj +1.021 0 Td +(pet )Tj +1.855 0 Td +(project )Tj +3.522 0 Td +(and )Tj +2.133 0 Td +(real )Tj +2.132 0 Td +(w)Tj +0.766 0 Td +(orld )Tj +2.244 0 Td +(application )Tj +5.357 0 Td +(is )Tj +1.188 0 Td +(the )Tj +1.855 0 Td +(fun )Tj +1.911 0 Td +(factor)Tj +2.371 0 Td +(. )Tj +-41.922 -1.44 Td +(Primarily)Tj +3.797 0 Td +(, )Tj +0.732 0 Td +(a )Tj +0.954 0 Td +(pet )Tj +1.788 0 Td +(project )Tj +3.455 0 Td +(should )Tj +3.345 0 Td +(be )Tj +1.51 0 Td +(fun, )Tj +2.122 0 Td +(w)Tj +0.76 0 Td +(hereas )Tj +3.232 0 Td +(real )Tj +2.065 0 Td +(w)Tj +0.766 0 Td +(orld )Tj +2.177 0 Td +(apps )Tj +2.455 0 Td +(need )Tj +2.566 0 Td +(to )Tj +1.288 0 Td +(be )Tj +1.51 0 Td +(maintainable )Tj +6.067 0 Td +(and )Tj +-40.588 -1.44 Td +(ev)Tj +0.988 0 Td +(entually )Tj +3.854 0 Td +(w)Tj +0.766 0 Td +(ork )Tj +1.797 0 Td +(as )Tj +/C2_0 1 Tf +1.297 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed. )Tj +4.521 0 Td +(In )Tj +1.242 0 Td +(contr)Tj +2.211 0 Td +(ast )Tj +1.575 0 Td +(to )Tj +1.242 0 Td +(the )Tj +1.742 0 Td +(real )Tj +2.019 0 Td +(w)Tj +0.766 0 Td +(orld )Tj +2.131 0 Td +(application )Tj +5.244 0 Td +(dev)Tj +1.544 0 Td +(elopment, )Tj +4.743 0 Td +(during )Tj +3.187 0 Td +(the )Tj +-40.866 -1.44 Td +(dev)Tj +1.544 0 Td +(elopment )Tj +4.612 0 Td +(of )Tj +1.389 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.833 0 Td +(no )Tj +1.667 0 Td +(politics )Tj +3.669 0 Td +(were )Tj +2.667 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(olv)Tj +1.322 0 Td +(ed. )Tj +1.889 0 Td +(If )Tj +1.111 0 Td +(there )Tj +2.722 0 Td +(were, )Tj +2.945 0 Td +(it )Tj +1.111 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.502 0 Td +(be )Tj +1.611 0 Td +(a )Tj +1.056 0 Td +(sure )Tj +2.334 0 Td +(sign )Tj +2.279 0 Td +(of )Tj +-41.366 -1.44 Td +(sc)Tj +0.871 0 Td +(hizophrenia :-\))Tj +/TT1 1 Tf +12 0 0 12 57 411.2 Tm +(Functional Requirements and the Problem Statement)Tj +/TT0 1 Tf +10 0 0 10 75 388.8 Tm +(Roller )Tj +3.043 0 Td +(comes )Tj +3.265 0 Td +(with )Tj +2.377 0 Td +(rudimentary )Tj +5.709 0 Td +(statistics )Tj +4.043 0 Td +(alread)Tj +2.643 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.764 0 Td +(It )Tj +1.042 0 Td +(sho)Tj +1.489 0 Td +(ws )Tj +1.653 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.599 0 Td +(the )Tj +1.82 0 Td +(total )Tj +2.377 0 Td +(hit )Tj +1.598 0 Td +(count )Tj +2.933 0 Td +(and )Tj +2.099 0 Td +(all )Tj +-41.144 -1.44 Td +(referers. )Tj +3.655 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.341 0 Td +(referers )Tj +3.451 0 Td +(tend )Tj +2.175 0 Td +(to )Tj +1.119 0 Td +(attr)Tj +1.377 0 Td +(act )Tj +1.563 0 Td +(spammers, )Tj +4.896 0 Td +(and )Tj +1.897 0 Td +(the )Tj +1.619 0 Td +(global )Tj +2.953 0 Td +(hit )Tj +1.397 0 Td +(count )Tj +2.731 0 Td +(is )Tj +0.952 0 Td +(too )Tj +1.675 0 Td +(coarse )Tj +3.063 0 Td +(gr)Tj +0.821 0 Td +(ained. )Tj +2.953 0 Td +(Plus, )Tj +-40.143 -1.44 Td +(the really interesting features are not implemented b)Tj +22.378 0 Td +(y Roller:)Tj +/C2_0 1 Tf +-21.278 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(P)Tj +0.511 0 Td +(er)Tj +0.778 0 Td +(-post statistics)Tj +/C2_0 1 Tf +-3.789 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Minutely)Tj +3.743 0 Td +(, hourly)Tj +3.243 0 Td +(, and daily hit r)Tj +6.547 0 Td +(ates)Tj +/C2_0 1 Tf +-16.033 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Most successful posts)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(T)Tj +0.482 0 Td +(rending posts)Tj +/C2_0 1 Tf +-2.982 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Representational State )Tj +9.707 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansfer \(REST\) interface)Tj +/C2_0 1 Tf +-13.01 -2.24 Td +<0055>Tj +2.5 0 Td +<0021000A0045003900410044000100460047004C0041005D>Tj +/TT0 1 Tf +(cations)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +2.5 0 Td +<0031002E00280001005D>Tj +/TT0 1 Tf +(ltering)Tj +-1.8 -2.24 Td +(All )Tj +1.596 0 Td +(the )Tj +1.707 0 Td +(statistics )Tj +3.93 0 Td +(should )Tj +3.264 0 Td +(be )Tj +1.429 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.263 0 Td +(in )Tj +1.207 0 Td +(real )Tj +1.984 0 Td +(time. )Tj +2.54 0 Td +(\223Real )Tj +2.706 0 Td +(time\224 )Tj +2.706 0 Td +(means )Tj +3.151 0 Td +(hourly )Tj +3.152 0 Td +(statistics )Tj +3.93 0 Td +(should)Tj +( )Tj +-39.309 -1.44 Td +(be )Tj +1.423 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.257 0 Td +(after )Tj +2.256 0 Td +(an )Tj +1.423 0 Td +(hour )Tj +2.368 0 Td +(and )Tj +1.979 0 Td +(minutely )Tj +4.146 0 Td +(statistics )Tj +3.924 0 Td +(should )Tj +3.258 0 Td +(be )Tj +1.423 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.257 0 Td +(after )Tj +2.256 0 Td +(a )Tj +0.867 0 Td +(minute. )Tj +3.609 0 Td +(A )Tj +1.034 0 Td +(real-time )Tj +-38.367 -1.44 Td +(monitor )Tj +3.903 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.459 0 Td +(be )Tj +1.569 0 Td +(compelling )Tj +5.348 0 Td +(and )Tj +2.125 0 Td +(also )Tj +2.236 0 Td +(relati)Tj +2.149 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.791 0 Td +(easy )Tj +2.402 0 Td +(to )Tj +1.347 0 Td +(implement. )Tj +5.329 0 Td +(T)Tj +0.482 0 Td +(rue )Tj +1.902 0 Td +(real-time )Tj +4.346 0 Td +(statistics )Tj +-38.643 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.353 0 Td +(require )Tj +3.463 0 Td +(a )Tj +0.907 0 Td +(connection )Tj +5.243 0 Td +(to )Tj +1.241 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.963 0 Td +(bro)Tj +1.433 0 Td +(wser )Tj +2.407 0 Td +(windo)Tj +2.712 0 Td +(w)Tj +0.704 0 Td +(. )Tj +0.611 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.296 0 Td +(is )Tj +1.074 0 Td +(no )Tj +1.519 0 Td +(problem )Tj +4.019 0 Td +(maintaining )Tj +5.52 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +-41.422 -1.44 Td +(thousands )Tj +4.714 0 Td +(of )Tj +1.212 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.934 0 Td +(connections )Tj +5.603 0 Td +(from )Tj +2.378 0 Td +(a )Tj +0.878 0 Td +(modern )Tj +3.712 0 Td +(application )Tj +5.214 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.656 0 Td +(but )Tj +1.768 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.878 0 Td +(Internet )Tj +3.657 0 Td +(connection )Tj +5.214 0 Td +(is )Tj +-41.533 -1.44 Td +(too slo)Tj +2.879 0 Td +(w for suc)Tj +3.928 0 Td +(h a requirement. )Tj +ET + +endstream +endobj +34 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 36 0 R>>endobj +35 0 obj<>endobj +36 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(13)Tj +0 Tc 0 Tw -18.632 57.06 Td +(So )Tj +1.525 0 Td +(far)Tj +1.037 0 Td +(, )Tj +0.747 0 Td +(I\222)Tj +0.501 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.969 0 Td +(described )Tj +4.637 0 Td +(only )Tj +2.359 0 Td +(a )Tj +0.969 0 Td +(minimal )Tj +4.025 0 Td +(set )Tj +1.636 0 Td +(of )Tj +1.303 0 Td +(requirements. )Tj +6.322 0 Td +(As )Tj +1.525 0 Td +(the )Tj +1.803 0 Td +(project )Tj +3.47 0 Td +(ev)Tj +0.982 0 Td +(olv)Tj +1.322 0 Td +(es )Tj +1.358 0 Td +(and )Tj +2.081 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(statistics data becomes a)Tj +10.529 0 Td +(v)Tj +0.476 0 Td +(ailable, new requirements will ev)Tj +14.32 0 Td +(olv)Tj +1.322 0 Td +(e.)Tj +-24.847 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.623 0 Td +(problem )Tj +4.179 0 Td +(statement )Tj +4.679 0 Td +(for )Tj +1.734 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.067 0 Td +(can )Tj +2.123 0 Td +(be )Tj +/C2_0 1 Tf +1.623 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(ned )Tj +3.791 0 Td +(as )Tj +1.456 0 Td +(this: )Tj +2.346 0 Td +(\223In )Tj +1.845 0 Td +(order )Tj +2.845 0 Td +(to )Tj +1.401 0 Td +(pro)Tj +1.433 0 Td +(vide )Tj +2.401 0 Td +(detailed,)Tj +( )Tj +-38.476 -1.44 Td +(real)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(time )Tj +4.404 0 Td +(statistics, )Tj +4.139 0 Td +(the )Tj +1.638 0 Td +(Roller )Tj +2.86 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +1.637 0 Td +(needs )Tj +2.805 0 Td +(to )Tj +1.138 0 Td +(be )Tj +1.36 0 Td +(extended. )Tj +4.528 0 Td +(In )Tj +1.138 0 Td +(addition, )Tj +4.14 0 Td +(the )Tj +1.638 0 Td +(tr)Tj +/C2_0 1 Tf +0.599 0 Td +<0039003E005D>Tj +/TT0 1 Tf +(c )Tj +2.138 0 Td +(data )Tj +2.138 0 Td +(needs )Tj +2.805 0 Td +(to)Tj +( )Tj +-41.366 -1.44 Td +(be )Tj +1.401 0 Td +(persisted, )Tj +4.402 0 Td +(analyzed, )Tj +4.513 0 Td +(and )Tj +1.957 0 Td +(ev)Tj +0.988 0 Td +(entually )Tj +3.791 0 Td +(displa)Tj +2.527 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.401 0 Td +(to )Tj +1.179 0 Td +(the )Tj +1.679 0 Td +(blog )Tj +2.235 0 Td +(reader)Tj +2.648 0 Td +(. )Tj +0.549 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.401 0 Td +(blog )Tj +2.235 0 Td +(o)Tj +0.544 0 Td +(wner )Tj +2.512 0 Td +(should )Tj +3.236 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +/C2_0 1 Tf +-41.7 -1.44 Td +<0039003B003B003D004B004B0001004C00470001005D>Tj +/TT0 1 Tf +(ner and more detailed information, suc)Tj +21.49 0 Td +(h as referers.)Tj +5.39 0 Td +(\224)Tj +/TT2 1 Tf +12 0 0 12 57 513.2 Tm +(Non-Functional Requirements)Tj +/TT0 1 Tf +10 0 0 10 75 490.8 Tm +(T)Tj +0.511 0 Td +(he real-time computation and a)Tj +13.53 0 Td +(v)Tj +0.476 0 Td +(ailability of statistics could be considered as a non-)Tj +-16.317 -1.44 Td +(functional requirement. In our case, real-time feedbac)Tj +23.156 0 Td +(k is the actual goal and the main )Tj +-23.156 -1.44 Td +(differentiating feature. Unfortunately)Tj +15.581 0 Td +(, the Roller application needs to be manipulated to access the )Tj +-15.581 -1.44 Td +(statistics, w)Tj +4.873 0 Td +(hic)Tj +1.316 0 Td +(h implies some non-functional requirements:)Tj +/C2_0 1 Tf +-5.089 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(T)Tj +0.511 0 Td +(he installation should be as non-intrusi)Tj +16.658 0 Td +(v)Tj +/C2_0 1 Tf +0.488 0 Td +<003D00010039004B000100480047004B004B0041003A0044003D000B0001002100500041004B004C00410046003F0001002E004700440044003D004A0001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +15.939 0 Td +(ations )Tj +-33.596 -1.44 Td +(should not be extensi)Tj +9.154 0 Td +(v)Tj +0.488 0 Td +(ely manipulated or c)Tj +8.874 0 Td +(hanged.)Tj +/C2_0 1 Tf +-21.016 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Roller comes with an extensi)Tj +12.375 0 Td +(v)Tj +0.488 0 Td +(e set of fr)Tj +3.934 0 Td +(amew)Tj +2.599 0 Td +(orks and libr)Tj +5.379 0 Td +(aries. )Tj +2.482 0 Td +(T)Tj +0.511 0 Td +(he Roller extension )Tj +/C2_0 1 Tf +-27.768 -1.44 Td +<004B00400047004D0044003C0001003A003D0001004B003D0044003E000A004B004D003E005D>Tj +/TT0 1 Tf +(cient, without an)Tj +15.324 0 Td +(y external dependencies.)Tj +/C2_0 1 Tf +-17.824 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(T)Tj +0.511 0 Td +(he statistics softw)Tj +7.43 0 Td +(are must not be dependent on a particular Roller v)Tj +21.663 0 Td +(ersion.)Tj +/C2_0 1 Tf +-32.104 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(T)Tj +0.511 0 Td +(he blog performance should be not affected b)Tj +19.602 0 Td +(y the statistics softw)Tj +8.486 0 Td +(are.)Tj +/C2_0 1 Tf +-31.099 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(T)Tj +0.511 0 Td +(he a)Tj +1.804 0 Td +(v)Tj +0.476 0 Td +(ailability of the blog must not be affected.)Tj +-4.591 -2.24 Td +(T)Tj +0.511 0 Td +(he generic non-functional requirements abo)Tj +18.884 0 Td +(v)Tj +0.488 0 Td +(e were prioritized into the follo)Tj +13.383 0 Td +(wing list in )Tj +-35.066 -1.44 Td +(descending order:)Tj +/C2_0 1 Tf +1.1 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Robustness/a)Tj +5.528 0 Td +(v)Tj +0.476 0 Td +(ailability)Tj +/C2_0 1 Tf +-8.504 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Runtime performance)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Self-monitoring capabilities)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(T)Tj +0.456 0 Td +(estability/maintainability)Tj +/C2_0 1 Tf +-2.956 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Easy installation)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Scalability)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Extensibility)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Report performance \(for accessing the statistics information via REST\)\ )Tj +ET + +endstream +endobj +37 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 38 0 R>>endobj +38 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(14)Tj +0 Tc 0 Tw -18.632 57.06 Td +(T)Tj +0.511 0 Td +(he robustness and a)Tj +8.474 0 Td +(v)Tj +0.476 0 Td +(ailability of x-r)Tj +6.268 0 Td +(a)Tj +0.47 0 Td +(y is the most important feature. Gathering of statistics )Tj +-17.999 -1.44 Td +(must not affect the blog a)Tj +10.864 0 Td +(v)Tj +0.476 0 Td +(ailability)Tj +3.632 0 Td +(.)Tj +/TT1 1 Tf +12 0 0 12 57 551.6 Tm +(Constr)Tj +2.878 0 Td +(aints)Tj +/TT0 1 Tf +10 0 0 10 75 529.2 Tm +(Roller )Tj +2.987 0 Td +(\()Tj +(http://rollerweblogger)Tj +9.485 0 Td +(.org/project/)Tj +(\) )Tj +5.933 0 Td +(r)Tj +0.321 0 Td +(an )Tj +1.487 0 Td +(for )Tj +1.598 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.264 0 Td +(4 )Tj +0.987 0 Td +(y)Tj +0.482 0 Td +(ears )Tj +2.153 0 Td +(on )Tj +1.543 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.654 0 Td +(v2. )Tj +1.765 0 Td +(Recently)Tj +3.631 0 Td +(, )Tj +0.709 0 Td +(it)Tj +( )Tj +-41.644 -1.44 Td +(w)Tj +0.76 0 Td +(as )Tj +1.294 0 Td +(migr)Tj +1.932 0 Td +(ated )Tj +2.239 0 Td +(to )Tj +1.239 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.628 0 Td +(v3.1, )Tj +2.573 0 Td +(J2SE )Tj +2.239 0 Td +(Softw)Tj +2.372 0 Td +(are )Tj +1.738 0 Td +(Dev)Tj +1.766 0 Td +(elopment )Tj +4.462 0 Td +(Kit )Tj +1.572 0 Td +(\(JDK\) )Tj +2.628 0 Td +(1.6, )Tj +2.073 0 Td +(and )Tj +2.017 0 Td +(fully )Tj +2.295 0 Td +(virtualized )Tj +-37.643 -1.44 Td +(Or)Tj +1.154 0 Td +(acle Enterprise Linux \(w)Tj +10.263 0 Td +(hic)Tj +1.316 0 Td +(h is compatible with Red Hat Linux\). GlassF)Tj +18.879 0 Td +(ish v3+ )Tj +-31.612 -1.44 Td +(\()Tj +0.295 0 Td +(h)Tj +0.573 0 Td +(t)Tj +0.295 0 Td +(t)Tj +0.295 0 Td +(p)Tj +0.573 0 Td +(:)Tj +0.295 0 Td +(/)Tj +0.295 0 Td +(/)Tj +0.295 0 Td +(g)Tj +0.517 0 Td +(l)Tj +0.295 0 Td +(a)Tj +0.517 0 Td +(s)Tj +0.406 0 Td +(s)Tj +/C2_0 1 Tf +0.406 0 Td +<005D>Tj +/TT0 1 Tf +0.573 0 Td +(s)Tj +0.406 0 Td +(h)Tj +0.573 0 Td +(.)Tj +0.295 0 Td +(j)Tj +0.295 0 Td +(a)Tj +0.487 0 Td +(v)Tj +0.493 0 Td +(a)Tj +0.517 0 Td +(.)Tj +0.295 0 Td +(n)Tj +0.573 0 Td +(e)Tj +0.517 0 Td +(t)Tj +0.295 0 Td +(/)Tj +0.295 0 Td +(\) )Tj +1.065 0 Td +(i)Tj +0.295 0 Td +(s )Tj +1.176 0 Td +(t)Tj +0.295 0 Td +(h)Tj +0.573 0 Td +(e )Tj +1.287 0 Td +(J)Tj +0.283 0 Td +(a)Tj +0.487 0 Td +(v)Tj +0.493 0 Td +(a )Tj +1.287 0 Td +(P)Tj +0.573 0 Td +(l)Tj +0.295 0 Td +(a)Tj +0.517 0 Td +(t)Tj +0.295 0 Td +(f)Tj +0.295 0 Td +(o)Tj +0.573 0 Td +(r)Tj +0.35 0 Td +(m)Tj +0.85 0 Td +(, )Tj +1.065 0 Td +(E)Tj +0.517 0 Td +(n)Tj +0.573 0 Td +(t)Tj +0.295 0 Td +(e)Tj +0.517 0 Td +(r)Tj +0.35 0 Td +(p)Tj +0.573 0 Td +(r)Tj +0.35 0 Td +(i)Tj +0.295 0 Td +(s)Tj +0.406 0 Td +(e )Tj +1.287 0 Td +(E)Tj +0.517 0 Td +(d)Tj +0.573 0 Td +(i)Tj +0.295 0 Td +(t)Tj +0.295 0 Td +(i)Tj +0.295 0 Td +(o)Tj +0.573 0 Td +(n )Tj +1.343 0 Td +(\()Tj +0.295 0 Td +(J)Tj +0.283 0 Td +(a)Tj +0.487 0 Td +(v)Tj +0.493 0 Td +(a )Tj +1.287 0 Td +(E)Tj +0.517 0 Td +(E)Tj +0.517 0 Td +(\) )Tj +1.065 0 Td +(6 )Tj +1.343 0 Td +(r)Tj +0.35 0 Td +(e)Tj +0.517 0 Td +(f)Tj +0.295 0 Td +(e)Tj +0.517 0 Td +(r)Tj +0.35 0 Td +(e)Tj +0.517 0 Td +(n)Tj +0.573 0 Td +(c)Tj +0.517 0 Td +(e)Tj +( )Tj +-41.7 -1.44 Td +(implementation. )Tj +1.8 -2.24 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.887 0 Td +(is )Tj +1.054 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.443 0 Td +(on )Tj +1.499 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.61 0 Td +(v3 )Tj +1.443 0 Td +(and )Tj +1.999 0 Td +(so )Tj +1.332 0 Td +(it )Tj +0.943 0 Td +(can )Tj +1.943 0 Td +(lev)Tj +1.266 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.887 0 Td +(all )Tj +1.443 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.887 0 Td +(EE )Tj +1.387 0 Td +(6 )Tj +0.943 0 Td +(features )Tj +3.721 0 Td +(without )Tj +3.667 0 Td +(an)Tj +1.038 0 Td +(y )Tj +-41.7 -1.44 Td +(constr)Tj +2.6 0 Td +(aints. )Tj +2.566 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.343 0 Td +(3 )Tj +0.843 0 Td +(\()Tj +(http://ma)Tj +4.083 0 Td +(v)Tj +0.488 0 Td +(en.apac)Tj +3.372 0 Td +(he.org/)Tj +(\) )Tj +3.566 0 Td +(is )Tj +0.954 0 Td +(used )Tj +2.288 0 Td +(as )Tj +1.176 0 Td +(a )Tj +0.787 0 Td +(build )Tj +2.511 0 Td +(tool )Tj +1.955 0 Td +(that )Tj +1.899 0 Td +(is )Tj +0.954 0 Td +(executed )Tj +4.177 0 Td +(on )Tj +1.399 0 Td +(Hudson)Tj +( )Tj +-38.809 -1.44 Td +(\()Tj +(http://ja)Tj +3.528 0 Td +(v)Tj +0.476 0 Td +(a.net/projects/hudson/)Tj +(\) and the J)Tj +13.829 0 Td +(enkins Continuous Integr)Tj +10.716 0 Td +(ation \(CI\) serv)Tj +5.935 0 Td +(er )Tj +-34.484 -1.44 Td +(\()Tj +(http://jenkins-ci.org/)Tj +(\).)Tj +1.8 -2.24 Td +(Roller )Tj +3.093 0 Td +(runs )Tj +2.371 0 Td +(on )Tj +1.649 0 Td +(a )Tj +1.037 0 Td +(single )Tj +3.038 0 Td +(node )Tj +2.705 0 Td +(and )Tj +2.149 0 Td +(there )Tj +2.704 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.037 0 Td +(been )Tj +2.649 0 Td +(no )Tj +1.649 0 Td +(performance )Tj +5.982 0 Td +(problems )Tj +4.538 0 Td +(so )Tj +1.482 0 Td +(far)Tj +1.037 0 Td +(, )Tj +0.815 0 Td +(so )Tj +-41.255 -1.44 Td +(clustering )Tj +4.628 0 Td +(is )Tj +1.127 0 Td +(considered )Tj +5.184 0 Td +(optional. )Tj +4.295 0 Td +(It )Tj +1.016 0 Td +(is )Tj +1.127 0 Td +(unlikely )Tj +3.906 0 Td +(that )Tj +2.072 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.959 0 Td +(will )Tj +2.072 0 Td +(ev)Tj +0.988 0 Td +(er )Tj +1.292 0 Td +(need )Tj +2.572 0 Td +(to )Tj +1.294 0 Td +(run )Tj +1.904 0 Td +(in )Tj +1.294 0 Td +(a )Tj +0.959 0 Td +(clustered )Tj +-38.31 -1.44 Td +(en)Tj +1.044 0 Td +(vironment. )Tj +5.218 0 Td +(A )Tj +1.254 0 Td +(single-node )Tj +5.589 0 Td +(setup )Tj +2.866 0 Td +(makes )Tj +3.309 0 Td +(cac)Tj +1.482 0 Td +(hing )Tj +2.477 0 Td +(a )Tj +1.087 0 Td +(lot )Tj +1.699 0 Td +(easier )Tj +3.087 0 Td +(and )Tj +2.199 0 Td +(it )Tj +1.143 0 Td +(does )Tj +2.588 0 Td +(not )Tj +1.977 0 Td +(require )Tj +3.643 0 Td +(an)Tj +1.038 0 Td +(y )Tj +-41.7 -1.44 Td +(distribution or replication str)Tj +12.216 0 Td +(ategies.)Tj +ET + +endstream +endobj +39 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 41 0 R>>endobj +40 0 obj<>endobj +41 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(15)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +(T)Tj +0.511 0 Td +(he Big Picture)Tj +64 0 0 64 443.416 539.8 Tm +(2)Tj +/TT0 1 Tf +10 0 0 10 75 461.4 Tm +(It )Tj +0.937 0 Td +(is )Tj +1.048 0 Td +(impossible )Tj +4.994 0 Td +(to )Tj +1.215 0 Td +(design )Tj +3.16 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.437 0 Td +(tri)Tj +0.871 0 Td +(vial )Tj +1.937 0 Td +(applications )Tj +5.606 0 Td +(on )Tj +1.493 0 Td +(paper)Tj +2.371 0 Td +(. )Tj +0.659 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.881 0 Td +(pro)Tj +1.433 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.437 0 Td +(this )Tj +1.882 0 Td +(assertion. )Tj +4.438 0 Td +(My )Tj +/C2_0 1 Tf +-40.811 -1.44 Td +<005D>Tj +/TT0 1 Tf +(rst idea didn't w)Tj +7.492 0 Td +(ork at all, but it pro)Tj +8.27 0 Td +(vided v)Tj +3.144 0 Td +(aluable information for subsequent iter)Tj +16.662 0 Td +(ations. )Tj +/TT1 1 Tf +12 0 0 12 57 418 Tm +(F)Tj +0.482 0 Td +(irst )Tj +1.593 0 Td +(T)Tj +0.482 0 Td +(ry\227T)Tj +2.4 0 Td +(he Simplest P)Tj +5.79 0 Td +(ossible )Tj +3.15 0 Td +(T)Tj +0.511 0 Td +(hing)Tj +/TT0 1 Tf +10 0 0 10 75 395.6 Tm +(Roller )Tj +2.913 0 Td +(is )Tj +1.024 0 Td +(pac)Tj +1.538 0 Td +(kaged )Tj +2.913 0 Td +(as )Tj +1.246 0 Td +(a )Tj +0.857 0 Td +(J2EE )Tj +2.191 0 Td +(1.4 )Tj +1.71 0 Td +(W)Tj +0.955 0 Td +(AR. )Tj +1.913 0 Td +(It )Tj +0.913 0 Td +(requires )Tj +3.802 0 Td +(only )Tj +2.247 0 Td +(a )Tj +0.857 0 Td +(Servlet )Tj +3.246 0 Td +(2.4-capable )Tj +5.433 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.413 0 Td +(container)Tj +3.983 0 Td +(. )Tj +-41.922 -1.44 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.859 0 Td +(EE )Tj +1.359 0 Td +(6 )Tj +0.915 0 Td +(enables )Tj +3.601 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +1.637 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.026 0 Td +(of )Tj +1.193 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.859 0 Td +(EE )Tj +1.359 0 Td +(6 )Tj +0.915 0 Td +(components, )Tj +5.917 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.915 0 Td +(as )Tj +1.248 0 Td +(Enterprise )Tj +4.582 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(aBeans )Tj +3.415 0 Td +(\(EJB\))Tj +( )Tj +-40.255 -1.44 Td +(and )Tj +1.986 0 Td +(Contexts )Tj +4.098 0 Td +(and )Tj +1.986 0 Td +(Dependenc)Tj +4.978 0 Td +(y )Tj +0.874 0 Td +(Injection )Tj +4.154 0 Td +(\(CDI\) )Tj +2.653 0 Td +(managed )Tj +4.319 0 Td +(beans. )Tj +3.116 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +1.652 0 Td +(pac)Tj +1.538 0 Td +(kaging )Tj +3.208 0 Td +(of )Tj +1.208 0 Td +(EJB )Tj +1.763 0 Td +(and )Tj +1.986 0 Td +(CDI )Tj +-40.477 -1.44 Td +(components is a part of the standard J)Tj +16.162 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 )Tj +2.853 0 Td +(W)Tj +/C2_0 1 Tf +0.963 0 Td +<003D003A0001002C004A0047005D>Tj +/TT0 1 Tf +(le. )Tj +-19.124 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.518 0 Td +(simplest )Tj +3.963 0 Td +(possible )Tj +3.964 0 Td +(approac)Tj +3.483 0 Td +(h )Tj +1.018 0 Td +(to )Tj +1.296 0 Td +(extend )Tj +3.352 0 Td +(Roller )Tj +3.018 0 Td +(with )Tj +2.352 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.962 0 Td +(EE )Tj +1.462 0 Td +(6 )Tj +1.018 0 Td +(components )Tj +5.742 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.408 0 Td +(be )Tj +1.518 0 Td +(to )Tj +-41.366 -1.44 Td +(upgr)Tj +1.933 0 Td +(ade )Tj +1.858 0 Td +(the )Tj +1.636 0 Td +(existing )Tj +/TT2 1 Tf +3.581 0 Td +(roller.war)Tj +/TT0 1 Tf +( )Tj +6.303 0 Td +(to )Tj +1.136 0 Td +(a )Tj +0.802 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.802 0 Td +(EE )Tj +1.302 0 Td +(6-enabled )Tj +4.6 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +1.58 0 Td +(and )Tj +1.914 0 Td +(deplo)Tj +2.434 0 Td +(y )Tj +0.802 0 Td +(the )Tj +1.636 0 Td +(extensions )Tj +4.804 0 Td +(as )Tj +1.191 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(EE )Tj +1.346 0 Td +(6 )Tj +0.902 0 Td +(components. )Tj +5.904 0 Td +(Only )Tj +2.513 0 Td +(a )Tj +0.846 0 Td +(single )Tj +2.847 0 Td +(line )Tj +1.958 0 Td +(in )Tj +1.18 0 Td +(the )Tj +/TT2 1 Tf +1.68 0 Td +(web.xml)Tj +/TT0 1 Tf +( )Tj +4.546 0 Td +(has )Tj +1.791 0 Td +(to )Tj +1.18 0 Td +(be )Tj +1.402 0 Td +(c)Tj +0.482 0 Td +(hanged )Tj +3.514 0 Td +(for )Tj +1.513 0 Td +(this )Tj +1.847 0 Td +(purpose. )Tj +4.07 0 Td +(Here\222)Tj +2.297 0 Td +(s )Tj +-41.811 -1.44 Td +(the declar)Tj +4.267 0 Td +(ation from the original )Tj +/TT2 1 Tf +(web-app)Tj +/TT0 1 Tf +(:)Tj +/TT2 1 Tf +-4.267 -1.79 Td +()Tj +/TT0 1 Tf +1.8 -2.24 Td +(It has to be c)Tj +5.485 0 Td +(hanged to the J)Tj +6.436 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 v)Tj +3.378 0 Td +(ersion:)Tj +/TT2 1 Tf +-18.045 -2.12 Td +()Tj +/TT0 1 Tf +1.8 -2.24 Td +(After )Tj +2.457 0 Td +(making )Tj +3.568 0 Td +(only )Tj +2.291 0 Td +(this )Tj +1.901 0 Td +(c)Tj +0.482 0 Td +(hange, )Tj +/TT2 1 Tf +3.291 0 Td +(roller.war)Tj +/TT0 1 Tf +( )Tj +6.401 0 Td +(becomes )Tj +4.234 0 Td +(a )Tj +/C2_0 1 Tf +0.9 0 Td +<003E004D00440044000A005E>Tj +/TT0 1 Tf +(edged )Tj +5.291 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.9 0 Td +(EE )Tj +1.4 0 Td +(6 )Tj +0.957 0 Td +(application. )Tj +-37.086 -1.44 Td +(X)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.532 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.939 0 Td +(services )Tj +3.828 0 Td +(can )Tj +1.995 0 Td +(be )Tj +1.495 0 Td +(pac)Tj +1.538 0 Td +(kaged )Tj +2.995 0 Td +(and )Tj +2.051 0 Td +(\223deplo)Tj +2.878 0 Td +(y)Tj +0.482 0 Td +(ed\224 )Tj +1.939 0 Td +(as )Tj +1.328 0 Td +(a )Tj +0.939 0 Td +(single )Tj +2.94 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.717 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.773 0 Td +(containing )Tj +4.997 0 Td +(CDI )Tj +2.162 0 Td +(managed )Tj +-38.255 -1.44 Td +(beans, EJB beans, J)Tj +8.047 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a P)Tj +1.289 0 Td +(ersistence )Tj +4.464 0 Td +(API \(JP)Tj +2.836 0 Td +(A\) entities, and other J)Tj +9.493 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 elements. )Tj +-26.221 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.509 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.953 0 Td +(application )Tj +5.29 0 Td +(can )Tj +2.009 0 Td +(be )Tj +1.509 0 Td +(located )Tj +3.621 0 Td +(in )Tj +1.288 0 Td +(either )Tj +2.898 0 Td +(the )Tj +/TT2 1 Tf +1.788 0 Td +(WEB-INF/classes)Tj +/TT0 1 Tf +( )Tj +9.455 0 Td +(or )Tj +/TT2 1 Tf +1.342 0 Td +(WEB-INF/lib)Tj +/TT0 1 Tf +( )Tj +ET + +endstream +endobj +42 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 45 0 R>>endobj +43 0 obj<>endobj +44 0 obj<>endobj +45 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(16)Tj +0 Tc 0 Tw -20.432 57.06 Td +(folder )Tj +2.839 0 Td +(as )Tj +1.227 0 Td +(one )Tj +1.95 0 Td +(or )Tj +1.227 0 Td +(more )Tj +2.56 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.616 0 Td +<005D>Tj +/TT0 1 Tf +(les. )Tj +2.265 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.394 0 Td +(only )Tj +2.228 0 Td +(difference )Tj +4.617 0 Td +(between )Tj +4.006 0 Td +(these )Tj +2.561 0 Td +(is )Tj +1.005 0 Td +(the )Tj +1.672 0 Td +(class-loading )Tj +5.951 0 Td +(order)Tj +2.204 0 Td +(. )Tj +0.542 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.56 Td +(container )Tj +4.361 0 Td +(has )Tj +1.749 0 Td +(to )Tj +1.138 0 Td +(load )Tj +2.194 0 Td +(resour)Tj +2.655 0 Td +(ces )Tj +1.693 0 Td +(from )Tj +/TT1 1 Tf +2.304 0 Td +(WEB-INF/classes)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +9.306 0 Td +<005D>Tj +/TT0 1 Tf +(rst, )Tj +2.138 0 Td +(and )Tj +1.916 0 Td +(then )Tj +2.194 0 Td +(it )Tj +0.86 0 Td +(loads )Tj +2.583 0 Td +(from )Tj +/TT2 1 Tf +2.304 0 Td +(WEB-INF/)Tj +-37.399 -1.56 Td +(lib)Tj +/TT0 1 Tf +(. )Tj +2.468 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.889 0 Td +(is )Tj +1.056 0 Td +(meant )Tj +3.056 0 Td +(to )Tj +1.223 0 Td +(be )Tj +1.445 0 Td +(a )Tj +0.889 0 Td +(plug-in, )Tj +3.724 0 Td +(so )Tj +1.334 0 Td +(it )Tj +0.945 0 Td +(should )Tj +3.28 0 Td +(integr)Tj +2.433 0 Td +(ate )Tj +1.667 0 Td +(with )Tj +2.279 0 Td +(the )Tj +1.723 0 Td +(existing )Tj +3.668 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.779 0 Td +(in )Tj +1.223 0 Td +(the )Tj +-40.866 -1.44 Td +(least )Tj +2.273 0 Td +(intrusi)Tj +2.65 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.828 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.606 0 Td +(Deplo)Tj +2.656 0 Td +(yment )Tj +2.995 0 Td +(into )Tj +/TT1 1 Tf +1.996 0 Td +(WEB-INF/lib)Tj +/TT0 1 Tf +( )Tj +6.929 0 Td +(is )Tj +0.995 0 Td +(the )Tj +1.662 0 Td +(best )Tj +/C2_0 1 Tf +2.051 0 Td +<005D>Tj +/TT0 1 Tf +(t )Tj +1.162 0 Td +(for )Tj +1.495 0 Td +(this )Tj +1.829 0 Td +(requirement. )Tj +5.829 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.828 0 Td +(can )Tj +-40.644 -1.44 Td +(be built externally and just pac)Tj +13.266 0 Td +(kaged with the existing )Tj +/TT1 1 Tf +(roller.war)Tj +/TT0 1 Tf +( application.)Tj +-11.466 -2.24 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.949 0 Td +(EE )Tj +1.449 0 Td +(6, )Tj +1.283 0 Td +(particularly)Tj +4.798 0 Td +(, )Tj +0.727 0 Td +(modernized )Tj +5.617 0 Td +(the )Tj +1.746 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.505 0 Td +(tier)Tj +1.315 0 Td +(. )Tj +0.69 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.561 0 Td +(the )Tj +1.783 0 Td +(ad)Tj +1.032 0 Td +(v)Tj +0.488 0 Td +(ent )Tj +1.783 0 Td +(of )Tj +1.283 0 Td +(Servlet )Tj +3.338 0 Td +(3.0, )Tj +2.117 0 Td +(the )Tj +1.783 0 Td +(XML )Tj +-40.2 -1.44 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.007 0 Td +(descriptor )Tj +4.619 0 Td +(became )Tj +3.729 0 Td +(optional. )Tj +4.084 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.452 0 Td +(can )Tj +1.896 0 Td +(use )Tj +1.785 0 Td +(annotations )Tj +5.343 0 Td +(to )Tj +/C2_0 1 Tf +1.174 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gure )Tj +4.397 0 Td +(servlets )Tj +3.507 0 Td +(and )Tj +/C2_0 1 Tf +1.952 0 Td +<005D>Tj +/TT0 1 Tf +(lters )Tj +-39.866 -1.44 Td +(and )Tj +1.895 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erride )Tj +2.783 0 Td +(them )Tj +2.45 0 Td +(with )Tj +2.173 0 Td +(the )Tj +/TT1 1 Tf +1.617 0 Td +(web.xml)Tj +/TT0 1 Tf +( )Tj +4.484 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +2.95 0 Td +(descriptor )Tj +4.562 0 Td +(on )Tj +1.395 0 Td +(demand. )Tj +3.97 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.395 0 Td +(can )Tj +1.839 0 Td +(also )Tj +2.006 0 Td +(use )Tj +1.728 0 Td +(both )Tj +2.229 0 Td +(at)Tj +( )Tj +-41.422 -1.44 Td +(the )Tj +1.716 0 Td +(same )Tj +2.604 0 Td +(time )Tj +2.271 0 Td +(to )Tj +/C2_0 1 Tf +1.216 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gure )Tj +4.439 0 Td +(different )Tj +3.939 0 Td +(parts )Tj +2.438 0 Td +(of )Tj +1.216 0 Td +(the )Tj +1.716 0 Td +(system. )Tj +3.512 0 Td +(A )Tj +1.049 0 Td +(single )Tj +2.883 0 Td +(annotation, )Tj +/TT1 1 Tf +5.274 0 Td +(@WebServlet)Tj +/TT0 1 Tf +(, )Tj +7.261 0 Td +(is )Tj +/C2_0 1 Tf +-41.533 -1.44 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(cient to deplo)Tj +7.715 0 Td +(y a servlet \(see Listing 1\).)Tj +/TT3 1 Tf +-5.915 -1.79 Td +(@WebServlet\("/Controller"\))Tj +/TT1 1 Tf +-1.8 -1.79 Td +(public class Controller extends HttpServlet {)Tj +0 -1.79 TD +(protected void doGet\(HttpServletRequest request, HttpServletResponse )Tj +0 -0.99 TD +(response\))Tj +0 -1.79 TD +( throws ServletException, IOException {)Tj +T* +( response.setContentType\("text/html;charset=UTF-8"\);)Tj +T* +( PrintWriter out = response.getWriter\(\);)Tj +0 -1.79 TD +( try {)Tj +0 -1.79 TD +( out.println\(""\);)Tj +T* +( out.println\(""\);)Tj +T* +( out.println\("Servlet Controller"\); )Tj +T* +( out.println\(""\);)Tj +T* +( out.println\(""\);)Tj +T* +( out.println\("

Hello

"\);)Tj +T* +( out.println\(""\);)Tj +T* +( out.println\(""\);)Tj +T* +( } finally { )Tj +T* +( out.close\(\);)Tj +T* +( })Tj +T* +( } )Tj +T* +(})Tj +/C2_0 1 Tf +0 -1.2 TD +<00280041004B004C00410046003F0001000E00170001002F003D004A004E0044003D004C00010010000B000D0001001F00470046005D>Tj +/TT0 1 Tf +(gured with )Tj +16.193 0 Td +(Annotations)Tj +-14.393 -3.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.361 0 Td +(servlet )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 124.5562 75.3001 Tm +(Controller)Tj +ET +Q +BT +/TT0 1 Tf +10 0 0 10 184.5659 75.3001 Tm +( )Tj +0.305 0 Td +(is )Tj +0.972 0 Td +(a )Tj +0.805 0 Td +(placeholder )Tj +5.418 0 Td +(for )Tj +1.472 0 Td +(the )Tj +1.639 0 Td +(actual )Tj +2.917 0 Td +(weblog )Tj +3.473 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +1.638 0 Td +(and )Tj +1.917 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.194 0 Td +(introduced)Tj +( )Tj +ET + +endstream +endobj +46 0 obj<>stream +H}lS}J<ǎvgq<'ǡHJ!ڪKXB +@wUUK"4+BP1ĪjX&uAjFihƴZ^ 1cvs N{{νs~+ٵw3TwԦ ßxalڷC6P?~},I}tԍ?`R[6orK8߂|߰ 9PDܴ:_U*6߄gdžͿh EM8sRp'C(O%hm|!j(Zm`շ_zWf'$V`>A=c| Pd)98Lȸ:{ࠒ\ftTu-!gn-X iEQz)Y^.a,|@t2@.9w{>7N?F+;ܧc4;ep5~i9)`#,IO^?N0d)S;j]&!M>CX/ q3ZGAJ!mmZIM,\;@Z ߙ傂p4LA)RDOCZcѼBRar\EJ!+ڀ&o!M_pCp13 JQ2Iů2T^11 ?6xJ=ΰKXO8rh1xh#H ? Z1\!-:ZVېA!k )[m!Q8TNM=@BUSoz>MON뙂5SUsel뜢E#|pS^9s~ٮ:QR/v ը ,eA >-Rz4DR DݾkQ7dvPh@="P |u WSAsl֖%fcluwbY%3[VG3482fli,Ul5Wjk/"ϐlhp5,5l AuBdNE\9/cƠ2KM{sv0F, [[Qz |?6mtzf]/7$@ TUInT5YP]qżg,W05 S-KDŘokBmcUTvLx@%_\8~lOΞ.|xI~ѹbֵ/ؑ^c纱 .;r}DvrBKԚHܵ>kA( +!sɻ/\63,qr-atL/;[jOmNԶU13\1+bG+S ̊HAA$W)pHI|OrHQsRaA RaQ +^_?~'s8QzHY- lD_oml9ZY[<^};N4EABV"Wb8nF)3 +=q2'`|Y3BVh9j: [}-N\3i^$V;k+w;+gUJ,*<VOZ$S73-?/]|H{>79i^O'/0Fd)X%yԅl."#¢Mfb+<`\tT$}mLl+e<,QqޙFfLO(Aj{Yz vnp;pxGےp XA~kilo֩5Ag"]'[WTHk]ǪZ&ёsƀSHQմ={ x փry.b:Ѹ2b#₳j[ozAfXѲYD_(Qhi9qQP8mehrgGR%/YYz%PmM9Fry#ezCEָ6:fs9~aǯMV(,nXqNu c/%e.X2q'D  dC!?x9XLVXT.m2oRO5 {\N$\A%A e"Ҵbj BV Cm-:T\HL!KSgZZSiEl8yI8c8=>vwwwl͍Bef~r*( ip4NUO-,أ5h0R2:lcLɥ2ObDvދuW)R2χwGb_ =z*4 q`K>xcY̳>3Ψ>3ƚkͱGL2V(3 T9{m#Ma 6ԆG1_dyJ/F@gS4P| FcNE% vd2zd/kD̴fV})LLJD"%~ -n޵~H]r'?г+wH^.j=)J[B7o'~_nZp[~rg=1m¯xmE Lboo:D{:r7IxK pJ[|]5WKo)B,sQ(mfWe\ݐOzW+r<Vո'Sɝ]w[]x2eRxx)uRb)eK8Ť9\E.arۤJŚ"2&g̺ybsCnƺ,|;=fc?gqZ4ғ3/̒rAt4ʗJo+hR=c<+QJރH߈ૺ>0{!Vph䮨U.M/ M +3^Uθ2C2`uyȊ qfJ[tf:WD1ocзKOeٞ}6}zcw%7 kL٭]'>ۯ? A +endstream +endobj +47 0 obj<>endobj +48 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 49 0 R>>endobj +49 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(17)Tj +0 Tc 0 Tw -20.432 57.06 Td +(only )Tj +2.264 0 Td +(to )Tj +1.208 0 Td +(test )Tj +1.819 0 Td +(the )Tj +1.708 0 Td +(bundled )Tj +3.932 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.041 0 Td +(in )Tj +1.208 0 Td +(the )Tj +1.708 0 Td +(easiest )Tj +3.208 0 Td +(possible )Tj +3.876 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.578 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.43 0 Td +(StatisticsFilter)Tj +/TT0 1 Tf +( )Tj +9.975 0 Td +(\(see )Tj +-40.533 -1.44 Td +(Listing )Tj +3.153 0 Td +(2\) )Tj +1.208 0 Td +(is )Tj +1.041 0 Td +(a )Tj +0.874 0 Td +(prototype )Tj +4.487 0 Td +(of )Tj +1.208 0 Td +(the )Tj +1.708 0 Td +(inter)Tj +1.933 0 Td +(cepting )Tj +/C2_0 1 Tf +3.542 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.319 0 Td +(pattern, )Tj +3.653 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.93 0 Td +(will )Tj +1.986 0 Td +(extr)Tj +1.599 0 Td +(act )Tj +1.652 0 Td +(the )Tj +1.708 0 Td +(path, )Tj +2.542 0 Td +(extr)Tj +1.599 0 Td +(act )Tj +1.652 0 Td +(the )Tj +-40.866 -1.44 Td +(referer)Tj +2.703 0 Td +(, )Tj +0.567 0 Td +(and )Tj +1.901 0 Td +(forw)Tj +1.927 0 Td +(ard )Tj +1.678 0 Td +(both )Tj +2.235 0 Td +(to )Tj +1.123 0 Td +(the )Tj +1.623 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.789 0 Td +(bac)Tj +1.538 0 Td +(kend. )Tj +2.605 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.345 0 Td +(StatisticFilter)Tj +/TT0 1 Tf +( )Tj +9.29 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.178 0 Td +(also )Tj +/C2_0 1 Tf +2.012 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +4.902 0 Td +(with)Tj +( )Tj +-40.31 -1.44 Td +(the )Tj +/TT1 1 Tf +1.973 0 Td +(@WebFilter)Tj +/TT0 1 Tf +( )Tj +6.64 0 Td +(without )Tj +3.919 0 Td +(c)Tj +0.482 0 Td +(hanging )Tj +4.085 0 Td +(the )Tj +1.973 0 Td +(original )Tj +/TT1 1 Tf +3.918 0 Td +(web.xml)Tj +/TT0 1 Tf +(. )Tj +5.118 0 Td +(Both )Tj +2.64 0 Td +(annotations )Tj +5.642 0 Td +(are )Tj +1.972 0 Td +(designed )Tj +-38.365 -1.44 Td +(follo)Tj +1.934 0 Td +(wing )Tj +2.391 0 Td +(the )Tj +1.613 0 Td +(\223Con)Tj +2.211 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.003 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.112 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation\224 )Tj +2.891 0 Td +(\(CoC\) )Tj +2.725 0 Td +(principle. )Tj +4.318 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +1.335 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.224 0 Td +(name )Tj +2.668 0 Td +(is )Tj +0.946 0 Td +(deri)Tj +1.649 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.335 0 Td +(from )Tj +2.279 0 Td +(the )Tj +-40.866 -1.44 Td +(fully )Tj +/C2_0 1 Tf +2.25 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(ed )Tj +4.14 0 Td +(class )Tj +2.416 0 Td +(name. )Tj +2.953 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.416 0 Td +(attribute )Tj +/TT1 1 Tf +3.917 0 Td +(value)Tj +/TT0 1 Tf +( )Tj +3.361 0 Td +(in )Tj +1.194 0 Td +(the )Tj +/TT1 1 Tf +1.694 0 Td +(WebFilter)Tj +/TT0 1 Tf +( )Tj +5.761 0 Td +(annotation )Tj +/C2_0 1 Tf +4.974 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(es )Tj +4.028 0 Td +(the )Tj +1.694 0 Td +(URL )Tj +-40.311 -1.44 Td +(pattern )Tj +3.305 0 Td +(and )Tj +1.916 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.471 0 Td +(the )Tj +1.638 0 Td +(terse )Tj +2.304 0 Td +(declar)Tj +2.655 0 Td +(ation. )Tj +2.658 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.416 0 Td +(could )Tj +2.75 0 Td +(also )Tj +2.027 0 Td +(specify )Tj +3.305 0 Td +(ev)Tj +0.988 0 Td +(erything )Tj +3.805 0 Td +(explicitly)Tj +3.854 0 Td +(, )Tj +0.582 0 Td +(and )Tj +1.916 0 Td +(then )Tj +2.194 0 Td +(the )Tj +-40.866 -1.44 Td +(annotation w)Tj +5.658 0 Td +(ould look like this: )Tj +/TT1 1 Tf +-3.858 -2.12 Td +(@WebFilter\(filterName="StatisticsFilter",urlPatterns={\223/*\224}\))Tj +/TT0 1 Tf +0 -2.24 TD +(T)Tj +0.511 0 Td +(he wildcard pattern \()Tj +/TT1 1 Tf +(\223/*\224)Tj +/TT0 1 Tf +(\) causes the inter)Tj +18.561 0 Td +(ception of ev)Tj +5.602 0 Td +(ery request.)Tj +/TT2 1 Tf +-24.674 -3.32 Td +(@WebFilter\("/*"\))Tj +/TT1 1 Tf +-1.8 -1.79 Td +(public class StatisticsFilter implements Filter {)Tj +0 -1.79 TD +( @EJB)Tj +T* +( StatisticsService service;)Tj +T* +( public static String REFERER = "referer";)Tj +T* +( @Override)Tj +T* +( public void init\(FilterConfig filterConfig\) {})Tj +T* +( @Override)Tj +T* +( public void doFilter\(ServletRequest request, ServletResponse )Tj +0 -0.99 TD +(response, FilterChain chain\) throws IOException, ServletException {)Tj +0 -1.79 TD +( HttpServletRequest httpServletRequest = \(HttpServletRequest\) )Tj +0 -0.99 TD +(request;)Tj +0 -1.79 TD +( String uri = httpServletRequest.getRequestURI\(\);)Tj +T* +( String referer = httpServletRequest.getHeader\(REFERER\);)Tj +T* +( chain.doFilter\(request, response\);)Tj +T* +( service.store\(uri, referer\);)Tj +T* +( })Tj +T* +( @Override)Tj +T* +( public void destroy\(\) {})Tj +T* +(})Tj +/TT0 1 Tf +0 -1.2 TD +(Listing 2: )Tj +4.132 0 Td +(A )Tj +0.871 0 Td +(T)Tj +0.456 0 Td +(est Servlet )Tj +4.575 0 Td +(W)Tj +0.982 0 Td +(ithout web.xml)Tj +-9.216 -2.24 Td +(In )Tj +1.129 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.795 0 Td +(EE )Tj +1.295 0 Td +(6, )Tj +1.129 0 Td +(servlets, )Tj +/C2_0 1 Tf +3.74 0 Td +<005D>Tj +/TT0 1 Tf +(lters, )Tj +2.907 0 Td +(and )Tj +1.907 0 Td +(other )Tj +2.481 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.351 0 Td +(components )Tj +5.575 0 Td +(can )Tj +1.851 0 Td +(happily )Tj +3.519 0 Td +(co-exist )Tj +3.629 0 Td +(in )Tj +1.129 0 Td +(a )Tj +0.795 0 Td +(single )Tj +2.759 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +-40.922 -1.44 Td +<005D>Tj +/TT0 1 Tf +(le. )Tj +2.033 0 Td +(T)Tj +0.511 0 Td +(hey )Tj +2.051 0 Td +(are )Tj +1.828 0 Td +(not )Tj +1.885 0 Td +(only )Tj +2.385 0 Td +(compatible; )Tj +5.608 0 Td +(they )Tj +2.329 0 Td +(are )Tj +1.828 0 Td +(also )Tj +2.218 0 Td +(well )Tj +2.329 0 Td +(integr)Tj +2.433 0 Td +(ated. )Tj +2.57 0 Td +(An )Tj +1.718 0 Td +(EJB )Tj +1.884 0 Td +(3.1 )Tj +1.885 0 Td +(bean )Tj +2.607 0 Td +(or )Tj +1.384 0 Td +(a )Tj +0.995 0 Td +(CDI )Tj +ET + +endstream +endobj +50 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 51 0 R>>endobj +51 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(18)Tj +0 Tc 0 Tw -20.432 57.06 Td +(managed )Tj +4.414 0 Td +(bean )Tj +2.581 0 Td +(can )Tj +2.025 0 Td +(be )Tj +1.525 0 Td +(directly )Tj +3.692 0 Td +(injected )Tj +3.915 0 Td +(into )Tj +2.137 0 Td +(a )Tj +/C2_0 1 Tf +0.969 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.414 0 Td +(\(or )Tj +1.636 0 Td +(servlet\). )Tj +3.711 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.581 0 Td +(only )Tj +2.359 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.969 0 Td +(to )Tj +1.303 0 Td +(declare )Tj +3.636 0 Td +(the )Tj +-40.866 -1.44 Td +(injection point with )Tj +/TT1 1 Tf +(@EJB)Tj +/TT0 1 Tf +( or )Tj +/TT1 1 Tf +(@Inject)Tj +/TT0 1 Tf +(, respecti)Tj +20.646 0 Td +(v)Tj +0.488 0 Td +(ely)Tj +1.186 0 Td +(. )Tj +-20.52 -2.24 Td +(In )Tj +1.193 0 Td +(our )Tj +1.804 0 Td +(case, )Tj +2.526 0 Td +(an )Tj +1.415 0 Td +(EJB )Tj +1.748 0 Td +(3.1 )Tj +1.749 0 Td +(bean )Tj +2.471 0 Td +(is )Tj +1.026 0 Td +(the )Tj +1.693 0 Td +(simplest )Tj +3.86 0 Td +(possible )Tj +3.861 0 Td +(c)Tj +0.482 0 Td +(hoice. )Tj +3.027 0 Td +(EJB )Tj +1.748 0 Td +(3.1 )Tj +1.749 0 Td +(beans )Tj +2.86 0 Td +(are )Tj +1.692 0 Td +(tr)Tj +0.599 0 Td +(ansactional )Tj +-37.309 -1.44 Td +(b)Tj +0.538 0 Td +(y )Tj +1.112 0 Td +(default\227no )Tj +5.67 0 Td +(further )Tj +/C2_0 1 Tf +3.446 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.78 0 Td +(is )Tj +1.279 0 Td +(needed. )Tj +4.058 0 Td +(Ev)Tj +0.988 0 Td +(en )Tj +1.668 0 Td +(the )Tj +1.946 0 Td +(declar)Tj +2.655 0 Td +(ation )Tj +2.78 0 Td +(of )Tj +1.446 0 Td +(annotations )Tj +5.615 0 Td +(is )Tj +1.279 0 Td +(not )Tj +-40.81 -1.44 Td +(necessary)Tj +4.075 0 Td +(. )Tj +0.89 0 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +1.945 0 Td +(EJB )Tj +2.001 0 Td +(3.1 )Tj +2.002 0 Td +(method )Tj +3.891 0 Td +(comes )Tj +3.39 0 Td +(with )Tj +2.502 0 Td +(a )Tj +1.112 0 Td +(suitable )Tj +3.947 0 Td +(default )Tj +3.558 0 Td +(that )Tj +2.224 0 Td +(corresponds )Tj +5.836 0 Td +(with )Tj +2.502 0 Td +(the )Tj +-40.866 -1.44 Td +(a)Tj +0.518 0 Td +(n)Tj +0.574 0 Td +(n)Tj +0.574 0 Td +(o)Tj +0.574 0 Td +(t)Tj +0.296 0 Td +(a)Tj +0.518 0 Td +(t)Tj +0.296 0 Td +(i)Tj +0.296 0 Td +(o)Tj +0.574 0 Td +(n)Tj +0.574 0 Td +(: )Tj +/TT1 1 Tf +1.065 0 Td +(@)Tj +0.619 0 Td +(T)Tj +0.619 0 Td +(r)Tj +0.619 0 Td +(a)Tj +0.619 0 Td +(n)Tj +0.619 0 Td +(s)Tj +0.619 0 Td +(a)Tj +0.619 0 Td +(c)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(i)Tj +0.619 0 Td +(o)Tj +0.619 0 Td +(n)Tj +0.619 0 Td +(A)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(r)Tj +0.619 0 Td +(i)Tj +0.619 0 Td +(b)Tj +0.619 0 Td +(u)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(e)Tj +0.619 0 Td +(\()Tj +0.619 0 Td +(T)Tj +0.619 0 Td +(r)Tj +0.619 0 Td +(a)Tj +0.619 0 Td +(n)Tj +0.619 0 Td +(s)Tj +0.619 0 Td +(a)Tj +0.619 0 Td +(c)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(i)Tj +0.619 0 Td +(o)Tj +0.619 0 Td +(n)Tj +0.619 0 Td +(A)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(r)Tj +0.619 0 Td +(i)Tj +0.619 0 Td +(b)Tj +0.619 0 Td +(u)Tj +0.619 0 Td +(t)Tj +0.619 0 Td +(e)Tj +0.619 0 Td +(T)Tj +0.619 0 Td +(y)Tj +0.619 0 Td +(p)Tj +0.619 0 Td +(e)Tj +0.619 0 Td +(.)Tj +0.619 0 Td +(R)Tj +0.619 0 Td +(E)Tj +0.619 0 Td +(Q)Tj +0.619 0 Td +(U)Tj +0.619 0 Td +(I)Tj +0.619 0 Td +(R)Tj +0.619 0 Td +(E)Tj +0.619 0 Td +(D)Tj +0.619 0 Td +(\))Tj +/TT0 1 Tf +0.619 0 Td +(. )Tj +1.028 0 Td +(A )Tj +-41.533 -1.44 Td +(single )Tj +2.837 0 Td +(annotation, )Tj +/TT1 1 Tf +5.228 0 Td +(@Stateless)Tj +/TT0 1 Tf +(, )Tj +6.615 0 Td +(makes )Tj +3.058 0 Td +(a )Tj +0.836 0 Td +(lightweight )Tj +5.116 0 Td +(EJB )Tj +1.725 0 Td +(3.1 )Tj +1.726 0 Td +(bean )Tj +2.448 0 Td +(from )Tj +2.336 0 Td +(a )Tj +0.836 0 Td +(typical )Tj +3.226 0 Td +(Plain )Tj +2.504 0 Td +(Old )Tj +2.003 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +-41.7 -1.44 Td +(Object \(POJO\), as sho)Tj +9.491 0 Td +(wn in Listing 3.)Tj +/TT1 1 Tf +-7.691 -2.24 Td +(javax.persistence.EntityManager)Tj +/TT0 1 Tf +( )Tj +19.367 0 Td +(instances )Tj +4.71 0 Td +(can )Tj +2.32 0 Td +(be )Tj +1.82 0 Td +(directly )Tj +3.987 0 Td +(injected )Tj +4.21 0 Td +(with )Tj +2.654 0 Td +(the)Tj +( )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(@PersistenceContext)Tj +/TT0 1 Tf +( )Tj +11.712 0 Td +(annotation. )Tj +5.202 0 Td +(In )Tj +1.144 0 Td +(this )Tj +1.811 0 Td +(case, )Tj +2.477 0 Td +(no )Tj +1.422 0 Td +(additional )Tj +/C2_0 1 Tf +4.646 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.478 0 Td +(is )Tj +0.977 0 Td +(needed. )Tj +3.756 0 Td +(If )Tj +0.866 0 Td +(there )Tj +-40.033 -1.44 Td +(is )Tj +1.371 0 Td +(only )Tj +2.594 0 Td +(one )Tj +2.316 0 Td +(persistence )Tj +5.483 0 Td +(unit )Tj +2.372 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable, )Tj +3.872 0 Td +(it )Tj +1.26 0 Td +(will )Tj +2.316 0 Td +(just )Tj +2.205 0 Td +(be )Tj +1.76 0 Td +(injected. )Tj +4.354 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.927 0 Td +(is )Tj +1.371 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.428 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +-41.367 -1.44 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation again.)Tj +/TT2 1 Tf +-1.912 -4.03 Td +(@Stateless)Tj +/TT1 1 Tf +0 -1.79 TD +(public class StatisticsService {)Tj +T* +( @PersistenceContext)Tj +T* +( EntityManager em;)Tj +T* +( public void store\(String uri, String referer\) {)Tj +0 -1.79 TD +( em.persist\(new Statistic\(uri, referer\)\);)Tj +0 -1.79 TD +( })Tj +T* +(})Tj +/TT0 1 Tf +-1.8 -1.2 Td +(Listing 3: StatisticsService: )Tj +11.43 0 Td +(T)Tj +0.511 0 Td +(he Simplest P)Tj +5.735 0 Td +(ossible X-r)Tj +4.489 0 Td +(a)Tj +0.47 0 Td +(y Bac)Tj +2.371 0 Td +(kend)Tj +-23.206 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.379 0 Td +(EntityManager)Tj +/TT0 1 Tf +( )Tj +8.124 0 Td +(is )Tj +0.99 0 Td +(a )Tj +0.823 0 Td +(perfect )Tj +3.268 0 Td +(realization )Tj +4.88 0 Td +(of )Tj +1.157 0 Td +(the )Tj +1.657 0 Td +(Data )Tj +2.342 0 Td +(Access )Tj +3.268 0 Td +(Object )Tj +3.268 0 Td +(\(D)Tj +1.001 0 Td +(A)Tj +0.637 0 Td +(O\) )Tj +1.434 0 Td +(pattern. )Tj +3.565 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +-41.088 -1.44 Td +(the )Tj +1.749 0 Td +(injected )Tj +3.861 0 Td +(instance )Tj +3.972 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.527 0 Td +(can )Tj +1.971 0 Td +(easily )Tj +2.86 0 Td +(create, )Tj +3.304 0 Td +(read, )Tj +2.582 0 Td +(update, )Tj +3.639 0 Td +(and )Tj +2.027 0 Td +(delete )Tj +3.027 0 Td +(\(CRUD\) )Tj +3.805 0 Td +(all )Tj +1.471 0 Td +(persistent )Tj +4.472 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +-41.533 -1.44 Td +(entities. )Tj +3.641 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.195 0 Td +(the )Tj +1.64 0 Td +(v)Tj +0.476 0 Td +(ast )Tj +1.473 0 Td +(majority )Tj +3.862 0 Td +(of )Tj +1.14 0 Td +(all )Tj +1.362 0 Td +(use )Tj +1.751 0 Td +(cases, )Tj +2.862 0 Td +(the )Tj +1.64 0 Td +(direct )Tj +2.751 0 Td +(use )Tj +1.751 0 Td +(of )Tj +/TT1 1 Tf +1.14 0 Td +(EntityManager)Tj +/TT0 1 Tf +( )Tj +8.108 0 Td +(is )Tj +0.973 0 Td +(good )Tj +2.474 0 Td +(enough. )Tj +-38.698 -1.44 Td +(W)Tj +0.963 0 Td +(e\222ll )Tj +1.778 0 Td +(store )Tj +2.5 0 Td +(the )Tj +/TT1 1 Tf +1.778 0 Td +(Statistic)Tj +/TT0 1 Tf +( )Tj +5.845 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.111 0 Td +(entity )Tj +2.834 0 Td +(with )Tj +2.334 0 Td +(the )Tj +/TT1 1 Tf +1.778 0 Td +(uri)Tj +/TT0 1 Tf +( )Tj +2.244 0 Td +(and )Tj +/TT1 1 Tf +2.056 0 Td +(referer)Tj +/TT0 1 Tf +( )Tj +4.644 0 Td +(attributes )Tj +4.39 0 Td +(\(see )Tj +2.111 0 Td +(Listing )Tj +3.223 0 Td +(4\). )Tj +1.556 0 Td +(I)Tj +( )Tj +-41.922 -1.44 Td +(introduced )Tj +4.998 0 Td +(the )Tj +/TT1 1 Tf +1.663 0 Td +(id)Tj +/TT0 1 Tf +(, )Tj +1.807 0 Td +(a )Tj +0.829 0 Td +(tec)Tj +1.26 0 Td +(hnical, )Tj +3.275 0 Td +(auto-gener)Tj +4.6 0 Td +(ated )Tj +2.163 0 Td +(primary )Tj +3.662 0 Td +(key)Tj +1.408 0 Td +(, )Tj +0.607 0 Td +(so )Tj +1.274 0 Td +(it )Tj +0.885 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.607 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.829 0 Td +(to )Tj +1.163 0 Td +(be )Tj +1.385 0 Td +(produced )Tj +4.442 0 Td +(b)Tj +0.538 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(the application.)Tj +/TT1 1 Tf +1.8 -4.03 Td +(@Entity)Tj +T* +(public class Statistic {)Tj +T* +( @Id)Tj +T* +( @GeneratedValue)Tj +ET + +endstream +endobj +52 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 53 0 R>>endobj +53 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(19)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( private long id;)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( private String uri;)Tj +0 -1.79 TD +( private String referer;)Tj +T* +( public Statistic\(\) {/*For JPA*/})Tj +T* +( public Statistic\(String uri, String referer\) {)Tj +T* +( this.uri = uri;)Tj +T* +( this.referer = referer;)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +-1.8 -1.2 Td +(Listing 4: Statistic JP)Tj +8.505 0 Td +(A Entity)Tj +-6.705 -3.44 Td +(Getters )Tj +3.356 0 Td +(and )Tj +1.912 0 Td +(setters )Tj +2.967 0 Td +(are )Tj +1.633 0 Td +(optional )Tj +3.858 0 Td +(and )Tj +1.912 0 Td +(not )Tj +1.69 0 Td +(necessary )Tj +4.467 0 Td +(in )Tj +1.134 0 Td +(our )Tj +1.745 0 Td +(case. )Tj +2.393 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.356 0 Td +(introduction )Tj +5.581 0 Td +(of )Tj +1.134 0 Td +(the )Tj +1.634 0 Td +(custom )Tj +-39.088 -1.44 Td +(constructor )Tj +/TT1 1 Tf +5.181 0 Td +(public )Tj +4.269 0 Td +(Statistic\(String )Tj +10.27 0 Td +(uri, )Tj +3.068 0 Td +(String )Tj +4.269 0 Td +(referer\))Tj +/TT0 1 Tf +( )Tj +5.147 0 Td +(\223destro)Tj +3.044 0 Td +(y)Tj +0.482 0 Td +(ed\224 )Tj +1.846 0 Td +(the )Tj +1.68 0 Td +(default )Tj +-39.254 -1.44 Td +(constructor)Tj +4.761 0 Td +(. Because this constructor is necessary in JP)Tj +18.563 0 Td +(A, I had to re-introduce it. )Tj +-21.524 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.685 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +/C2_0 1 Tf +1.296 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +6.076 0 Td +(is )Tj +1.296 0 Td +(also )Tj +2.352 0 Td +(a )Tj +1.129 0 Td +(perfect )Tj +3.574 0 Td +(example )Tj +4.296 0 Td +(of )Tj +1.463 0 Td +(the )Tj +1.963 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.353 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.462 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +-40.032 -1.44 Td +(principle. )Tj +4.466 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.483 0 Td +(name )Tj +2.816 0 Td +(of )Tj +1.261 0 Td +(the )Tj +1.761 0 Td +(database )Tj +4.206 0 Td +(table )Tj +2.539 0 Td +(is )Tj +1.094 0 Td +(deri)Tj +1.649 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.483 0 Td +(from )Tj +2.427 0 Td +(the )Tj +1.761 0 Td +(simple )Tj +3.261 0 Td +(name )Tj +2.816 0 Td +(of )Tj +1.261 0 Td +(the )Tj +1.761 0 Td +(entity )Tj +2.817 0 Td +(class.)Tj +( )Tj +-39.866 -1.44 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +1.635 0 Td +(attribute )Tj +3.859 0 Td +(is )Tj +0.969 0 Td +(persistent )Tj +4.359 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.802 0 Td +(default )Tj +3.248 0 Td +(\(see )Tj +1.969 0 Td +(Listing )Tj +3.081 0 Td +(5\). )Tj +1.34 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.358 0 Td +(names )Tj +3.08 0 Td +(and )Tj +1.914 0 Td +(types )Tj +2.525 0 Td +(of )Tj +1.136 0 Td +(the )Tj +1.636 0 Td +(attributes )Tj +4.248 0 Td +(specify)Tj +( )Tj +-39.199 -1.44 Td +(the )Tj +1.722 0 Td +(names )Tj +3.166 0 Td +(and )Tj +2 0 Td +(types )Tj +2.611 0 Td +(of )Tj +1.222 0 Td +(the )Tj +1.722 0 Td +(database )Tj +4.167 0 Td +(columns. )Tj +4.334 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.055 0 Td +(requires )Tj +3.833 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.5 0 Td +(to )Tj +1.222 0 Td +(use )Tj +1.833 0 Td +(a )Tj +0.888 0 Td +(minimal )Tj +/C2_0 1 Tf +3.944 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +/C2_0 1 Tf +-40.032 -1.44 Td +<005D>Tj +/TT0 1 Tf +(le: )Tj +/TT1 1 Tf +2.038 0 Td +(persistence.xml)Tj +/TT0 1 Tf +(. )Tj +9.632 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.482 0 Td +(persistence.xml)Tj +/TT0 1 Tf +( )Tj +9.428 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.093 0 Td +(descriptor )Tj +4.705 0 Td +(is )Tj +1.093 0 Td +(required, )Tj +4.316 0 Td +(but )Tj +1.816 0 Td +(it )Tj +0.982 0 Td +(is )Tj +-41.533 -1.44 Td +(short )Tj +2.549 0 Td +(and )Tj +2.049 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.715 0 Td +(usually )Tj +3.494 0 Td +(gro)Tj +1.377 0 Td +(w)Tj +0.704 0 Td +(. )Tj +0.715 0 Td +(It )Tj +0.993 0 Td +(is )Tj +1.104 0 Td +(the )Tj +/C2_0 1 Tf +1.771 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.993 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.104 0 Td +(descriptor )Tj +4.716 0 Td +(for )Tj +1.604 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.937 0 Td +(\223proof )Tj +3.16 0 Td +(of )Tj +1.271 0 Td +(concept\224 )Tj +-38.31 -1.44 Td +(application.)Tj +/TT1 1 Tf +1.8 -1.79 Td +()Tj +T* +()Tj +1.8 -1.79 Td +()Tj +0 -1.79 TD +( org.eclipse.persistence.jpa.PersistenceProvider)Tj +1.8 -1.79 Td +( jdbc/sample)Tj +T* +( )Tj +T* +( )Tj +1.8 -1.79 Td +( )Tj +T* +( )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 75 78.4001 Tm +()Tj +ET +Q + +endstream +endobj +54 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 55 0 R>>endobj +55 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(20)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 632 Tm +(Listing 5: Minimal persistence.xml with a Single P)Tj +21.352 0 Td +(ersistence Unit)Tj +ET +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 609.6 Tm +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.637 0 Td +(3+ )Tj +1.576 0 Td +(comes )Tj +3.192 0 Td +(with )Tj +2.304 0 Td +(a )Tj +0.914 0 Td +(preinstalled )Tj +5.416 0 Td +(EclipseLink )Tj +5.249 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.eclipse.org/eclipselink/)Tj +(\) )Tj +10.807 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +-41.533 -1.44 Td +(pro)Tj +1.433 0 Td +(vider)Tj +2.093 0 Td +(. )Tj +0.808 0 Td +(Unfortunately)Tj +5.855 0 Td +(, )Tj +0.808 0 Td +(the )Tj +1.864 0 Td +(Roller )Tj +3.086 0 Td +(application )Tj +5.366 0 Td +(is )Tj +1.197 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +1.03 0 Td +(bundled )Tj +4.088 0 Td +(with )Tj +2.42 0 Td +(the )Tj +1.827 0 Td +(Apac)Tj +2.205 0 Td +(he )Tj +1.586 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +-41.533 -1.44 Td +(implementation. )Tj +7.744 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.964 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.964 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.575 0 Td +(intended )Tj +4.466 0 Td +(to )Tj +1.52 0 Td +(use )Tj +2.131 0 Td +(the )Tj +2.02 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.909 0 Td +(default )Tj +3.632 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.353 0 Td +(pro)Tj +1.433 0 Td +(vider)Tj +2.093 0 Td +(,)Tj +( )Tj +-41.922 -1.44 Td +(EclipseLink. )Tj +1.8 -2.24 Td +(Because )Tj +4.212 0 Td +(of )Tj +1.49 0 Td +(the )Tj +1.99 0 Td +(existence )Tj +4.657 0 Td +(of )Tj +1.49 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +1.323 0 Td +(in )Tj +1.49 0 Td +(the )Tj +1.953 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +1.934 0 Td +<005D>Tj +/TT0 1 Tf +(le, )Tj +2.268 0 Td +(I )Tj +/C2_0 1 Tf +0.934 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.491 0 Td +(the )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 418.9901 543.9999 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 529.6 Tm +(o)Tj +0.644 0 Td +(r)Tj +0.643 0 Td +(g)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(e)Tj +0.643 0 Td +(c)Tj +0.644 0 Td +(l)Tj +0.644 0 Td +(i)Tj +0.643 0 Td +(p)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(e)Tj +0.643 0 Td +(.)Tj +0.644 0 Td +(p)Tj +0.644 0 Td +(e)Tj +0.643 0 Td +(r)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(i)Tj +0.643 0 Td +(s)Tj +0.644 0 Td +(t)Tj +0.644 0 Td +(e)Tj +0.643 0 Td +(n)Tj +0.644 0 Td +(c)Tj +0.643 0 Td +(e)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(j)Tj +0.643 0 Td +(p)Tj +0.644 0 Td +(a)Tj +0.643 0 Td +(.)Tj +0.644 0 Td +(P)Tj +0.644 0 Td +(e)Tj +0.643 0 Td +(r)Tj +0.644 0 Td +(s)Tj +0.643 0 Td +(i)Tj +0.644 0 Td +(s)Tj +0.643 0 Td +(t)Tj +0.644 0 Td +(e)Tj +0.644 0 Td +(n)Tj +0.643 0 Td +(c)Tj +0.644 0 Td +(e)Tj +0.643 0 Td +(P)Tj +0.644 0 Td +(r)Tj +0.644 0 Td +(o)Tj +0.643 0 Td +(v)Tj +0.644 0 Td +(i)Tj +0.643 0 Td +(d)Tj +0.644 0 Td +(e)Tj +0.643 0 Td +(r )Tj +1.722 0 Td +(<)Tj +0.644 0 Td +(/)Tj +0.644 0 Td +(p)Tj +0.643 0 Td +(r)Tj +0.644 0 Td +(o)Tj +0.643 0 Td +(v)Tj +0.644 0 Td +(i)Tj +0.644 0 Td +(d)Tj +0.643 0 Td +(e)Tj +0.644 0 Td +(r)Tj +0.643 0 Td +(>)Tj +/TT0 1 Tf +( )Tj +1.4 0 Td +(t)Tj +0.321 0 Td +(a)Tj +0.543 0 Td +(g )Tj +1.3 0 Td +(t)Tj +0.321 0 Td +(o )Tj +-41.644 -1.44 Td +(minimize )Tj +4.361 0 Td +(interferences )Tj +5.806 0 Td +(with )Tj +2.195 0 Td +(OpenJP)Tj +3.224 0 Td +(A. )Tj +1.176 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.528 0 Td +(is )Tj +0.972 0 Td +(not )Tj +1.695 0 Td +(necessary )Tj +4.472 0 Td +(in )Tj +1.139 0 Td +(cleanly )Tj +3.417 0 Td +(pac)Tj +1.538 0 Td +(kaged )Tj +2.861 0 Td +(applications. )Tj +5.734 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(lac)Tj +1.26 0 Td +(k )Tj +0.813 0 Td +(of )Tj +1.147 0 Td +(the )Tj +/TT1 1 Tf +1.647 0 Td +()Tj +/TT0 1 Tf +( )Tj +6.314 0 Td +(tag )Tj +1.591 0 Td +(causes )Tj +3.147 0 Td +(the )Tj +1.647 0 Td +(application )Tj +5.149 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.146 0 Td +(to )Tj +1.147 0 Td +(c)Tj +0.482 0 Td +(hoose )Tj +2.87 0 Td +(its )Tj +1.258 0 Td +(preinstalled )Tj +5.315 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +0.98 0 Td +(pro)Tj +1.433 0 Td +(vider)Tj +2.093 0 Td +(. )Tj +-41.922 -1.44 Td +(T)Tj +0.511 0 Td +(he fallbac)Tj +4.206 0 Td +(k to the default pro)Tj +8.159 0 Td +(vider is another con)Tj +8.547 0 Td +(v)Tj +0.488 0 Td +(enient con)Tj +4.546 0 Td +(v)Tj +0.488 0 Td +(ention. )Tj +-25.145 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.684 0 Td +(property )Tj +/TT1 1 Tf +4.24 0 Td +(eclipselink.ddl-generation )Tj +/TT0 1 Tf +16.553 0 Td +(controls )Tj +4.074 0 Td +(the )Tj +1.962 0 Td +(gener)Tj +2.377 0 Td +(ation )Tj +2.796 0 Td +(of )Tj +1.462 0 Td +(tables )Tj +3.129 0 Td +(and )Tj +-40.588 -1.44 Td +(columns )Tj +4.249 0 Td +(at )Tj +1.359 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.248 0 Td +(time. )Tj +2.674 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.637 0 Td +(content )Tj +3.805 0 Td +(of )Tj +1.415 0 Td +(the )Tj +/TT1 1 Tf +1.915 0 Td +(jta-database-source)Tj +/TT0 1 Tf +( )Tj +11.983 0 Td +(tag )Tj +1.859 0 Td +(points )Tj +3.194 0 Td +(to )Tj +1.415 0 Td +(a )Tj +-41.7 -1.44 Td +(properly )Tj +/C2_0 1 Tf +3.969 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +4.97 0 Td +(data )Tj +2.191 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.357 0 Td +(at )Tj +1.135 0 Td +(the )Tj +1.691 0 Td +(application )Tj +5.193 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.635 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.246 0 Td +(our )Tj +1.802 0 Td +(\223proof )Tj +3.08 0 Td +(of )Tj +1.191 0 Td +(concept\224 )Tj +4.247 0 Td +(purposes, )Tj +4.47 0 Td +(I )Tj +-41.922 -1.44 Td +(c)Tj +0.482 0 Td +(hose )Tj +2.462 0 Td +(the )Tj +/C2_0 1 Tf +1.795 0 Td +<0048004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +/TT1 1 Tf +6.463 0 Td +(jdbc/sample)Tj +/TT0 1 Tf +( )Tj +7.062 0 Td +(database. )Tj +4.518 0 Td +(It )Tj +1.017 0 Td +(is )Tj +1.128 0 Td +(automatically )Tj +6.296 0 Td +(created )Tj +3.628 0 Td +(during )Tj +3.24 0 Td +(NetBeans )Tj +-38.088 -1.44 Td +(\(J)Tj +0.544 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE v)Tj +2.544 0 Td +(ersion\) installation. )Tj +/TT1 1 Tf +-2.234 -2.24 Td +(p)Tj +(e)Tj +(r)Tj +(s)Tj +(i)Tj +(s)Tj +(t)Tj +(e)Tj +(n)Tj +(c)Tj +(e)Tj +(.)Tj +(x)Tj +(m)Tj +(l)Tj +/TT0 1 Tf +( )Tj +9.783 0 Td +(c)Tj +(o)Tj +(n)Tj +(t)Tj +(a)Tj +(i)Tj +(n)Tj +(s )Tj +4.393 0 Td +(o)Tj +(n)Tj +(l)Tj +(y )Tj +2.669 0 Td +(a )Tj +1.278 0 Td +(s)Tj +(i)Tj +(n)Tj +(g)Tj +(l)Tj +(e )Tj +3.28 0 Td +(p)Tj +(e)Tj +(r)Tj +(s)Tj +(i)Tj +(s)Tj +(t)Tj +(e)Tj +(n)Tj +(c)Tj +(e )Tj +5.56 0 Td +(u)Tj +(n)Tj +(i)Tj +(t )Tj +2.447 0 Td +(r)Tj +(e)Tj +(p)Tj +(r)Tj +(e)Tj +(s)Tj +(e)Tj +(n)Tj +(t)Tj +(e)Tj +(d )Tj +5.782 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.278 0 Td +(t)Tj +(h)Tj +(e )Tj +2.113 0 Td +(t)Tj +(a)Tj +(g )Tj +/TT1 1 Tf +-40.921 -1.44 Td +()Tj +/TT0 1 Tf +(. )Tj +10.903 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.627 0 Td +(could )Tj +/C2_0 1 Tf +2.961 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(ne )Tj +3.183 0 Td +(multiple )Tj +4.072 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.182 0 Td +(units )Tj +2.572 0 Td +(with )Tj +2.405 0 Td +(v)Tj +0.476 0 Td +(arious )Tj +3.127 0 Td +(cac)Tj +1.482 0 Td +(hing )Tj +2.405 0 Td +(or )Tj +-41.311 -1.44 Td +(v)Tj +0.476 0 Td +(alidation )Tj +4.238 0 Td +(settings )Tj +3.626 0 Td +(or )Tj +1.347 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.514 0 Td +(with )Tj +2.348 0 Td +(data )Tj +2.292 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.458 0 Td +(settings. )Tj +3.904 0 Td +(If )Tj +1.014 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +/C2_0 1 Tf +1.57 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(ne )Tj +3.126 0 Td +(additional )Tj +/TT1 1 Tf +4.794 0 Td +(persistence-)Tj +-34.999 -1.44 Td +(unit)Tj +/TT0 1 Tf +( )Tj +2.779 0 Td +(sections )Tj +3.824 0 Td +(in )Tj +/TT1 1 Tf +1.212 0 Td +(persistence.xml)Tj +/TT0 1 Tf +(, )Tj +9.658 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.49 0 Td +(also )Tj +2.101 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.878 0 Td +(to )Tj +/C2_0 1 Tf +1.212 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gure )Tj +4.435 0 Td +(the )Tj +1.712 0 Td +(injection )Tj +4.158 0 Td +(and )Tj +1.99 0 Td +(c)Tj +0.482 0 Td +(hoose )Tj +2.935 0 Td +(the )Tj +-40.866 -1.44 Td +(n)Tj +0.568 0 Td +(a)Tj +0.512 0 Td +(m)Tj +0.845 0 Td +(e )Tj +1.284 0 Td +(o)Tj +0.568 0 Td +(f )Tj +1.062 0 Td +(t)Tj +0.29 0 Td +(h)Tj +0.568 0 Td +(e )Tj +1.284 0 Td +(p)Tj +0.568 0 Td +(e)Tj +0.512 0 Td +(r)Tj +0.345 0 Td +(s)Tj +0.401 0 Td +(i)Tj +0.29 0 Td +(s)Tj +0.401 0 Td +(t)Tj +0.29 0 Td +(e)Tj +0.512 0 Td +(n)Tj +0.568 0 Td +(c)Tj +0.512 0 Td +(e )Tj +1.284 0 Td +(u)Tj +0.568 0 Td +(n)Tj +0.568 0 Td +(i)Tj +0.29 0 Td +(t )Tj +1.062 0 Td +(i)Tj +0.29 0 Td +(n )Tj +1.34 0 Td +(t)Tj +0.29 0 Td +(h)Tj +0.568 0 Td +(e )Tj +/TT1 1 Tf +1.284 0 Td +(@)Tj +0.613 0 Td +(P)Tj +0.613 0 Td +(e)Tj +0.613 0 Td +(r)Tj +0.613 0 Td +(s)Tj +0.613 0 Td +(i)Tj +0.613 0 Td +(s)Tj +0.613 0 Td +(t)Tj +0.613 0 Td +(e)Tj +0.613 0 Td +(n)Tj +0.613 0 Td +(c)Tj +0.613 0 Td +(e)Tj +0.613 0 Td +(C)Tj +0.613 0 Td +(o)Tj +0.613 0 Td +(n)Tj +0.613 0 Td +(t)Tj +0.613 0 Td +(e)Tj +0.613 0 Td +(x)Tj +0.613 0 Td +(t)Tj +0.613 0 Td +(\()Tj +0.613 0 Td +(u)Tj +0.613 0 Td +(n)Tj +0.613 0 Td +(i)Tj +0.613 0 Td +(t)Tj +0.613 0 Td +(N)Tj +0.613 0 Td +(a)Tj +0.613 0 Td +(m)Tj +0.613 0 Td +(e)Tj +0.613 0 Td +(=)Tj +0.613 0 Td +(\223)Tj +0.613 0 Td +([)Tj +0.613 0 Td +(n)Tj +0.613 0 Td +(a)Tj +0.613 0 Td +(m)Tj +0.613 0 Td +(e)Tj +0.613 0 Td +(])Tj +0.613 0 Td +(\224)Tj +0.613 0 Td +(\))Tj +/TT0 1 Tf +( )Tj +-41.6 -1.44 Td +(annotation. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.416 0 Td +(injection )Tj +4.14 0 Td +(of )Tj +1.194 0 Td +(the )Tj +/TT1 1 Tf +1.694 0 Td +(EntityManager)Tj +/TT0 1 Tf +( )Tj +8.162 0 Td +(in )Tj +1.194 0 Td +(Listing )Tj +3.139 0 Td +(3 )Tj +0.916 0 Td +(is )Tj +1.027 0 Td +(lac)Tj +1.26 0 Td +(king )Tj +2.194 0 Td +(an )Tj +1.416 0 Td +(explicit )Tj +/TT1 1 Tf +3.528 0 Td +(unitName)Tj +/TT0 1 Tf +( )Tj +5.161 0 Td +(element )Tj +-38.755 -1.44 Td +(in )Tj +1.294 0 Td +(the )Tj +/TT1 1 Tf +1.794 0 Td +(@PersistenceContext)Tj +/TT0 1 Tf +( )Tj +11.862 0 Td +(annotation )Tj +5.074 0 Td +(and )Tj +2.072 0 Td +(will )Tj +2.072 0 Td +(not )Tj +1.85 0 Td +(w)Tj +0.766 0 Td +(ork )Tj +1.849 0 Td +(with )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 366.8192 275.2 Tm +(multiple )Tj +/TT1 1 Tf +4.017 0 Td +(persistence-)Tj +-34.999 -1.44 Td +(unit)Tj +/TT0 1 Tf +( )Tj +2.701 0 Td +(instances. )Tj +4.488 0 Td +(An )Tj +1.524 0 Td +(error )Tj +2.356 0 Td +(will )Tj +1.913 0 Td +(break )Tj +2.69 0 Td +(the )Tj +1.635 0 Td +(deplo)Tj +2.434 0 Td +(yment. )Tj +3.245 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.025 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.134 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +2.469 0 Td +(w)Tj +0.766 0 Td +(orks )Tj +2.079 0 Td +(only )Tj +2.191 0 Td +(if )Tj +-41.644 -1.44 Td +(there is a single possible c)Tj +11.209 0 Td +(hoice.)Tj +-9.409 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.695 0 Td +(method )Tj +/TT1 1 Tf +3.918 0 Td +(StatisticsService#store)Tj +/TT0 1 Tf +( )Tj +14.441 0 Td +(is )Tj +1.306 0 Td +(the )Tj +1.973 0 Td +(essential )Tj +4.307 0 Td +(use )Tj +2.084 0 Td +(case )Tj +2.528 0 Td +(for )Tj +1.806 0 Td +(our )Tj +2.084 0 Td +(proof )Tj +2.918 0 Td +(of )Tj +-41.366 -1.44 Td +(concept:)Tj +/TT1 1 Tf +1.8 -1.79 Td +( public void store\(String uri, String referer\) {)Tj +0 -1.79 TD +( em.persist\(new Statistic\(uri, referer\)\);)Tj +T* +( })Tj +0 -2.24 TD +(StatisticsService)Tj +/TT0 1 Tf +( )Tj +10.86 0 Td +(is )Tj +1.325 0 Td +(an )Tj +1.714 0 Td +(EJB )Tj +2.047 0 Td +(3.1 )Tj +2.048 0 Td +(bean, )Tj +3.048 0 Td +(so )Tj +1.603 0 Td +(the )Tj +1.992 0 Td +(method )Tj +3.937 0 Td +(store )Tj +2.714 0 Td +(is )Tj +1.325 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.77 0 Td +(inside )Tj +3.215 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.433 0 Td +(context. )Tj +3.692 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.376 0 Td +(newly )Tj +2.932 0 Td +(created )Tj +/TT1 1 Tf +3.487 0 Td +(Statistic)Tj +/TT0 1 Tf +( )Tj +5.721 0 Td +(entity )Tj +2.71 0 Td +(is )Tj +0.987 0 Td +(passed )Tj +3.21 0 Td +(to )Tj +1.154 0 Td +(the )Tj +/TT1 1 Tf +1.654 0 Td +(EntityManager)Tj +/TT0 1 Tf +( )Tj +8.121 0 Td +(and)Tj +( )Tj +-40.588 -1.44 Td +(becomes )Tj +4.145 0 Td +(\223managed.)Tj +4.612 0 Td +(\224 )Tj +0.681 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.367 0 Td +(EntityManager)Tj +/TT0 1 Tf +( )Tj +8.112 0 Td +(no)Tj +1.1 0 Td +(w )Tj +1.089 0 Td +(holds )Tj +2.646 0 Td +(a )Tj +0.811 0 Td +(reference )Tj +4.311 0 Td +(to )Tj +1.145 0 Td +(the )Tj +/TT1 1 Tf +1.645 0 Td +(Statistic)Tj +/TT0 1 Tf +( )Tj +5.712 0 Td +(entity )Tj +2.701 0 Td +(and )Tj +-40.588 -1.44 Td +(tr)Tj +0.599 0 Td +(ac)Tj +0.982 0 Td +(ks )Tj +1.248 0 Td +(its )Tj +1.304 0 Td +(c)Tj +0.482 0 Td +(hanges. )Tj +3.638 0 Td +(Because )Tj +3.915 0 Td +(it )Tj +0.915 0 Td +(is )Tj +1.026 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.415 0 Td +(as )Tj +/TT1 1 Tf +1.248 0 Td +(transaction-type=\223JTA\224)Tj +/TT0 1 Tf +( )Tj +13.561 0 Td +(\(see )Tj +2.026 0 Td +(Listing )Tj +3.138 0 Td +(5\), )Tj +1.471 0 Td +(ev)Tj +0.988 0 Td +(ery)Tj +( )Tj +-40.867 -1.44 Td +(commit )Tj +/C2_0 1 Tf +3.583 0 Td +<005E>Tj +/TT0 1 Tf +(ushes )Tj +3.251 0 Td +(all )Tj +1.36 0 Td +(managed )Tj +4.25 0 Td +(and )Tj +1.916 0 Td +(\223dirty\224 )Tj +3.138 0 Td +(entities )Tj +3.362 0 Td +(to )Tj +1.139 0 Td +(the )Tj +1.639 0 Td +(database. )Tj +4.287 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.36 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.418 0 Td +(is )Tj +0.971 0 Td +(committed )Tj +4.916 0 Td +(just )Tj +ET + +endstream +endobj +56 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 58 0 R>>endobj +57 0 obj<>endobj +58 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(21)Tj +0 Tc 0 Tw -20.432 57.06 Td +(after the execution of the method )Tj +/TT1 1 Tf +(store)Tj +/TT0 1 Tf +(.)Tj +1.8 -2.24 Td +(Deplo)Tj +2.656 0 Td +(yment )Tj +3.029 0 Td +(of )Tj +1.196 0 Td +(the )Tj +1.696 0 Td +(blog )Tj +2.252 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +1.695 0 Td +(as )Tj +1.251 0 Td +(a )Tj +0.862 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.862 0 Td +(EE )Tj +1.362 0 Td +(6 )Tj +0.881 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +/C2_0 1 Tf +1.418 0 Td +<002C004A0047005D>Tj +/TT0 1 Tf +(le )Tj +3.104 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +1.64 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.251 0 Td +(successful. )Tj +4.975 0 Td +(Ho)Tj +1.322 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +-41.922 -1.44 Td +(the )Tj +/C2_0 1 Tf +1.625 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.847 0 Td +(smoke )Tj +3.069 0 Td +(tests )Tj +2.125 0 Td +(were )Tj +2.402 0 Td +(not. )Tj +1.959 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +0.958 0 Td +(interfered )Tj +4.403 0 Td +(with )Tj +2.181 0 Td +(the )Tj +1.625 0 Td +(built-in )Tj +3.404 0 Td +(EclipseLink. )Tj +5.404 0 Td +(It )Tj +0.847 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.18 0 Td +(not )Tj +1.681 0 Td +(possible )Tj +-38.698 -1.44 Td +(to )Tj +1.247 0 Td +(use )Tj +1.858 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +1.08 0 Td +(or )Tj +1.302 0 Td +(EclipseLink )Tj +5.248 0 Td +(in )Tj +1.247 0 Td +(a )Tj +0.913 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.913 0 Td +(EE )Tj +1.413 0 Td +(6-compliant )Tj +5.637 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.913 0 Td +(without )Tj +3.693 0 Td +(a)Tj +0.482 0 Td +(wkw)Tj +2.038 0 Td +(ard )Tj +1.802 0 Td +(hac)Tj +1.538 0 Td +(ks. )Tj +1.506 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.469 0 Td +(root )Tj +-40.477 -1.44 Td +(cause )Tj +(of )Tj +(the )Tj +(problem )Tj +(w)Tj +10.098 0 Td +(as )Tj +(the )Tj +(interference )Tj +(of )Tj +(the )Tj +(existing )Tj +(J)Tj +14.717 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +(EE )Tj +(5/6 )Tj +(infr)Tj +5.157 0 Td +(astructure )Tj +(with )Tj +(Spring )Tj +(and )Tj +-30.918 -1.44 Td +(OpenJP)Tj +3.224 0 Td +(A. )Tj +1.252 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.437 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +1.048 0 Td +(implementation )Tj +7.161 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.27 0 Td +(managed )Tj +4.326 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.881 0 Td +(Spring, )Tj +3.382 0 Td +(and )Tj +1.993 0 Td +(EclipseLink )Tj +5.216 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.27 0 Td +(managed )Tj +-38.255 -1.44 Td +(b)Tj +0.538 0 Td +(y )Tj +0.856 0 Td +(the )Tj +1.69 0 Td +(application )Tj +5.192 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.634 0 Td +(Because )Tj +3.912 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +1.023 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.245 0 Td +(bundled )Tj +3.914 0 Td +(with )Tj +2.246 0 Td +(the )Tj +1.69 0 Td +(application, )Tj +5.47 0 Td +(it )Tj +0.912 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.245 0 Td +(found )Tj +/C2_0 1 Tf +2.858 0 Td +<005D>Tj +/TT0 1 Tf +(rst)Tj +( )Tj +-40.644 -1.44 Td +(b)Tj +0.538 0 Td +(y )Tj +0.905 0 Td +(the )Tj +1.739 0 Td +(class )Tj +2.461 0 Td +(loader)Tj +2.649 0 Td +(. )Tj +0.609 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.461 0 Td +(EJB )Tj +1.794 0 Td +(3.1 )Tj +1.795 0 Td +(bean )Tj +2.517 0 Td +(tried )Tj +2.35 0 Td +(to )Tj +1.239 0 Td +(inject )Tj +2.795 0 Td +(the )Tj +/C2_0 1 Tf +1.739 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.24 0 Td +(EclipseLink )Tj +5.24 0 Td +(pro)Tj +1.433 0 Td +(vider)Tj +2.093 0 Td +(, )Tj +0.683 0 Td +(but )Tj +1.795 0 Td +(that )Tj +-40.588 -1.44 Td +(failed because the EclipseLink classes were o)Tj +19.328 0 Td +(v)Tj +0.488 0 Td +(ershado)Tj +3.378 0 Td +(wed b)Tj +2.65 0 Td +(y OpenJP)Tj +4.002 0 Td +(A.)Tj +-28.046 -2.24 Td +(After )Tj +2.796 0 Td +(a )Tj +1.24 0 Td +(few )Tj +2.296 0 Td +(attempts )Tj +4.352 0 Td +(and )Tj +2.352 0 Td +(about )Tj +3.186 0 Td +(an )Tj +1.796 0 Td +(hour )Tj +2.741 0 Td +(of )Tj +1.574 0 Td +(w)Tj +0.766 0 Td +(orkarounds )Tj +5.575 0 Td +(and )Tj +2.352 0 Td +(hac)Tj +1.538 0 Td +(ks, )Tj +1.907 0 Td +(I )Tj +1.018 0 Td +(started )Tj +3.574 0 Td +(the )Tj +-40.866 -1.44 Td +(implementation of \223plan B\224: deplo)Tj +14.827 0 Td +(ying x-r)Tj +3.266 0 Td +(a)Tj +0.47 0 Td +(y as standalone service.)Tj +/TT2 1 Tf +12 0 0 12 57 433.2 Tm +(Next Iter)Tj +3.932 0 Td +(ation: )Tj +2.705 0 Td +(T)Tj +0.511 0 Td +(he Simplest P)Tj +5.79 0 Td +(ossible \(W)Tj +4.52 0 Td +(orking\) Solution)Tj +/TT0 1 Tf +10 0 0 10 75 410.8 Tm +(So )Tj +1.463 0 Td +(far)Tj +1.037 0 Td +(, )Tj +0.685 0 Td +(the )Tj +1.741 0 Td +(only )Tj +2.297 0 Td +(\(but )Tj +2.075 0 Td +(serious\) )Tj +3.686 0 Td +(problem )Tj +4.019 0 Td +(is )Tj +1.074 0 Td +(the )Tj +1.741 0 Td +(interference )Tj +5.519 0 Td +(between )Tj +4.075 0 Td +(the )Tj +1.741 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.074 0 Td +(pro)Tj +1.433 0 Td +(vider )Tj +2.574 0 Td +(shipped )Tj +-38.809 -1.44 Td +(with )Tj +2.242 0 Td +(GlassF)Tj +2.816 0 Td +(ish, )Tj +1.853 0 Td +(EclipseLink, )Tj +5.465 0 Td +(and )Tj +1.964 0 Td +(the )Tj +1.686 0 Td +(OpenJP)Tj +3.224 0 Td +(A )Tj +1.019 0 Td +(implementation. )Tj +7.41 0 Td +(I )Tj +0.63 0 Td +(could )Tj +/C2_0 1 Tf +2.798 0 Td +<005D>Tj +/TT0 1 Tf +(x )Tj +1.408 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.908 0 Td +(interference )Tj +5.464 0 Td +(with )Tj +-40.31 -1.44 Td +(GlassF)Tj +/C2_0 1 Tf +2.816 0 Td +<0041004B0040000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +5.158 0 Td +(class )Tj +2.379 0 Td +(loader )Tj +3.046 0 Td +(tric)Tj +1.371 0 Td +(ks, )Tj +1.49 0 Td +(but )Tj +1.713 0 Td +(the )Tj +1.657 0 Td +(result )Tj +2.657 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.269 0 Td +(hardly )Tj +3.046 0 Td +(be )Tj +1.379 0 Td +(portable. )Tj +4.121 0 Td +(Although )Tj +4.27 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.823 0 Td +(will )Tj +-40.588 -1.44 Td +(primarily run on GlassF)Tj +10.096 0 Td +(ish, portability is still an issue. )Tj +-8.296 -2.24 Td +(Relying )Tj +3.807 0 Td +(on )Tj +/C2_0 1 Tf +1.696 0 Td +<00390048004800440041003B0039004C004100470046000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +9.032 0 Td +(features )Tj +3.918 0 Td +(can )Tj +2.14 0 Td +(also )Tj +2.307 0 Td +(affect )Tj +2.918 0 Td +(the )Tj +1.918 0 Td +(ability )Tj +3.252 0 Td +(to )Tj +1.418 0 Td +(upgr)Tj +1.933 0 Td +(ade )Tj +2.14 0 Td +(to )Tj +1.418 0 Td +(future )Tj +-39.699 -1.44 Td +(v)Tj +0.488 0 Td +(ersions )Tj +3.458 0 Td +(of )Tj +1.291 0 Td +(a )Tj +0.957 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.513 0 Td +(application )Tj +5.293 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.735 0 Td +(I )Tj +0.735 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.957 0 Td +(had )Tj +2.069 0 Td +(minor )Tj +3.013 0 Td +(issues )Tj +2.958 0 Td +(with )Tj +2.347 0 Td +(porting )Tj +3.514 0 Td +(a )Tj +0.957 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.68 0 Td +(v2 )Tj +-41.144 -1.44 Td +(application, w)Tj +6.152 0 Td +(hic)Tj +1.316 0 Td +(h w)Tj +1.594 0 Td +(as pac)Tj +2.705 0 Td +(kaged in a J)Tj +4.99 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE-incompatible w)Tj +8.818 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(, to GlassF)Tj +4.484 0 Td +(ish v3 \(see )Tj +-31.883 -1.44 Td +(http://ja)Tj +3.25 0 Td +(v)Tj +0.476 0 Td +(a.net/jir)Tj +3.267 0 Td +(a/bro)Tj +2.211 0 Td +(wse/GLASSFISH-10496)Tj +(\). )Tj +10.995 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.51 0 Td +(application )Tj +5.29 0 Td +(w)Tj +0.766 0 Td +(orked )Tj +2.899 0 Td +(with )Tj +2.344 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.677 0 Td +(v2, )Tj +1.788 0 Td +(but )Tj +1.844 0 Td +(it )Tj +-41.644 -1.44 Td +(w)Tj +0.766 0 Td +(orked with GlassF)Tj +7.707 0 Td +(ish v3 only after some tweaks. )Tj +-6.673 -2.24 Td +(Furthermore, )Tj +6.031 0 Td +(application )Tj +5.311 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +/C2_0 1 Tf +0.778 0 Td +<000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +/C2_0 1 Tf +4.087 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ations, )Tj +3.31 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.031 0 Td +(as )Tj +1.364 0 Td +(class )Tj +2.531 0 Td +(loader )Tj +3.198 0 Td +(hac)Tj +1.538 0 Td +(ks, )Tj +1.642 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys)Tj +( )Tj +-41.311 -1.44 Td +(negati)Tj +2.594 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.59 0 Td +(impact )Tj +3.257 0 Td +(the )Tj +1.646 0 Td +(installation )Tj +5.037 0 Td +(experience. )Tj +5.313 0 Td +(If )Tj +0.868 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.424 0 Td +(use )Tj +1.757 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +/C2_0 1 Tf +0.868 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ations, )Tj +3.147 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.757 0 Td +(users )Tj +2.479 0 Td +(will )Tj +1.924 0 Td +(need)Tj +( )Tj +-40.088 -1.44 Td +(application serv)Tj +6.824 0 Td +(er)Tj +/C2_0 1 Tf +0.778 0 Td +<000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c kno)Tj +5.49 0 Td +(wledge to install the application.)Tj +/TT2 1 Tf +12 0 0 12 57 200 Tm +(Protected )Tj +4.409 0 Td +(V)Tj +0.612 0 Td +(ariations \205W)Tj +6.039 0 Td +(ith Distribution)Tj +/TT0 1 Tf +10 0 0 10 75 177.6 Tm +(My )Tj +1.83 0 Td +(\223plan )Tj +2.775 0 Td +(B\224 )Tj +1.496 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.33 0 Td +(essentially )Tj +4.887 0 Td +(the )Tj +1.775 0 Td +(implementation )Tj +7.221 0 Td +(of )Tj +1.275 0 Td +(the )Tj +1.775 0 Td +(old )Tj +1.831 0 Td +(\223Gang )Tj +3.219 0 Td +(of )Tj +1.275 0 Td +(F)Tj +0.455 0 Td +(our\224 )Tj +2.33 0 Td +(Proxy )Tj +2.886 0 Td +(pattern. )Tj +-38.921 -1.44 Td +(Because )Tj +3.98 0 Td +(it )Tj +0.98 0 Td +(isn\222)Tj +1.464 0 Td +(t )Tj +0.702 0 Td +(possible )Tj +3.926 0 Td +(to )Tj +1.258 0 Td +(access )Tj +3.202 0 Td +(the )Tj +1.758 0 Td +(persistence )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 281.7599 163.2 Tm +(directly)Tj +3.131 0 Td +(, )Tj +0.702 0 Td +(we )Tj +1.702 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.924 0 Td +(to )Tj +1.258 0 Td +(run )Tj +1.869 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.924 0 Td +(in )Tj +1.258 0 Td +(an )Tj +1.48 0 Td +(isolated )Tj +-38.865 -1.44 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.585 0 Td +(domain )Tj +3.641 0 Td +(\(JVM\). )Tj +2.993 0 Td +(A )Tj +1.029 0 Td +(proxy )Tj +2.807 0 Td +(communicates )Tj +6.641 0 Td +(with )Tj +2.252 0 Td +(the )Tj +1.696 0 Td +(persistence )Tj +5.141 0 Td +(in )Tj +1.196 0 Td +(the )Tj +1.696 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.474 0 Td +(and )Tj +1.974 0 Td +(makes )Tj +-39.478 -1.44 Td +(the )Tj +1.692 0 Td +(access )Tj +3.136 0 Td +(almost )Tj +3.192 0 Td +(tr)Tj +0.599 0 Td +(ansparent. )Tj +4.804 0 Td +(My )Tj +1.747 0 Td +(c)Tj +0.482 0 Td +(hoice )Tj +2.748 0 Td +(for )Tj +1.525 0 Td +(the )Tj +1.692 0 Td +(remote )Tj +3.358 0 Td +(protocol )Tj +3.971 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.247 0 Td +(easy)Tj +1.797 0 Td +(. )Tj +0.562 0 Td +(T)Tj +0.464 0 Td +(w)Tj +0.766 0 Td +(o )Tj +0.914 0 Td +(String )Tj +2.803 0 Td +(instances )Tj +-38.254 -1.44 Td +(can )Tj +1.872 0 Td +(be )Tj +1.372 0 Td +(easily )Tj +2.761 0 Td +(sent )Tj +2.039 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.149 0 Td +(the )Tj +1.65 0 Td +(wire )Tj +2.205 0 Td +(via )Tj +1.594 0 Td +(HTTP)Tj +2.317 0 Td +(. )Tj +0.594 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.816 0 Td +(EE )Tj +1.316 0 Td +(6 )Tj +0.872 0 Td +(makes )Tj +3.038 0 Td +(it )Tj +0.872 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.372 0 Td +(easier)Tj +2.426 0 Td +(. )Tj +0.594 0 Td +(It )Tj +0.872 0 Td +(comes )Tj +3.094 0 Td +(with )Tj +2.206 0 Td +(a )Tj +0.816 0 Td +(built-in )Tj +-39.087 -1.44 Td +(REST )Tj +2.864 0 Td +(implementation )Tj +7.477 0 Td +(bac)Tj +1.538 0 Td +(ked )Tj +2.253 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.197 0 Td +(the )Tj +2.031 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.16 0 Td +(API )Tj +2.198 0 Td +(for )Tj +1.864 0 Td +(RESTful )Tj +3.939 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.753 0 Td +(Services )Tj +4.197 0 Td +(\(J)Tj +0.538 0 Td +(AX-RS\) )Tj +3.697 0 Td +(\()Tj +(http://)Tj +-39.42 -1.44 Td +(www)Tj +2.26 0 Td +(.jcp.org/en/jsr/summary?id=311)Tj +(\). )Tj +ET + +endstream +endobj +59 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 60 0 R>>endobj +60 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(22)Tj +0 Tc 0 Tw -18.632 57.06 Td +(T)Tj +0.511 0 Td +(he )Tj +1.421 0 Td +(simplest )Tj +3.866 0 Td +(possible )Tj +3.867 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.865 0 Td +(to )Tj +1.199 0 Td +(access )Tj +3.143 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.865 0 Td +(in )Tj +1.199 0 Td +(a )Tj +0.865 0 Td +(standalone )Tj +5.034 0 Td +(process, )Tj +3.866 0 Td +(from )Tj +2.365 0 Td +(the )Tj +1.699 0 Td +(implementation )Tj +-35.42 -1.44 Td +(perspecti)Tj +3.872 0 Td +(v)Tj +0.488 0 Td +(e, )Tj +1.191 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.359 0 Td +(be )Tj +1.469 0 Td +(to )Tj +1.247 0 Td +(use )Tj +1.858 0 Td +(a )Tj +0.913 0 Td +(binary )Tj +3.136 0 Td +(protocol )Tj +4.026 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.969 0 Td +(as )Tj +1.302 0 Td +(Remote )Tj +3.691 0 Td +(Method )Tj +3.748 0 Td +(In)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.637 0 Td +(\(RMI\). )Tj +3.025 0 Td +(RMI )Tj +-40.422 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +/C2_0 1 Tf +2.35 0 Td +<005D>Tj +/TT0 1 Tf +(t )Tj +1.238 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.904 0 Td +(needs )Tj +2.905 0 Td +(perfectly)Tj +3.631 0 Td +(. )Tj +0.682 0 Td +(It )Tj +0.96 0 Td +(comes )Tj +3.182 0 Td +(with )Tj +2.294 0 Td +(the )Tj +1.738 0 Td +(JDK, )Tj +2.349 0 Td +(it )Tj +0.96 0 Td +(is )Tj +1.071 0 Td +(almost )Tj +3.238 0 Td +(tr)Tj +0.599 0 Td +(ansparent, )Tj +4.85 0 Td +(and )Tj +2.016 0 Td +(it )Tj +0.96 0 Td +(is )Tj +1.071 0 Td +(fast. )Tj +2.053 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(problem )Tj +3.926 0 Td +(is )Tj +0.981 0 Td +(the )Tj +1.648 0 Td +(default )Tj +3.26 0 Td +(port )Tj +2.037 0 Td +(\(1099\) )Tj +3.094 0 Td +(and )Tj +1.926 0 Td +(the )Tj +1.648 0 Td +(required )Tj +3.926 0 Td +(existence )Tj +4.315 0 Td +(of )Tj +1.148 0 Td +(the )Tj +1.648 0 Td +(RMI )Tj +2.092 0 Td +(registry)Tj +3.019 0 Td +(. )Tj +0.592 0 Td +(RMI )Tj +2.092 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.26 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +-40.867 -1.44 Td +(likely )Tj +2.644 0 Td +(interfere )Tj +3.866 0 Td +(with )Tj +2.2 0 Td +(existing )Tj +3.589 0 Td +(application )Tj +5.146 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.143 0 Td +(registries )Tj +4.088 0 Td +(and )Tj +1.922 0 Td +(ports. )Tj +2.626 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.366 0 Td +(same )Tj +2.532 0 Td +(is )Tj +0.977 0 Td +(true )Tj +1.977 0 Td +(of )Tj +1.144 0 Td +(the )Tj +1.644 0 Td +(built-in )Tj +-39.087 -1.44 Td +(Common )Tj +4.412 0 Td +(Object )Tj +3.356 0 Td +(Request )Tj +3.801 0 Td +(Broker )Tj +3.207 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hitecture )Tj +4.19 0 Td +(\(CORB)Tj +2.963 0 Td +(A\) )Tj +1.356 0 Td +(implementation. )Tj +7.469 0 Td +(Both )Tj +2.412 0 Td +(RMI )Tj +2.189 0 Td +(and )Tj +2.023 0 Td +(CORB)Tj +2.685 0 Td +(A )Tj +/C2_0 1 Tf +-41.533 -1.44 Td +<004A003D004400510001004700460001003A004100460039004A005100010048004A0047004C0047003B00470044004B000100390046003C00010039004A003D000100460047004C0001005D>Tj +/TT0 1 Tf +(rew)Tj +17.878 0 Td +(all friendly)Tj +4.521 0 Td +(.)Tj +-20.599 -2.24 Td +(A )Tj +1.26 0 Td +(true )Tj +2.26 0 Td +(solution )Tj +4.04 0 Td +(to )Tj +1.427 0 Td +(the )Tj +1.927 0 Td +(problem )Tj +4.205 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.539 0 Td +(be )Tj +1.649 0 Td +(to )Tj +1.427 0 Td +(introduce )Tj +4.706 0 Td +(Simple )Tj +3.538 0 Td +(Object )Tj +3.501 0 Td +(Access )Tj +3.538 0 Td +(Protocol )Tj +-38.587 -1.44 Td +(\(SO)Tj +1.574 0 Td +(AP\))Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(based )Tj +5.335 0 Td +(communication. )Tj +7.717 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.789 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.196 0 Td +(API )Tj +2.234 0 Td +(for )Tj +1.9 0 Td +(XML )Tj +2.696 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.789 0 Td +(Services )Tj +4.233 0 Td +(\(J)Tj +0.538 0 Td +(AX-WS\) )Tj +4.122 0 Td +(\()Tj +(http://jax-)Tj +-37.809 -1.44 Td +(ws.ja)Tj +2.193 0 Td +(v)Tj +0.476 0 Td +(a.net/)Tj +(\) )Tj +2.971 0 Td +(comes )Tj +3.081 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.803 0 Td +(bundled )Tj +3.861 0 Td +(with )Tj +2.193 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.636 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.803 0 Td +(EE )Tj +1.303 0 Td +(application )Tj +5.139 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.581 0 Td +(and )Tj +1.915 0 Td +(it )Tj +0.859 0 Td +(is )Tj +0.97 0 Td +(relati)Tj +2.149 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.581 0 Td +(easy)Tj +( )Tj +-40.311 -1.44 Td +(to )Tj +1.177 0 Td +(implement )Tj +4.955 0 Td +(and )Tj +1.955 0 Td +(consume. )Tj +4.437 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.899 0 Td +(implement )Tj +4.955 0 Td +(a )Tj +0.843 0 Td +(SO)Tj +1.296 0 Td +(AP )Tj +1.566 0 Td +(endpoint, )Tj +4.457 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.455 0 Td +(need )Tj +2.455 0 Td +(only )Tj +2.233 0 Td +(a )Tj +0.843 0 Td +(single )Tj +2.844 0 Td +(annotation: )Tj +/TT1 1 Tf +-37.308 -1.44 Td +(@javax.jws.WebService )Tj +/TT0 1 Tf +(\(see Listing 6)Tj +/TT1 1 Tf +(\))Tj +/TT0 1 Tf +(. )Tj +/TT2 1 Tf +1.8 -3.32 Td +(@WebService)Tj +/TT1 1 Tf +0 -2.12 TD +(@Stateless)Tj +T* +(public class HitsService {)Tj +T* +( public String updateStatistics\(String uri, String referer\) {)Tj +T* +( return "Echo: " + uri + "|" + referer;)Tj +T* +( })Tj +0 -2.12 TD +(})Tj +/TT0 1 Tf +-1.8 -1.2 Td +(Listing 6: )Tj +4.132 0 Td +(A Stateless Session Bean as SO)Tj +13.189 0 Td +(AP Service)Tj +-15.521 -3.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.534 0 Td +(implementation )Tj +7.258 0 Td +(of )Tj +1.312 0 Td +(a )Tj +0.978 0 Td +(SO)Tj +1.296 0 Td +(AP )Tj +1.701 0 Td +(endpoint )Tj +4.314 0 Td +(is )Tj +1.145 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.534 0 Td +(easier )Tj +2.978 0 Td +(to )Tj +1.312 0 Td +(implement )Tj +5.09 0 Td +(than )Tj +2.368 0 Td +(a )Tj +0.978 0 Td +(compar)Tj +3.266 0 Td +(able )Tj +-40.366 -1.44 Td +(R)Tj +(E)Tj +(S)Tj +(T)Tj +(f)Tj +(u)Tj +(l )Tj +4.058 0 Td +(s)Tj +(e)Tj +(r)Tj +(v)Tj +(i)Tj +(c)Tj +(e)Tj +(. )Tj +4.057 0 Td +(S)Tj +(O)Tj +1.296 0 Td +(A)Tj +(P)Tj +(\222)Tj +1.409 0 Td +(s )Tj +1.167 0 Td +(s)Tj +(h)Tj +(o)Tj +(r)Tj +(t)Tj +(c)Tj +(o)Tj +(m)Tj +(i)Tj +(n)Tj +(g )Tj +6.114 0 Td +(i)Tj +(s )Tj +1.445 0 Td +(t)Tj +(h)Tj +(e )Tj +2.112 0 Td +(r)Tj +(e)Tj +(q)Tj +(u)Tj +(i)Tj +(r)Tj +(e)Tj +(d )Tj +4.391 0 Td +(a)Tj +(d)Tj +(d)Tj +(i)Tj +(t)Tj +(i)Tj +(o)Tj +(n)Tj +(a)Tj +(l )Tj +5.115 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(e)Tj +(r)Tj +(h)Tj +(e)Tj +(a)Tj +(d)Tj +(: )Tj +4.002 0 Td +(t)Tj +(h)Tj +(e )Tj +2.112 0 Td +(s)Tj +(o)Tj +(-)Tj +(c)Tj +(a)Tj +(l)Tj +(l)Tj +(e)Tj +(d )Tj +-38.309 -1.44 Td +(\223en)Tj +1.488 0 Td +(v)Tj +0.488 0 Td +(elope.)Tj +2.613 0 Td +(\224 )Tj +0.685 0 Td +(Also, SO)Tj +3.742 0 Td +(AP can hardly be used without additional libr)Tj +19.554 0 Td +(aries, fr)Tj +3.155 0 Td +(amew)Tj +2.599 0 Td +(orks, or tools. )Tj +-32.524 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.49 0 Td +(structure )Tj +4.157 0 Td +(of )Tj +1.268 0 Td +(the )Tj +1.768 0 Td +(SO)Tj +1.296 0 Td +(AP )Tj +1.657 0 Td +(en)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(elope )Tj +2.824 0 Td +(is )Tj +1.101 0 Td +(simple )Tj +3.268 0 Td +(\(see )Tj +2.101 0 Td +(Listing )Tj +3.213 0 Td +(7\), )Tj +1.546 0 Td +(but )Tj +1.824 0 Td +(in )Tj +1.268 0 Td +(the )Tj +1.768 0 Td +(case )Tj +2.323 0 Td +(of )Tj +1.268 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.934 0 Td +(it )Tj +0.99 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(entirely )Tj +/C2_0 1 Tf +3.572 0 Td +<004B004D0048003D004A005E>Tj +/TT0 1 Tf +(uous, )Tj +5.574 0 Td +(and )Tj +1.961 0 Td +(the )Tj +1.683 0 Td +(en)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(elope )Tj +2.739 0 Td +(leads )Tj +2.572 0 Td +(to )Tj +/C2_0 1 Tf +1.183 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cant )Tj +4.74 0 Td +(bloat. )Tj +2.721 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.405 0 Td +(size )Tj +2.016 0 Td +(of )Tj +1.183 0 Td +(the )Tj +1.683 0 Td +(en)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(elope )Tj +2.739 0 Td +(for )Tj +1.516 0 Td +(the )Tj +-40.866 -1.44 Td +(response )Tj +4.086 0 Td +(\(see )Tj +1.974 0 Td +(Listing )Tj +3.086 0 Td +(8\) )Tj +1.141 0 Td +(is )Tj +0.974 0 Td +(288 )Tj +1.975 0 Td +(b)Tj +0.538 0 Td +(ytes )Tj +1.974 0 Td +(and )Tj +1.919 0 Td +(the )Tj +1.641 0 Td +(actual )Tj +2.919 0 Td +(pa)Tj +1.026 0 Td +(yload )Tj +2.697 0 Td +(is )Tj +0.974 0 Td +(only )Tj +2.197 0 Td +(29 )Tj +1.419 0 Td +(b)Tj +0.538 0 Td +(ytes. )Tj +2.252 0 Td +(J)Tj +0.26 0 Td +(ust )Tj +1.53 0 Td +(taking )Tj +2.919 0 Td +(the )Tj +1.641 0 Td +(SO)Tj +1.296 0 Td +(AP )Tj +-40.977 -1.44 Td +(en)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(elope )Tj +2.711 0 Td +(into )Tj +1.989 0 Td +(account )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 157 161.9999 Tm +(w)Tj +0.766 0 Td +(ould )Tj +2.267 0 Td +(result )Tj +2.655 0 Td +(in )Tj +1.155 0 Td +(an )Tj +1.377 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +3.266 0 Td +(of )Tj +1.155 0 Td +(288 )Tj +1.989 0 Td +(/ )Tj +0.599 0 Td +(29 )Tj +1.433 0 Td +(= )Tj +0.927 0 Td +(9.93, )Tj +2.545 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.877 0 Td +(is )Tj +0.988 0 Td +(almost )Tj +3.155 0 Td +(ten )Tj +1.655 0 Td +(times)Tj +( )Tj +-39.922 -1.44 Td +(the pa)Tj +2.638 0 Td +(yload.)Tj +/TT1 1 Tf +-0.838 -4.36 Td +()Tj +0 -2.12 TD +()Tj +ET + +endstream +endobj +61 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 63 0 R>>endobj +62 0 obj<>endobj +63 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(23)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 630.8 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 609.6 Tm +( )Tj +0 -2.12 TD +( )Tj +T* +( )Tj +/TT2 1 Tf +(/entry/javaee)Tj +/TT1 1 Tf +()Tj +T* +( )Tj +/TT2 1 Tf +(localhost)Tj +/TT1 1 Tf +()Tj +T* +( )Tj +T* +( )Tj +T* +()Tj +/TT0 1 Tf +0 -2.24 TD +(Listing 7: )Tj +4.132 0 Td +(A SO)Tj +2.241 0 Td +(AP Request)Tj +-6.373 -4.72 Td +(SO)Tj +1.296 0 Td +(AP )Tj +1.646 0 Td +(uses )Tj +2.257 0 Td +(HTTP)Tj +/TT3 1 Tf +12 0 0 12 151.4536 412.8 Tm +( )Tj +/TT0 1 Tf +10 0 0 10 156.5298 412.8 Tm +(POST )Tj +2.868 0 Td +(exclusi)Tj +2.983 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.701 0 Td +(behind )Tj +3.425 0 Td +(the )Tj +1.757 0 Td +(scenes, )Tj +3.535 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.979 0 Td +(makes )Tj +3.145 0 Td +(the )Tj +1.757 0 Td +(use )Tj +1.868 0 Td +(of )Tj +1.257 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.923 0 Td +(proxy)Tj +( )Tj +-39.755 -1.44 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.223 0 Td +(cac)Tj +1.482 0 Td +(hing )Tj +2.28 0 Td +(or )Tj +1.279 0 Td +(other )Tj +2.613 0 Td +(built-in )Tj +3.503 0 Td +(HTTP )Tj +2.836 0 Td +(features )Tj +3.724 0 Td +(impossible. )Tj +5.244 0 Td +(Although )Tj +4.337 0 Td +(SO)Tj +1.296 0 Td +(AP )Tj +1.613 0 Td +(can )Tj +1.946 0 Td +(be )Tj +1.446 0 Td +(implemented )Tj +-36.532 -1.44 Td +(fairly )Tj +2.517 0 Td +(easily )Tj +2.795 0 Td +(on )Tj +1.462 0 Td +(the )Tj +1.684 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.183 0 Td +(side, )Tj +2.351 0 Td +(it )Tj +0.906 0 Td +(is )Tj +1.017 0 Td +(a )Tj +0.85 0 Td +(lot )Tj +1.462 0 Td +(harder )Tj +3.128 0 Td +(for )Tj +1.517 0 Td +(the )Tj +1.684 0 Td +(client )Tj +2.74 0 Td +(to )Tj +1.184 0 Td +(consume. )Tj +4.518 0 Td +(SO)Tj +1.296 0 Td +(AP )Tj +1.573 0 Td +(consumption )Tj +5.964 0 Td +(is )Tj +-41.533 -1.44 Td +(too )Tj +1.739 0 Td +(cumbersome )Tj +5.905 0 Td +(without )Tj +3.629 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.849 0 Td +(libr)Tj +1.433 0 Td +(aries, )Tj +2.627 0 Td +(and )Tj +1.961 0 Td +(the )Tj +1.683 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.239 0 Td +(libr)Tj +1.433 0 Td +(aries )Tj +2.349 0 Td +(tend )Tj +2.239 0 Td +(to )Tj +1.183 0 Td +(introduce )Tj +4.462 0 Td +(consider)Tj +3.656 0 Td +(able )Tj +-40.366 -1.44 Td +(external dependencies. SO)Tj +11.522 0 Td +(AP is also harder to test than a plain HTTP service.)Tj +/TT1 1 Tf +-9.722 -2.12 Td +()Tj +0 -2.12 TD +()Tj +T* +( )Tj +T* +( )Tj +1.8 -2.12 Td +( )Tj +/TT2 1 Tf +(Echo: /entry/javaee|localhost)Tj +/TT1 1 Tf +()Tj +0 -2.12 TD +( )Tj +0 -2.12 TD +( )Tj +T* +()Tj +/TT0 1 Tf +-1.8 -1.2 Td +(Listing 8: )Tj +4.132 0 Td +(A SO)Tj +2.241 0 Td +(AP Response)Tj +-4.573 -3.44 Td +(SO)Tj +1.296 0 Td +(AP )Tj +1.775 0 Td +(also )Tj +2.275 0 Td +(encour)Tj +2.989 0 Td +(ages )Tj +2.441 0 Td +(the )Tj +1.886 0 Td +(Remote )Tj +3.83 0 Td +(Procedure )Tj +4.942 0 Td +(Call )Tj +2.275 0 Td +(\(RPC\) )Tj +2.942 0 Td +(procedur)Tj +3.878 0 Td +(al )Tj +1.33 0 Td +(progr)Tj +2.266 0 Td +(amming )Tj +4.052 0 Td +(style, )Tj +-39.977 -1.44 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h leads to tec)Tj +5.707 0 Td +(hnically dri)Tj +4.873 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.297 0 Td +(APIs and less emphasis on the target domain.)Tj +-12.641 -2.24 Td +(F)Tj +0.445 0 Td +(ar better suited for RPC communication is the open sour)Tj +24.109 0 Td +(ce libr)Tj +2.711 0 Td +(ary called \223Hessian\224 )Tj +ET + +endstream +endobj +64 0 obj<>stream +HW PTϹ./w{]uA|vV@d j4kԄ>ҨrEYZtLSih435&N ߽Pau=M 0 +@Ϊ`ccm I!Pq}CDY7}rz&ޱc/b#RWд)O+~CUAhLx!ǃ Q"6qMZ #2?7{ 02AQG2K'(G +S8Dڻw:{[W;o.nz:U9Y%,o"Ei4<Mta̟C 4vf׶w^K۴8EO tU;AVA:~X\iznC漶H뤑 yF']xX^N'l+;h9qdReNiEoZ/ȡ<=#0{5=l/w]J<H m`?3v[$ME)TU+ Q3ېv83Il>] +_GR,#>!vImsquQ=B;MS 5Y!sՐ0{wͽ2nrcx>o{!~) +{:+&{Ÿz}S+.i7H6쌋 +b8*~Į!XJ7,Ma!KRղ䤁x*Ocy_x_a!S +NoM(1qUK|K-=,-VJai&TI祋VStE ڰ;gqfOGd~ +=NU,Hj)G{ThI8 '8v +ԡQ8HIG0TtQ}VSgn^n΄qWm5;klfF%+cFj>,%9)1$g(YPJII+AUFxp*2ypnt*,ϥ٣݊e`v+~Yj؋ fRU=jqsMp]t$8NJ4?RcWx Q`]3m6?b0GVIU+ջNZЭ`O~^jVӶ\@`x=bkCa7$wfx0ugؙ@÷J C2&PG)q"vh>l(P>D+󏡋q䩩 PGk\f딚hkc[RM nRoSno.n ٫)4\|aW=qAHǀj_p1Գƺ!ʘm%#D1lq[MUKB͡ڪ2"H>s!oƻj +rIDx}Ybj!)΃NY(^g/Ceh3t'yov]]bLl3E.n$Xߎ2w-tNXzpJ*Jf/'dg[:;[o ua`;Е=z9.2|3EKǓ W&G9벞1ʆaouzIX`nT@VuOvGdw0%&BRYmS >v0$o s7P7}"ו2<+" V4TAP^FvPJNU +w3b͠8{. ͞v0Vo0TX`1MC]UG^UM];nĮ u+Kpqpqppqpp`\^m7j{`qPe7Z,L ";?X@660m,  XB D2A#1߻U^^NBj˱ d#my l$\F()NA +}eT N]+6$)(l*v3@tbT Y. +ҰH˔]62DlLsHuTPmNr*EnWÜ@J" N +dWC.?]3KXk Q#]v0.UQ~y +endstream +endobj +65 0 obj<>endobj +66 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 67 0 R>>endobj +67 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(24)Tj +0 Tc 0 Tw -20.432 57.06 Td +(\()Tj +(http://hessian.cauc)Tj +8.264 0 Td +(ho.com/)Tj +(\). )Tj +4.469 0 Td +(Hessian )Tj +3.746 0 Td +(feels )Tj +2.301 0 Td +(like )Tj +1.912 0 Td +(RMI, )Tj +2.412 0 Td +(but )Tj +1.746 0 Td +(it )Tj +0.912 0 Td +(communicates )Tj +6.635 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.189 0 Td +(HTTP)Tj +2.317 0 Td +(. )Tj +0.634 0 Td +(It )Tj +0.912 0 Td +(is )Tj +1.023 0 Td +(a )Tj +0.856 0 Td +(lean )Tj +-40.366 -1.44 Td +(servlet)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(based solution. )Tj +1.8 -2.24 Td +(Hessian )Tj +3.686 0 Td +(is )Tj +0.963 0 Td +(easy )Tj +2.185 0 Td +(to )Tj +1.13 0 Td +(use, )Tj +2.019 0 Td +(simple, )Tj +3.408 0 Td +(fast, )Tj +2.019 0 Td +(and )Tj +1.908 0 Td +(well )Tj +2.13 0 Td +(documented, )Tj +5.965 0 Td +(but )Tj +1.686 0 Td +(unfortunately)Tj +5.633 0 Td +(, )Tj +0.574 0 Td +(it )Tj +0.852 0 Td +(is )Tj +0.963 0 Td +(not )Tj +1.686 0 Td +(a )Tj +0.796 0 Td +(part )Tj +1.963 0 Td +(of )Tj +-41.366 -1.44 Td +(the )Tj +1.669 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.835 0 Td +(EE )Tj +1.335 0 Td +(6 )Tj +0.891 0 Td +(platform. )Tj +4.188 0 Td +(A )Tj +1.002 0 Td +(small )Tj +2.613 0 Td +(\(385 )Tj +2.281 0 Td +(KB\) )Tj +1.835 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.613 0 Td +<005D>Tj +/TT0 1 Tf +(le, )Tj +/TT1 1 Tf +1.947 0 Td +(hessian-4.0.7)Tj +/TT0 1 Tf +( )Tj +8.137 0 Td +(\()Tj +(http://hessian.cauc)Tj +8.264 0 Td +(ho.com/)Tj +(\), )Tj +-38.087 -1.44 Td +(must )Tj +2.452 0 Td +(be )Tj +1.452 0 Td +(distributed )Tj +4.954 0 Td +(to )Tj +1.23 0 Td +(the )Tj +1.73 0 Td +(client )Tj +2.786 0 Td +(and )Tj +2.008 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.637 0 Td +(A )Tj +1.063 0 Td +(single )Tj +2.897 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.674 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.73 0 Td +(is )Tj +1.063 0 Td +(not )Tj +1.786 0 Td +(a )Tj +0.896 0 Td +(big )Tj +1.73 0 Td +(deal, )Tj +2.508 0 Td +(but )Tj +1.786 0 Td +(it )Tj +0.952 0 Td +(has )Tj +1.841 0 Td +(to )Tj +1.23 0 Td +(be )Tj +-41.144 -1.44 Td +(pac)Tj +1.538 0 Td +(kaged )Tj +2.896 0 Td +(with )Tj +2.23 0 Td +(the )Tj +1.674 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.84 0 Td +(proxy )Tj +2.785 0 Td +(and )Tj +1.952 0 Td +(could )Tj +2.786 0 Td +(potentially )Tj +4.898 0 Td +(cause )Tj +2.785 0 Td +(other )Tj +2.563 0 Td +(interferences )Tj +5.841 0 Td +(in )Tj +1.174 0 Td +(future )Tj +2.841 0 Td +(v)Tj +0.488 0 Td +(ersions. )Tj +-38.921 -1.44 Td +(Future Roller releases could, for example, use other v)Tj +22.884 0 Td +(ersions of Hessian and cause problems.)Tj +/TT2 1 Tf +12 0 0 12 57 498.8 Tm +(Bac)Tj +1.593 0 Td +(k to the Roots)Tj +/TT0 1 Tf +10 0 0 10 75 476.4 Tm +(RMI )Tj +2.166 0 Td +(is )Tj +1.055 0 Td +(simple )Tj +3.222 0 Td +(and )Tj +2 0 Td +(fast, )Tj +2.111 0 Td +(but )Tj +1.778 0 Td +(it )Tj +0.944 0 Td +(requires )Tj +3.833 0 Td +(a )Tj +0.888 0 Td +(connection )Tj +5.224 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.221 0 Td +(a )Tj +0.888 0 Td +(non-HTTP )Tj +4.835 0 Td +(port )Tj +2.111 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.944 0 Td +(as )Tj +1.277 0 Td +(1099. )Tj +2.89 0 Td +(It )Tj +-41.644 -1.44 Td +(also )Tj +2.059 0 Td +(handles )Tj +3.671 0 Td +(ports )Tj +2.448 0 Td +(and )Tj +1.948 0 Td +(connections )Tj +5.561 0 Td +(d)Tj +0.532 0 Td +(ynamically )Tj +5.059 0 Td +(behind )Tj +3.338 0 Td +(the )Tj +1.67 0 Td +(scenes. )Tj +3.448 0 Td +(Furthermore)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.864 0 Td +(RMI )Tj +2.114 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.669 0 Td +(likely )Tj +-39.866 -1.44 Td +(w)Tj +0.766 0 Td +(ould interfere with the application serv)Tj +16.662 0 Td +(er services. )Tj +-15.628 -2.24 Td +(Hessian )Tj +3.81 0 Td +(is )Tj +1.087 0 Td +(similar )Tj +3.309 0 Td +(to )Tj +1.254 0 Td +(RMI )Tj +2.198 0 Td +(but )Tj +1.81 0 Td +(it )Tj +0.976 0 Td +(is )Tj +1.087 0 Td +(tunneled )Tj +4.2 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.253 0 Td +(port )Tj +2.143 0 Td +(80 )Tj +1.532 0 Td +(and )Tj +2.032 0 Td +(effecti)Tj +2.594 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.698 0 Td +(implemented )Tj +6.088 0 Td +(as )Tj +1.309 0 Td +(a )Tj +-41.7 -1.44 Td +(servlet. )Tj +3.416 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.49 0 Td +(only )Tj +2.324 0 Td +(ca)Tj +0.97 0 Td +(v)Tj +0.488 0 Td +(eat )Tj +1.712 0 Td +(is )Tj +1.101 0 Td +(the )Tj +1.768 0 Td +(need )Tj +2.546 0 Td +(for )Tj +1.601 0 Td +(an )Tj +1.49 0 Td +(additional )Tj +4.77 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.712 0 Td +<005D>Tj +/TT0 1 Tf +(le, )Tj +2.046 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.99 0 Td +(has )Tj +1.879 0 Td +(to )Tj +1.268 0 Td +(be )Tj +1.49 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.49 0 Td +(with )Tj +-40.31 -1.44 Td +(Roller)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.205 0 Td +(as )Tj +1.288 0 Td +(well )Tj +2.233 0 Td +(as )Tj +1.288 0 Td +(the )Tj +1.733 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.511 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.899 0 Td +(services. )Tj +4.066 0 Td +(It\222)Tj +0.742 0 Td +(s )Tj +0.788 0 Td +(almost )Tj +3.233 0 Td +(perfect, )Tj +3.622 0 Td +(but )Tj +1.789 0 Td +(the )Tj +1.733 0 Td +(Hessian )Tj +3.789 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.677 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.733 0 Td +(could)Tj +( )Tj +-39.754 -1.44 Td +(potentially interfere with future Roller v)Tj +16.939 0 Td +(ersions. )Tj +-15.139 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.336 0 Td +(next )Tj +2.114 0 Td +(ob)Tj +1.1 0 Td +(vious )Tj +2.559 0 Td +(option )Tj +3.06 0 Td +(is )Tj +0.947 0 Td +(the )Tj +1.614 0 Td +(use )Tj +1.725 0 Td +(of )Tj +1.114 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.002 0 Td +(for )Tj +1.447 0 Td +(the )Tj +1.614 0 Td +(REST )Tj +2.447 0 Td +(communication. )Tj +7.338 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.002 0 Td +(comes )Tj +3.058 0 Td +(with )Tj +-40.31 -1.44 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.894 0 Td +(EE )Tj +1.394 0 Td +(6. )Tj +1.228 0 Td +(F)Tj +0.463 0 Td +(rom )Tj +2.116 0 Td +(the )Tj +1.728 0 Td +(consumer )Tj +4.617 0 Td +(perspecti)Tj +3.872 0 Td +(v)Tj +0.488 0 Td +(e)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.144 0 Td +(REST )Tj +2.561 0 Td +(looks )Tj +2.673 0 Td +(and )Tj +2.006 0 Td +(feels )Tj +2.339 0 Td +(like )Tj +1.95 0 Td +(a )Tj +0.894 0 Td +(usual )Tj +2.673 0 Td +(HTTP )Tj +2.84 0 Td +(connection.)Tj +( )Tj +-37.086 -1.44 Td +(T)Tj +0.511 0 Td +(here )Tj +2.207 0 Td +(is )Tj +0.985 0 Td +(no )Tj +/C2_0 1 Tf +1.43 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.153 0 Td +(client)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(side )Tj +4.727 0 Td +(API )Tj +1.819 0 Td +(in )Tj +1.152 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.818 0 Td +(EE )Tj +1.318 0 Td +(6. )Tj +1.115 0 Td +(All )Tj +1.541 0 Td +(major )Tj +2.818 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.04 0 Td +(implementors, )Tj +6.486 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.596 0 Td +(come )Tj +-39.811 -1.44 Td +(with )Tj +2.305 0 Td +(their )Tj +2.36 0 Td +(o)Tj +0.544 0 Td +(wn )Tj +1.749 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient, )Tj +3.361 0 Td +(but )Tj +1.805 0 Td +(proprietary)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.388 0 Td +(REST )Tj +2.582 0 Td +(client )Tj +2.805 0 Td +(implementation. )Tj +7.399 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.471 0 Td +(use )Tj +1.86 0 Td +(of )Tj +1.249 0 Td +(proprietary )Tj +-37.477 -1.44 Td +(REST )Tj +2.672 0 Td +(client )Tj +2.858 0 Td +(APIs )Tj +2.395 0 Td +(requires )Tj +3.95 0 Td +(the )Tj +1.839 0 Td +(inclusion )Tj +4.452 0 Td +(of )Tj +1.339 0 Td +(at )Tj +1.283 0 Td +(least )Tj +2.45 0 Td +(one )Tj +2.117 0 Td +(additional )Tj +4.841 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.783 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.839 0 Td +(and )Tj +2.117 0 Td +(has )Tj +1.95 0 Td +(the )Tj +1.839 0 Td +(same)Tj +( )Tj +-39.978 -1.44 Td +(dr)Tj +0.877 0 Td +(a)Tj +0.482 0 Td +(wbac)Tj +2.316 0 Td +(k as the use of Hessian.)Tj +-1.875 -2.24 Td +(F)Tj +0.455 0 Td +(ortunately)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.033 0 Td +(we )Tj +1.726 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.948 0 Td +(to )Tj +1.282 0 Td +(use )Tj +1.893 0 Td +(the )Tj +1.782 0 Td +(HTTP )Tj +/TT1 1 Tf +2.894 0 Td +(PUT)Tj +/TT0 1 Tf +( )Tj +2.249 0 Td +(command )Tj +4.782 0 Td +(with )Tj +2.338 0 Td +(only )Tj +2.338 0 Td +(tw)Tj +1.044 0 Td +(o )Tj +1.004 0 Td +(string )Tj +2.782 0 Td +(instances. )Tj +4.598 0 Td +(T)Tj +0.511 0 Td +(his)Tj +( )Tj +-40.977 -1.44 Td +(makes )Tj +3.262 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.04 0 Td +(sophisticated )Tj +6.154 0 Td +(object )Tj +3.208 0 Td +(marshaling )Tj +5.263 0 Td +(using )Tj +2.819 0 Td +(XML )Tj +2.54 0 Td +(or )Tj +1.429 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(aScript )Tj +3.485 0 Td +(Object )Tj +3.485 0 Td +(Notation )Tj +4.32 0 Td +(\(JSON\) )Tj +-39.255 -1.44 Td +(unnecessary)Tj +5.187 0 Td +(. )Tj +-3.387 -2.24 Td +(T)Tj +0.544 0 Td +(h)Tj +0.589 0 Td +(e )Tj +1.294 0 Td +(o)Tj +0.589 0 Td +(b)Tj +0.577 0 Td +(v)Tj +0.533 0 Td +(i)Tj +0.311 0 Td +(o)Tj +0.589 0 Td +(u)Tj +0.589 0 Td +(s )Tj +1.183 0 Td +(c)Tj +0.533 0 Td +(a)Tj +0.533 0 Td +(n)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 159.5014 214.0001 Tm +(d)Tj +0.589 0 Td +(i)Tj +0.311 0 Td +(d)Tj +0.589 0 Td +(a)Tj +0.533 0 Td +(t)Tj +0.311 0 Td +(e )Tj +1.294 0 Td +(f)Tj +0.311 0 Td +(o)Tj +0.589 0 Td +(r )Tj +1.127 0 Td +(t)Tj +0.311 0 Td +(h)Tj +0.589 0 Td +(e )Tj +1.294 0 Td +(i)Tj +0.311 0 Td +(m)Tj +0.866 0 Td +(p)Tj +0.589 0 Td +(l)Tj +0.311 0 Td +(e)Tj +0.533 0 Td +(m)Tj +0.866 0 Td +(e)Tj +0.533 0 Td +(n)Tj +0.589 0 Td +(t)Tj +0.311 0 Td +(a)Tj +0.533 0 Td +(t)Tj +0.311 0 Td +(i)Tj +0.311 0 Td +(o)Tj +0.589 0 Td +(n )Tj +1.35 0 Td +(o)Tj +0.589 0 Td +(f )Tj +1.072 0 Td +(a)Tj +0.533 0 Td +(n )Tj +1.35 0 Td +(H)Tj +0.811 0 Td +(T)Tj +0.589 0 Td +(T)Tj +0.589 0 Td +(P )Tj +1.35 0 Td +(c)Tj +0.533 0 Td +(l)Tj +0.311 0 Td +(i)Tj +0.311 0 Td +(e)Tj +0.533 0 Td +(n)Tj +0.589 0 Td +(t )Tj +1.072 0 Td +(i)Tj +0.311 0 Td +(s )Tj +1.183 0 Td +(t)Tj +0.311 0 Td +(h)Tj +0.589 0 Td +(e )Tj +1.294 0 Td +(c)Tj +0.533 0 Td +(l)Tj +0.311 0 Td +(a)Tj +0.533 0 Td +(s)Tj +0.422 0 Td +(s )Tj +/TT1 1 Tf +-41.811 -1.44 Td +(java.net.URLConnection)Tj +/TT0 1 Tf +(. )Tj +13.786 0 Td +(It )Tj +0.861 0 Td +(comes )Tj +3.083 0 Td +(with )Tj +2.195 0 Td +(JDK )Tj +1.972 0 Td +(1.6 )Tj +1.695 0 Td +(and )Tj +1.917 0 Td +(is )Tj +0.972 0 Td +(relati)Tj +2.149 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.583 0 Td +(easy )Tj +2.194 0 Td +(to )Tj +1.139 0 Td +(use. )Tj +2.028 0 Td +(Unfortunately)Tj +5.855 0 Td +(, )Tj +/TT1 1 Tf +-41.922 -1.44 Td +(URLConnection)Tj +/TT0 1 Tf +( is also kno)Tj +12.625 0 Td +(wn for its connection pooling limitations and problems. )Tj +-10.825 -2.24 Td +(F)Tj +0.455 0 Td +(or )Tj +1.239 0 Td +(the )Tj +1.684 0 Td +(proxy )Tj +2.795 0 Td +(implementation)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +7.38 0 Td +(I )Tj +0.628 0 Td +(decided )Tj +3.796 0 Td +(to )Tj +1.184 0 Td +(use )Tj +1.795 0 Td +(plain )Tj +2.518 0 Td +(soc)Tj +1.427 0 Td +(kets )Tj +2.017 0 Td +(\()Tj +/TT1 1 Tf +(java.net.Socket)Tj +/TT0 1 Tf +(\) )Tj +/C2_0 1 Tf +9.908 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.906 0 Td +(\(see)Tj +( )Tj +-40.533 -1.44 Td +(Listing )Tj +3.173 0 Td +(9\). )Tj +1.506 0 Td +(It )Tj +0.95 0 Td +(is )Tj +1.061 0 Td +(easy )Tj +2.283 0 Td +(to )Tj +1.228 0 Td +(implement, )Tj +5.284 0 Td +(test)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.089 0 Td +(and )Tj +2.006 0 Td +(extend )Tj +3.284 0 Td +(but )Tj +1.784 0 Td +(it )Tj +0.95 0 Td +(is )Tj +1.061 0 Td +(not )Tj +1.784 0 Td +(as )Tj +1.283 0 Td +(elegant )Tj +3.506 0 Td +(as )Tj +1.283 0 Td +(a )Tj +0.894 0 Td +(dedicated )Tj +4.618 0 Td +(REST )Tj +-40.033 -1.44 Td +(client.)Tj +/TT1 1 Tf +0 -1.79 TD +(package com.abien.xray.http;)Tj +T* +(public class RESTClient {)Tj +0 -1.79 TD +( //\205)Tj +ET + +endstream +endobj +68 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 69 0 R>>endobj +69 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(25)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( public static final String PATH = "/x-ray/resources/hits";)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +(//\205)Tj +0 -1.79 TD +( Socket socket = new Socket\(inetAddress, port\);)Tj +T* +( BufferedWriter wr = new BufferedWriter\(new OutputStreamWriter)Tj +0 -0.99 TD +(\(socket.getOutputStream\(\), "UTF8"\)\);)Tj +0 -1.79 TD +( wr.write\(\223PUT " + path + " HTTP/1.0\\r\\n"\);)Tj +T* +( wr.write\("Content-Length: " + content.length\(\) + "\\r\\n"\);)Tj +T* +( wr.write\("Content-Type: text/plain\\r\\n"\);)Tj +T* +( wr.write\("\\r\\n"\);)Tj +T* +( wr.write\(content\);)Tj +T* +( wr.flush\(\);)Tj +T* +(//\205 consumer response)Tj +T* +( wr.close\(\);)Tj +T* +( //\205)Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 9: Plain Soc)Tj +8.153 0 Td +(ket Implementation of the HTTP POST)Tj +-6.353 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.615 0 Td +(plain )Tj +2.727 0 Td +(soc)Tj +1.427 0 Td +(ket )Tj +1.837 0 Td +(implementation )Tj +7.339 0 Td +(should )Tj +3.45 0 Td +(meet )Tj +2.67 0 Td +(our )Tj +2.004 0 Td +(requirements. )Tj +6.449 0 Td +(Furthermore)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.087 0 Td +(it )Tj +1.115 0 Td +(can )Tj +2.115 0 Td +(be )Tj +-41.144 -1.44 Td +(extended )Tj +4.44 0 Td +(easily)Tj +2.353 0 Td +(, )Tj +0.772 0 Td +(for )Tj +1.661 0 Td +(example, )Tj +4.439 0 Td +(with )Tj +2.384 0 Td +(soc)Tj +1.427 0 Td +(ket )Tj +1.772 0 Td +(pooling)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.024 0 Td +(to )Tj +1.328 0 Td +(satisfy )Tj +3.106 0 Td +(future )Tj +2.995 0 Td +(scalability )Tj +4.829 0 Td +(needs. )Tj +3.273 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.994 0 Td +(is )Tj +-41.533 -1.44 Td +(m)Tj +0.866 0 Td +(e)Tj +0.533 0 Td +(a)Tj +0.533 0 Td +(n)Tj +0.589 0 Td +(t )Tj +1.072 0 Td +(t)Tj +0.311 0 Td +(o )Tj +1.35 0 Td +(b)Tj +0.589 0 Td +(e )Tj +1.294 0 Td +(d)Tj +0.589 0 Td +(e)Tj +0.533 0 Td +(s)Tj +0.422 0 Td +(i)Tj +0.311 0 Td +(g)Tj +0.533 0 Td +(n)Tj +0.589 0 Td +(e)Tj +0.533 0 Td +(d )Tj +1.35 0 Td +(a)Tj +0.533 0 Td +(c)Tj +0.533 0 Td +(c)Tj +0.533 0 Td +(o)Tj +0.589 0 Td +(r)Tj +0.366 0 Td +(d)Tj +0.589 0 Td +(i)Tj +0.311 0 Td +(n)Tj +0.589 0 Td +(g )Tj +1.294 0 Td +(t)Tj +0.311 0 Td +(o )Tj +1.35 0 Td +(t)Tj +0.311 0 Td +(h)Tj +0.589 0 Td +(e )Tj +1.294 0 Td +(K)Tj +0.644 0 Td +(I)Tj +0.311 0 Td +(S)Tj +0.533 0 Td +(S )Tj +1.294 0 Td +(p)Tj +0.589 0 Td +(r)Tj +0.366 0 Td +(i)Tj +0.311 0 Td +(n)Tj +0.589 0 Td +(c)Tj +0.533 0 Td +(i)Tj +0.311 0 Td +(p)Tj +0.589 0 Td +(l)Tj +0.311 0 Td +(e )Tj +1.294 0 Td +(\()Tj +0.311 0 Td +(h)Tj +0.589 0 Td +(t)Tj +0.311 0 Td +(t)Tj +0.311 0 Td +(p)Tj +0.589 0 Td +(:)Tj +0.311 0 Td +(/)Tj +0.311 0 Td +(/)Tj +0.311 0 Td +(e)Tj +0.533 0 Td +(n)Tj +0.589 0 Td +(.)Tj +0.311 0 Td +(w)Tj +0.811 0 Td +(i)Tj +0.311 0 Td +(k)Tj +0.533 0 Td +(i)Tj +0.311 0 Td +(p)Tj +0.589 0 Td +(e)Tj +0.533 0 Td +(d)Tj +0.589 0 Td +(i)Tj +0.311 0 Td +(a)Tj +0.533 0 Td +(.)Tj +0.311 0 Td +(o)Tj +0.589 0 Td +(r)Tj +0.366 0 Td +(g)Tj +0.533 0 Td +(/)Tj +0.311 0 Td +(w)Tj +0.811 0 Td +(i)Tj +0.311 0 Td +(k)Tj +0.533 0 Td +(i)Tj +0.311 0 Td +(/)Tj +-41.922 -1.44 Td +(KISS_principle)Tj +(\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +7.441 0 Td +(so )Tj +1.634 0 Td +(there )Tj +2.856 0 Td +(is )Tj +1.356 0 Td +(no )Tj +1.801 0 Td +(premature )Tj +5.078 0 Td +(optimization )Tj +6.136 0 Td +(of )Tj +1.523 0 Td +(the )Tj +2.023 0 Td +(design, )Tj +3.746 0 Td +(implementation)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +7.719 0 Td +(or )Tj +-41.311 -1.44 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitecture. )Tj +0.497 -2.24 Td +(It )Tj +1.203 0 Td +(turned )Tj +3.426 0 Td +(out )Tj +2.037 0 Td +(that )Tj +2.259 0 Td +(the )Tj +1.981 0 Td +(simplistic )Tj +4.704 0 Td +(soc)Tj +1.427 0 Td +(ket )Tj +1.925 0 Td +(implementation )Tj +7.427 0 Td +(sho)Tj +1.489 0 Td +(wn )Tj +1.981 0 Td +(in )Tj +1.481 0 Td +(Listing )Tj +3.426 0 Td +(9 )Tj +1.203 0 Td +(went )Tj +2.759 0 Td +(into)Tj +( )Tj +-40.532 -1.44 Td +(production )Tj +5.026 0 Td +(without )Tj +3.581 0 Td +(an)Tj +1.038 0 Td +(y )Tj +/C2_0 1 Tf +0.801 0 Td +<00450047003C0041005D>Tj +/TT0 1 Tf +(cations. )Tj +6.415 0 Td +(It )Tj +0.857 0 Td +(is )Tj +0.968 0 Td +(more )Tj +2.523 0 Td +(than )Tj +2.191 0 Td +(good )Tj +2.469 0 Td +(enough. )Tj +3.803 0 Td +(In )Tj +1.135 0 Td +(the )Tj +1.635 0 Td +(majority )Tj +3.857 0 Td +(of )Tj +1.135 0 Td +(all )Tj +1.357 0 Td +(cases, )Tj +2.857 0 Td +(it)Tj +( )Tj +-41.644 -1.44 Td +(is )Tj +0.967 0 Td +(faster )Tj +2.578 0 Td +(than )Tj +2.19 0 Td +(1 )Tj +0.856 0 Td +(ms )Tj +1.522 0 Td +(and )Tj +1.912 0 Td +(in )Tj +1.134 0 Td +(the )Tj +1.634 0 Td +(w)Tj +0.766 0 Td +(orst )Tj +1.856 0 Td +(case )Tj +2.189 0 Td +(it )Tj +0.856 0 Td +(takes )Tj +2.467 0 Td +(10ms. )Tj +2.912 0 Td +(In )Tj +1.134 0 Td +(comparison)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.607 0 Td +(the )Tj +1.634 0 Td +(request )Tj +3.412 0 Td +(performance )Tj +5.745 0 Td +(of )Tj +-41.366 -1.44 Td +(the Roller softw)Tj +6.707 0 Td +(are v)Tj +2.087 0 Td +(aried from 10 ms to 13 seconds.)Tj +-6.994 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.428 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.778 0 Td +(-side )Tj +2.428 0 Td +(counterpart )Tj +5.318 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.261 0 Td +(far )Tj +1.483 0 Td +(easier )Tj +2.872 0 Td +(to )Tj +1.206 0 Td +(implement. )Tj +5.225 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.484 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.872 0 Td +(EE )Tj +1.372 0 Td +(6 )Tj +0.928 0 Td +(and )Tj +1.984 0 Td +(J)Tj +0.26 0 Td +(AX-RS)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.344 0 Td +(it )Tj +0.928 0 Td +(boils )Tj +-40.143 -1.44 Td +(do)Tj +1.1 0 Td +(wn to a few annotations \(see Listing 10\).)Tj +/TT3 1 Tf +-1.1 -1.79 Td +(@Path\("hits"\))Tj +/TT1 1 Tf +0 -1.79 TD +(@Interceptors\(PerformanceAuditor.class\))Tj +T* +(@Stateless)Tj +T* +(public class HitsResource {)Tj +3.6 -1.79 Td +(//...)Tj +/TT3 1 Tf +-3.6 -1.79 Td +( @POST)Tj +T* +( @Consumes\({MediaType.TEXT_PLAIN}\))Tj +ET + +endstream +endobj +70 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 72 0 R>>endobj +71 0 obj<>endobj +72 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(26)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( public Response updateStatistics\(String url\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( if \(!isEmpty\(url\)\) {)Tj +0 -1.79 TD +( processURL\(url\);)Tj +T* +( })Tj +T* +( return Response.ok\(\).build\(\);)Tj +T* +( })Tj +T* +( //...)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 10: )Tj +4.651 0 Td +(T)Tj +0.511 0 Td +(he Serv)Tj +3.155 0 Td +(er)Tj +0.778 0 Td +(-Side POST)Tj +4.779 0 Td +(-Consuming Method)Tj +-12.074 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.504 0 Td +(@Stateless)Tj +/TT0 1 Tf +( )Tj +6.449 0 Td +(annotation )Tj +5.062 0 Td +(tr)Tj +0.599 0 Td +(ansforms )Tj +4.282 0 Td +(a )Tj +0.949 0 Td +(POJO )Tj +2.949 0 Td +(into )Tj +2.117 0 Td +(an )Tj +1.504 0 Td +(EJB )Tj +1.837 0 Td +(3.1 )Tj +1.839 0 Td +(bean. )Tj +2.839 0 Td +(EJB )Tj +1.837 0 Td +(3.1 )Tj +1.839 0 Td +(beans )Tj +2.95 0 Td +(are )Tj +-40.867 -1.44 Td +(especially )Tj +4.679 0 Td +(interesting )Tj +4.846 0 Td +(for )Tj +1.567 0 Td +(the )Tj +1.734 0 Td +(realization )Tj +4.957 0 Td +(of )Tj +1.234 0 Td +(a )Tj +0.9 0 Td +(REST )Tj +2.567 0 Td +(entry )Tj +2.567 0 Td +(point. )Tj +2.828 0 Td +(T)Tj +0.511 0 Td +(hey )Tj +1.956 0 Td +(are )Tj +1.733 0 Td +(thread-safe, )Tj +5.401 0 Td +(monitored, )Tj +-37.476 -1.44 Td +(p)Tj +0.576 0 Td +(o)Tj +0.576 0 Td +(o)Tj +0.576 0 Td +(l)Tj +0.298 0 Td +(e)Tj +0.52 0 Td +(d)Tj +/TT2 1 Tf +0.576 0 Td +(,)Tj +/TT0 1 Tf +( )Tj +1.038 0 Td +(a)Tj +0.52 0 Td +(n)Tj +0.576 0 Td +(d )Tj +1.344 0 Td +(t)Tj +0.298 0 Td +(r)Tj +0.341 0 Td +(a)Tj +0.52 0 Td +(n)Tj +0.576 0 Td +(s)Tj +0.409 0 Td +(a)Tj +0.52 0 Td +(c)Tj +0.52 0 Td +(t)Tj +0.298 0 Td +(i)Tj +0.298 0 Td +(o)Tj +0.576 0 Td +(n)Tj +0.576 0 Td +(a)Tj +0.52 0 Td +(l)Tj +0.298 0 Td +(. )Tj +0.992 0 Td +(T)Tj +0.502 0 Td +(r)Tj +0.341 0 Td +(a)Tj +0.52 0 Td +(n)Tj +0.576 0 Td +(s)Tj +0.409 0 Td +(a)Tj +0.52 0 Td +(c)Tj +0.52 0 Td +(t)Tj +0.298 0 Td +(i)Tj +0.298 0 Td +(o)Tj +0.576 0 Td +(n)Tj +0.576 0 Td +(s )Tj +1.177 0 Td +(a)Tj +0.52 0 Td +(r)Tj +0.353 0 Td +(e )Tj +1.288 0 Td +(t)Tj +0.298 0 Td +(h)Tj +0.576 0 Td +(e )Tj +1.288 0 Td +(m)Tj +0.853 0 Td +(o)Tj +0.576 0 Td +(s)Tj +0.409 0 Td +(t )Tj +1.066 0 Td +(i)Tj +0.298 0 Td +(n)Tj +0.576 0 Td +(t)Tj +0.298 0 Td +(e)Tj +0.52 0 Td +(r)Tj +0.353 0 Td +(e)Tj +0.52 0 Td +(s)Tj +0.409 0 Td +(t)Tj +0.298 0 Td +(i)Tj +0.298 0 Td +(n)Tj +0.576 0 Td +(g )Tj +1.288 0 Td +(f)Tj +0.298 0 Td +(e)Tj +0.52 0 Td +(a)Tj +0.52 0 Td +(t)Tj +0.298 0 Td +(u)Tj +0.576 0 Td +(r)Tj +0.353 0 Td +(e)Tj +0.52 0 Td +(. )Tj +0.992 0 Td +(T)Tj +0.531 0 Td +(h)Tj +0.576 0 Td +(e )Tj +1.288 0 Td +(m)Tj +0.853 0 Td +(e)Tj +0.52 0 Td +(t)Tj +0.298 0 Td +(h)Tj +0.576 0 Td +(o)Tj +0.576 0 Td +(d)Tj +( )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +9.991 0 Td +(starts )Tj +2.556 0 Td +(and )Tj +2.001 0 Td +(commits )Tj +4.056 0 Td +(a )Tj +0.889 0 Td +(new )Tj +2.223 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.815 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansaction )Tj +4.465 0 Td +(API )Tj +1.89 0 Td +(\(JT)Tj +1.038 0 Td +(A\) )Tj +1.334 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.502 0 Td +(on )Tj +1.501 0 Td +(ev)Tj +0.988 0 Td +(ery)Tj +( )Tj +-40.867 -1.44 Td +(request. )Tj +3.824 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.564 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.621 0 Td +(is )Tj +1.175 0 Td +(tr)Tj +0.599 0 Td +(ansparently )Tj +5.454 0 Td +(propagated )Tj +5.343 0 Td +(to )Tj +1.342 0 Td +(the )Tj +1.842 0 Td +(bac)Tj +1.538 0 Td +(k)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(end )Tj +2.953 0 Td +(services. )Tj +4.138 0 Td +(As )Tj +1.564 0 Td +(long )Tj +2.398 0 Td +(as )Tj +1.397 0 Td +(the )Tj +-40.866 -1.44 Td +(request )Tj +3.483 0 Td +(is )Tj +1.038 0 Td +(propagated )Tj +5.206 0 Td +(sync)Tj +1.927 0 Td +(hronously)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.901 0 Td +(it )Tj +0.927 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.649 0 Td +(matter )Tj +3.093 0 Td +(w)Tj +0.76 0 Td +(hether )Tj +3.094 0 Td +(it )Tj +0.927 0 Td +(is )Tj +1.038 0 Td +(processed )Tj +4.65 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.871 0 Td +(EJB )Tj +1.76 0 Td +(3.1 )Tj +1.761 0 Td +(beans, )Tj +-39.421 -1.44 Td +(POJOs)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.455 0 Td +(or )Tj +1.205 0 Td +(CDI )Tj +2.039 0 Td +(managed )Tj +4.261 0 Td +(beans. )Tj +3.021 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.372 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.429 0 Td +(is )Tj +0.983 0 Td +(tr)Tj +0.599 0 Td +(ansparently )Tj +5.262 0 Td +(passed )Tj +3.206 0 Td +(to )Tj +1.15 0 Td +(all )Tj +1.372 0 Td +(participants )Tj +5.318 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +-40.088 -1.44 Td +(from the )Tj +/TT1 1 Tf +(updateStatistics)Tj +/TT0 1 Tf +( method. )Tj +1.8 -2.24 Td +(EJB )Tj +1.729 0 Td +(beans, )Tj +3.119 0 Td +(as )Tj +1.229 0 Td +(well )Tj +2.174 0 Td +(as )Tj +1.229 0 Td +(CDI )Tj +2.063 0 Td +(managed )Tj +4.285 0 Td +(beans, )Tj +3.119 0 Td +(can )Tj +1.896 0 Td +(be )Tj +1.396 0 Td +(decor)Tj +2.433 0 Td +(ated )Tj +2.174 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.84 0 Td +(inter)Tj +1.933 0 Td +(ceptors )Tj +3.452 0 Td +(\(see )Tj +2.007 0 Td +(Listing )Tj +3.119 0 Td +(11\). )Tj +-40.532 -1.44 Td +(An )Tj +1.733 0 Td +(inter)Tj +1.933 0 Td +(ceptor )Tj +3.233 0 Td +(is )Tj +1.177 0 Td +(suitable )Tj +3.845 0 Td +(for )Tj +1.677 0 Td +(the )Tj +1.844 0 Td +(implementation )Tj +7.29 0 Td +(of )Tj +1.344 0 Td +(cross-cutting )Tj +5.956 0 Td +(concerns. )Tj +4.678 0 Td +(It )Tj +1.066 0 Td +(is )Tj +1.177 0 Td +(similar )Tj +3.399 0 Td +(to )Tj +1.344 0 Td +(a )Tj +-41.7 -1.44 Td +(d)Tj +0.532 0 Td +(ynamic )Tj +3.731 0 Td +(proxy)Tj +2.353 0 Td +(, )Tj +0.842 0 Td +(w)Tj +0.76 0 Td +(hereb)Tj +2.427 0 Td +(y )Tj +1.064 0 Td +(the )Tj +1.898 0 Td +(container )Tj +4.621 0 Td +(realizes )Tj +3.842 0 Td +(the )Tj +1.898 0 Td +(tr)Tj +0.599 0 Td +(ansparent )Tj +4.732 0 Td +(\223injection\224 )Tj +5.232 0 Td +(of )Tj +1.398 0 Td +(an )Tj +1.62 0 Td +(inter)Tj +1.933 0 Td +(ceptor )Tj +-39.477 -1.44 Td +(between the consumer and the pro)Tj +14.994 0 Td +(vider)Tj +2.093 0 Td +(. )Tj +/TT1 1 Tf +-17.087 -1.79 Td +(public class PerformanceAuditor {)Tj +0 -1.79 TD +( private static final Logger LOG = Logger.getLogger)Tj +0 -0.99 TD +(\(PerformanceAuditor.class.getName\(\)\);)Tj +/TT3 1 Tf +0 -1.79 TD +( @AroundTimeout)Tj +T* +( @AroundInvoke)Tj +/TT1 1 Tf +T* +( public Object measurePerformance\(InvocationContext context\) throws\ )Tj +0 -0.99 TD +(Exception{)Tj +0 -1.79 TD +( String methodName = context.getMethod\(\).toString\(\);)Tj +T* +( long start = System.currentTimeMillis\(\);)Tj +T* +( try{)Tj +0 -1.79 TD +( return context.proceed\(\);)Tj +0 -1.79 TD +( }catch\(Exception e\){)Tj +0 -1.79 TD +( LOG.log\(Level.SEVERE, "!!!During invocation of: {0} )Tj +ET + +endstream +endobj +73 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 74 0 R>>endobj +74 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(27)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +(exception occured: {1}", new Object[]{methodName,e}\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( throw e;)Tj +0 -1.79 TD +( }finally{)Tj +T* +( LOG.log\(Level.INFO, "{0} performed in: {1}", new Object[])Tj +0 -0.99 TD +({methodName, \(System.currentTimeMillis\(\) - start\)}\);)Tj +0 -1.79 TD +( })Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 11: P)Tj +5.236 0 Td +(erformance Inter)Tj +7.1 0 Td +(ceptor)Tj +2.649 0 Td +(.)Tj +-13.185 -2.24 Td +(A)Tj +0.782 0 Td +(n )Tj +1.391 0 Td +(i)Tj +0.393 0 Td +(n)Tj +0.671 0 Td +(t)Tj +0.393 0 Td +(e)Tj +0.615 0 Td +(r)Tj +0.436 0 Td +(c)Tj +0.615 0 Td +(e)Tj +0.615 0 Td +(p)Tj +0.671 0 Td +(t)Tj +0.393 0 Td +(o)Tj +0.671 0 Td +(r )Tj +1.168 0 Td +(i)Tj +0.393 0 Td +(s )Tj +1.224 0 Td +(a)Tj +0.615 0 Td +(c)Tj +0.615 0 Td +(t)Tj +0.393 0 Td +(i)Tj +0.375 0 Td +(v)Tj +0.591 0 Td +(a)Tj +0.615 0 Td +(t)Tj +0.393 0 Td +(e)Tj +0.615 0 Td +(d )Tj +1.391 0 Td +(w)Tj +0.893 0 Td +(i)Tj +0.393 0 Td +(t)Tj +0.393 0 Td +(h )Tj +1.391 0 Td +(a )Tj +1.335 0 Td +(s)Tj +0.504 0 Td +(i)Tj +0.393 0 Td +(n)Tj +0.671 0 Td +(g)Tj +0.615 0 Td +(l)Tj +0.393 0 Td +(e )Tj +1.335 0 Td +(a)Tj +0.615 0 Td +(n)Tj +0.671 0 Td +(n)Tj +0.671 0 Td +(o)Tj +0.671 0 Td +(t)Tj +0.393 0 Td +(a)Tj +0.615 0 Td +(t)Tj +0.393 0 Td +(i)Tj +0.393 0 Td +(o)Tj +0.671 0 Td +(n)Tj +0.671 0 Td +(: )Tj +/TT1 1 Tf +1.113 0 Td +(@)Tj +0.715 0 Td +(I)Tj +0.715 0 Td +(n)Tj +0.715 0 Td +(t)Tj +0.715 0 Td +(e)Tj +0.715 0 Td +(r)Tj +0.715 0 Td +(c)Tj +0.715 0 Td +(e)Tj +0.715 0 Td +(p)Tj +0.715 0 Td +(t)Tj +0.715 0 Td +(o)Tj +0.715 0 Td +(r)Tj +0.715 0 Td +(s)Tj +-41.6 -1.44 Td +(\(PerformanceAuditor.class\))Tj +/TT0 1 Tf +( )Tj +16.097 0 Td +(\(see )Tj +2.162 0 Td +(Listing )Tj +3.274 0 Td +(10\). )Tj +2.163 0 Td +(Inter)Tj +1.933 0 Td +(ceptor )Tj +/C2_0 1 Tf +3.218 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.663 0 Td +(also )Tj +2.218 0 Td +(w)Tj +0.766 0 Td +(orks )Tj +2.273 0 Td +(with )Tj +-40.31 -1.44 Td +(respect )Tj +3.362 0 Td +(to )Tj +1.14 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.03 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.139 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation. )Tj +2.715 0 Td +(A )Tj +0.973 0 Td +(declar)Tj +2.655 0 Td +(ation )Tj +2.474 0 Td +(at )Tj +1.084 0 Td +(the )Tj +1.64 0 Td +(class )Tj +2.362 0 Td +(lev)Tj +1.266 0 Td +(el )Tj +1.084 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.476 0 Td +(ates )Tj +1.973 0 Td +(the )Tj +1.64 0 Td +(inter)Tj +1.933 0 Td +(ceptor)Tj +( )Tj +-39.477 -1.44 Td +(for )Tj +1.694 0 Td +(all )Tj +1.583 0 Td +(methods )Tj +4.195 0 Td +(of )Tj +1.361 0 Td +(the )Tj +1.861 0 Td +(class. )Tj +2.769 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.639 0 Td +(can )Tj +2.083 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erride )Tj +3.027 0 Td +(this )Tj +2.028 0 Td +(global )Tj +3.195 0 Td +(class )Tj +/C2_0 1 Tf +2.583 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.695 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.027 0 Td +(putting )Tj +3.529 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(@)Tj +0.84 0 Td +(I)Tj +0.84 0 Td +(n)Tj +0.84 0 Td +(t)Tj +0.84 0 Td +(e)Tj +0.84 0 Td +(r)Tj +0.84 0 Td +(c)Tj +0.84 0 Td +(e)Tj +0.84 0 Td +(p)Tj +0.84 0 Td +(t)Tj +0.84 0 Td +(o)Tj +0.84 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.498 0 Td +(a)Tj +0.74 0 Td +(n)Tj +0.796 0 Td +(n)Tj +0.796 0 Td +(o)Tj +0.796 0 Td +(t)Tj +0.518 0 Td +(a)Tj +0.74 0 Td +(t)Tj +0.518 0 Td +(i)Tj +0.518 0 Td +(o)Tj +0.796 0 Td +(n )Tj +1.454 0 Td +(o)Tj +0.796 0 Td +(n )Tj +1.454 0 Td +(m)Tj +1.073 0 Td +(e)Tj +0.74 0 Td +(t)Tj +0.518 0 Td +(h)Tj +0.796 0 Td +(o)Tj +0.796 0 Td +(d)Tj +0.796 0 Td +(s )Tj +1.287 0 Td +(o)Tj +0.796 0 Td +(r )Tj +1.231 0 Td +(b)Tj +0.778 0 Td +(y )Tj +1.398 0 Td +(e)Tj +0.74 0 Td +(x)Tj +0.74 0 Td +(c)Tj +0.74 0 Td +(l)Tj +0.518 0 Td +(u)Tj +0.796 0 Td +(d)Tj +0.796 0 Td +(i)Tj +0.518 0 Td +(n)Tj +0.796 0 Td +(g )Tj +1.398 0 Td +(i)Tj +0.518 0 Td +(t )Tj +1.176 0 Td +(w)Tj +1.018 0 Td +(i)Tj +0.518 0 Td +(t)Tj +0.518 0 Td +(h )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(@ExcludeClassInterceptors)Tj +/TT0 1 Tf +( or )Tj +/TT1 1 Tf +(@ExcludeDefaultInterceptors)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.356 0 Td +(PerformanceAuditor)Tj +/TT0 1 Tf +( )Tj +11.102 0 Td +(measures )Tj +4.3 0 Td +(the )Tj +1.634 0 Td +(performance )Tj +5.745 0 Td +(of )Tj +1.134 0 Td +(all )Tj +1.356 0 Td +(method )Tj +3.579 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocations )Tj +3.913 0 Td +(and )Tj +1.912 0 Td +(writes )Tj +-39.644 -1.44 Td +(the )Tj +2.002 0 Td +(performance )Tj +6.113 0 Td +(results )Tj +3.391 0 Td +(to )Tj +1.502 0 Td +(a )Tj +1.168 0 Td +(log )Tj +/C2_0 1 Tf +2.002 0 Td +<005D>Tj +/TT0 1 Tf +(le. )Tj +2.28 0 Td +(P)Tj +0.511 0 Td +(erformance )Tj +5.557 0 Td +(measurement )Tj +6.446 0 Td +(of )Tj +1.502 0 Td +(the )Tj +2.002 0 Td +(entry )Tj +2.835 0 Td +(points )Tj +3.281 0 Td +(\(the )Tj +-40.588 -1.44 Td +(boundaries\) )Tj +5.521 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(es )Tj +1.352 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.575 0 Td +(an )Tj +1.519 0 Td +(idea )Tj +2.297 0 Td +(about )Tj +2.909 0 Td +(the )Tj +1.797 0 Td +(actual )Tj +3.075 0 Td +(system )Tj +3.352 0 Td +(performance )Tj +5.908 0 Td +(and )Tj +2.075 0 Td +(pro)Tj +1.433 0 Td +(vides )Tj +2.686 0 Td +(hints )Tj +2.52 0 Td +(about )Tj +-39.754 -1.44 Td +(optimization candidates.)Tj +ET + +endstream +endobj +75 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 76 0 R>>endobj +76 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(28)Tj +ET + +endstream +endobj +77 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 79 0 R>>endobj +78 0 obj<>endobj +79 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(29)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +(X-r)Tj +1.321 0 Td +(a)Tj +0.47 0 Td +(y Probe)Tj +64 0 0 64 443.416 539.8 Tm +(3)Tj +/TT0 1 Tf +10 0 0 10 75 461.4 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.651 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.095 0 Td +(probe )Tj +3.096 0 Td +(is )Tj +1.262 0 Td +(the )Tj +1.929 0 Td +(proxy )Tj +3.04 0 Td +(\223injected\224 )Tj +4.929 0 Td +(into )Tj +2.263 0 Td +(the )Tj +1.929 0 Td +(Roller )Tj +3.151 0 Td +(application, )Tj +5.709 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.151 0 Td +(gathers )Tj +3.651 0 Td +(the )Tj +-40.866 -1.44 Td +(metadata )Tj +4.235 0 Td +(of )Tj +1.124 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.846 0 Td +(request )Tj +3.402 0 Td +(and )Tj +1.902 0 Td +(passes )Tj +3.013 0 Td +(it )Tj +0.846 0 Td +(to )Tj +1.124 0 Td +(the )Tj +1.624 0 Td +(actual )Tj +2.902 0 Td +(x)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.79 0 Td +(application. )Tj +5.404 0 Td +(Because )Tj +3.846 0 Td +(the )Tj +1.624 0 Td +(probe )Tj +2.791 0 Td +(needs )Tj +2.791 0 Td +(to )Tj +-41.366 -1.44 Td +(be pac)Tj +2.872 0 Td +(kaged with the Roller application, it has to be as non-intrusi)Tj +25.661 0 Td +(v)Tj +0.488 0 Td +(e as possible.)Tj +/TT1 1 Tf +12 0 0 12 57 396.2 Tm +(Dinosaur Infr)Tj +5.861 0 Td +(astructure)Tj +/TT0 1 Tf +10 0 0 10 75 373.8 Tm +(Roller )Tj +3.149 0 Td +(4 )Tj +1.149 0 Td +(is )Tj +1.26 0 Td +(a )Tj +1.093 0 Td +(J2EE )Tj +2.427 0 Td +(1.4 )Tj +1.983 0 Td +(application, )Tj +5.707 0 Td +(pimped )Tj +3.872 0 Td +(up )Tj +1.705 0 Td +(with )Tj +2.483 0 Td +(Spring. )Tj +3.52 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT3 1 Tf +1.649 0 Td +(web.xml)Tj +/TT0 1 Tf +( )Tj +4.793 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +-39.533 -1.44 Td +(descriptor )Tj +4.744 0 Td +(is )Tj +1.132 0 Td +(declared )Tj +4.188 0 Td +(as )Tj +/TT3 1 Tf +1.354 0 Td +(http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd)Tj +/TT0 1 Tf +(. )Tj +28.948 0 Td +(J2EE )Tj +-40.366 -1.44 Td +(is )Tj +1.068 0 Td +(more )Tj +2.623 0 Td +(than )Tj +2.291 0 Td +(7 )Tj +0.957 0 Td +(y)Tj +0.482 0 Td +(ears )Tj +2.123 0 Td +(old )Tj +1.791 0 Td +(and )Tj +2.013 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.29 0 Td +(designed )Tj +4.236 0 Td +(for )Tj +1.568 0 Td +(JDK )Tj +2.068 0 Td +(1.4. )Tj +2.032 0 Td +(Annotations )Tj +5.571 0 Td +(were )Tj +2.512 0 Td +(not )Tj +1.791 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.291 0 Td +(at )Tj +1.179 0 Td +(that)Tj +( )Tj +-40.588 -1.44 Td +(time, )Tj +2.457 0 Td +(and )Tj +1.902 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.79 0 Td +(injection )Tj +4.07 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.179 0 Td +(only )Tj +2.18 0 Td +(possible )Tj +3.792 0 Td +(with )Tj +2.18 0 Td +(third-party )Tj +4.791 0 Td +(fr)Tj +0.599 0 Td +(amew)Tj +2.599 0 Td +(orks )Tj +2.068 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.846 0 Td +(as )Tj +1.179 0 Td +(Spring )Tj +3.013 0 Td +(and )Tj +-40.588 -1.44 Td +(XML; )Tj +2.863 0 Td +(the )Tj +/C2_0 1 Tf +1.919 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.753 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.474 0 Td +(sometimes )Tj +5.141 0 Td +(longer )Tj +3.308 0 Td +(than )Tj +2.475 0 Td +(the )Tj +1.919 0 Td +(actual )Tj +3.197 0 Td +(code. )Tj +2.975 0 Td +(Because )Tj +4.141 0 Td +(of )Tj +1.419 0 Td +(the )Tj +1.919 0 Td +(dated )Tj +-39.81 -1.44 Td +(infr)Tj +1.433 0 Td +(astructure, )Tj +4.79 0 Td +(the )Tj +1.623 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.789 0 Td +(probe )Tj +2.79 0 Td +(had )Tj +1.901 0 Td +(to )Tj +1.123 0 Td +(be )Tj +1.345 0 Td +(implemented )Tj +5.957 0 Td +(as )Tj +1.178 0 Td +(a )Tj +0.789 0 Td +(J2EE )Tj +2.123 0 Td +(1.4 )Tj +1.679 0 Td +(application. )Tj +5.329 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.345 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.789 0 Td +(probe )Tj +2.79 0 Td +(is )Tj +-41.533 -1.44 Td +(a )Tj +0.869 0 Td +(typical )Tj +3.259 0 Td +(proxy)Tj +2.353 0 Td +(, )Tj +0.647 0 Td +(so )Tj +1.314 0 Td +(it )Tj +0.925 0 Td +(is )Tj +1.036 0 Td +(not )Tj +1.759 0 Td +(supposed )Tj +4.427 0 Td +(to )Tj +1.203 0 Td +(implement )Tj +4.981 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.869 0 Td +(business )Tj +3.982 0 Td +(logic )Tj +2.481 0 Td +(and )Tj +1.981 0 Td +(it )Tj +0.925 0 Td +(just )Tj +1.87 0 Td +(communicates)Tj +( )Tj +-35.921 -1.44 Td +(with the bac)Tj +5.318 0 Td +(kend.)Tj +/C2_1 1 Tf +12 0 0 12 57 236.6001 Tm +<002E0023002200010019003E003D004C>Tj +/TT1 1 Tf +(gur)Tj +6.101 0 Td +(ation\227A Dinosaur Use Case)Tj +/TT0 1 Tf +10 0 0 10 75 214.2001 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.335 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.779 0 Td +(probe )Tj +2.78 0 Td +(is )Tj +0.946 0 Td +(a )Tj +0.779 0 Td +(proxy )Tj +2.724 0 Td +(and )Tj +1.891 0 Td +(decor)Tj +2.433 0 Td +(ator )Tj +1.946 0 Td +(at )Tj +1.057 0 Td +(the )Tj +1.613 0 Td +(same )Tj +2.501 0 Td +(time. )Tj +2.446 0 Td +(It )Tj +0.835 0 Td +(uses )Tj +2.113 0 Td +(the )Tj +1.613 0 Td +(Decor)Tj +2.655 0 Td +(ating )Tj +2.391 0 Td +(F)Tj +0.482 0 Td +(ilter )Tj +1.946 0 Td +(pattern )Tj +-39.199 -1.44 Td +(and )Tj +1.925 0 Td +(an )Tj +1.369 0 Td +(implementation )Tj +7.093 0 Td +(of )Tj +1.147 0 Td +(the )Tj +/TT3 1 Tf +1.647 0 Td +(javax.servlet.Filter)Tj +/TT0 1 Tf +(, )Tj +12.593 0 Td +(in )Tj +1.147 0 Td +(particular)Tj +4.038 0 Td +(, )Tj +0.591 0 Td +(to )Tj +1.147 0 Td +(inter)Tj +1.933 0 Td +(cept )Tj +2.147 0 Td +(all )Tj +1.369 0 Td +(incoming )Tj +-38.143 -1.44 Td +(calls. )Tj +2.509 0 Td +(Because )Tj +3.842 0 Td +(of )Tj +1.12 0 Td +(the )Tj +1.62 0 Td +(lac)Tj +1.26 0 Td +(k )Tj +0.786 0 Td +(of )Tj +1.12 0 Td +(annotations, )Tj +5.567 0 Td +(the )Tj +/C2_0 1 Tf +1.62 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.231 0 Td +(has )Tj +1.731 0 Td +(to )Tj +1.12 0 Td +(be )Tj +1.342 0 Td +(declared )Tj +4.009 0 Td +(in )Tj +1.12 0 Td +(the )Tj +/TT3 1 Tf +1.62 0 Td +(web.xml)Tj +/TT0 1 Tf +( )Tj +4.486 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +-39.533 -1.44 Td +(descriptor in a J2EE 1.4-compliant w)Tj +15.655 0 Td +(a)Tj +0.47 0 Td +(y \(see Listing 12\).)Tj +/TT3 1 Tf +-16.125 -1.79 Td +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +( HTTPRequestInterceptor)Tj +0 -1.79 TD +( com.abien.xray.probe.http.HTTPRequestRESTInterceptor)Tj +ET + +endstream +endobj +80 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 81 0 R>>endobj +81 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(30)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( )Tj +/TT2 1 Tf +(serviceURL)Tj +/TT1 1 Tf +()Tj +0 -1.79 TD +( http://localhost:8080/x-ray/resources/hits)Tj +0 -1.79 TD +( )Tj +T* +()Tj +T* +()Tj +T* +( )Tj +T* +( HTTPRequestInterceptor)Tj +T* +( /*)Tj +T* +( )Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 12: F)Tj +5.207 0 Td +(ilter Declar)Tj +/C2_0 1 Tf +4.822 0 Td +<0039004C004100470046000100390046003C0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +8.048 0 Td +(ation in web.xml)Tj +-16.277 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +1.358 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.247 0 Td +(has )Tj +1.747 0 Td +(to )Tj +1.136 0 Td +(be )Tj +1.358 0 Td +(declared )Tj +/C2_0 1 Tf +4.025 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.858 0 Td +(and )Tj +1.914 0 Td +(then )Tj +2.192 0 Td +(it )Tj +0.858 0 Td +(is )Tj +0.969 0 Td +(mapped )Tj +3.803 0 Td +(to )Tj +1.136 0 Td +(a )Tj +0.802 0 Td +(URL. )Tj +2.469 0 Td +(In )Tj +1.136 0 Td +(J2EE )Tj +2.136 0 Td +(1.4)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.942 0 Td +(the )Tj +1.636 0 Td +(name )Tj +2.691 0 Td +(of )Tj +1.136 0 Td +(the )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.291 0 Td +(\()Tj +/TT1 1 Tf +(filter-name)Tj +/TT0 1 Tf +(\) )Tj +7.503 0 Td +(and )Tj +1.958 0 Td +(its )Tj +1.291 0 Td +(fully )Tj +/C2_0 1 Tf +2.236 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(ed )Tj +4.126 0 Td +(class )Tj +2.402 0 Td +(name )Tj +2.735 0 Td +(\()Tj +/TT1 1 Tf +(filter-class)Tj +/TT0 1 Tf +(\) )Tj +8.103 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.846 0 Td +(to )Tj +1.18 0 Td +(be )Tj +/C2_0 1 Tf +1.402 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +-37.587 -1.44 Td +(in )Tj +1.129 0 Td +(the )Tj +/TT1 1 Tf +1.629 0 Td +(web.xml)Tj +/TT0 1 Tf +( )Tj +4.496 0 Td +(descriptor)Tj +4.205 0 Td +(. )Tj +0.499 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.351 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.129 0 Td +(of )Tj +1.129 0 Td +(the )Tj +1.629 0 Td +(key )Tj +/TT1 1 Tf +1.795 0 Td +(serviceURL)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +6.296 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(nes )Tj +3.352 0 Td +(the )Tj +1.629 0 Td +(REST )Tj +2.462 0 Td +(endpoint )Tj +4.131 0 Td +(and )Tj +1.907 0 Td +(has )Tj +-40.755 -1.44 Td +(to )Tj +1.135 0 Td +(be )Tj +/C2_0 1 Tf +1.357 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +4.914 0 Td +(properly)Tj +3.52 0 Td +(. )Tj +0.505 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.357 0 Td +(key )Tj +/TT1 1 Tf +1.801 0 Td +(serviceURL)Tj +/TT0 1 Tf +( )Tj +6.302 0 Td +(is )Tj +0.968 0 Td +(the )Tj +1.635 0 Td +(only )Tj +/C2_0 1 Tf +2.191 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.469 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.245 0 Td +(that )Tj +1.913 0 Td +(is )Tj +0.968 0 Td +(w)Tj +0.766 0 Td +(orth )Tj +/C2_0 1 Tf +-40.477 -1.44 Td +<004B004C0047004A00410046003F00010041004600010039004600010034002900280001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +/C2_0 1 Tf +11.437 0 Td +<0039004C0041004700460001005D>Tj +/TT0 1 Tf +(le. )Tj +-9.637 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.451 0 Td +(remaining )Tj +4.729 0 Td +(metadata )Tj +4.34 0 Td +(can )Tj +1.951 0 Td +(be )Tj +1.451 0 Td +(easily )Tj +2.84 0 Td +(deri)Tj +1.649 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.451 0 Td +(directly )Tj +3.618 0 Td +(from )Tj +2.395 0 Td +(the )Tj +1.729 0 Td +(class, )Tj +2.729 0 Td +(so )Tj +1.34 0 Td +(the )Tj +/TT1 1 Tf +1.729 0 Td +(@WebFilter)Tj +/TT0 1 Tf +( )Tj +-36.199 -1.44 Td +(annotation )Tj +5.023 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.355 0 Td +(be )Tj +1.465 0 Td +(a )Tj +0.909 0 Td +(more )Tj +2.631 0 Td +(natur)Tj +2.211 0 Td +(al )Tj +1.187 0 Td +(place )Tj +2.743 0 Td +(to )Tj +1.243 0 Td +(declare )Tj +3.576 0 Td +(a )Tj +0.909 0 Td +(class )Tj +2.465 0 Td +(as )Tj +1.298 0 Td +(a )Tj +/C2_0 1 Tf +0.909 0 Td +<005D>Tj +/TT0 1 Tf +(lter)Tj +1.871 0 Td +(. )Tj +0.687 0 Td +(External )Tj +/C2_0 1 Tf +3.854 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ations)Tj +( )Tj +-39.643 -1.44 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.944 0 Td +(as )Tj +1.277 0 Td +(XML )Tj +/C2_0 1 Tf +2.388 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.111 0 Td +(introduce )Tj +4.501 0 Td +(additional )Tj +4.724 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +3.333 0 Td +(and )Tj +2 0 Td +(redundancies. )Tj +6.409 0 Td +(At )Tj +1.333 0 Td +(a )Tj +0.888 0 Td +(minimum, )Tj +4.833 0 Td +(the )Tj +1.722 0 Td +(binding )Tj +-38.92 -1.44 Td +(between )Tj +4.118 0 Td +(a )Tj +0.95 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(en )Tj +/C2_0 1 Tf +1.506 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.618 0 Td +(piece )Tj +2.784 0 Td +(in )Tj +1.284 0 Td +(XML )Tj +2.45 0 Td +(and )Tj +2.062 0 Td +(the )Tj +1.784 0 Td +(actual )Tj +3.062 0 Td +(class )Tj +2.506 0 Td +(needs )Tj +2.951 0 Td +(to )Tj +1.284 0 Td +(be )Tj +1.506 0 Td +(repeated. )Tj +4.451 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +-41.644 -1.44 Td +(duplication )Tj +5.215 0 Td +(can )Tj +1.879 0 Td +(cause )Tj +2.768 0 Td +(serious )Tj +3.324 0 Td +(trouble )Tj +3.38 0 Td +(during )Tj +3.102 0 Td +(refactoring )Tj +4.935 0 Td +(and )Tj +1.935 0 Td +(can )Tj +1.879 0 Td +(be )Tj +1.379 0 Td +(fully )Tj +2.213 0 Td +(eliminated )Tj +4.88 0 Td +(with )Tj +2.213 0 Td +(the )Tj +1.657 0 Td +(use )Tj +-40.755 -1.44 Td +(of annotations.)Tj +/TT4 1 Tf +12 0 0 12 57 233.5001 Tm +(Inter)Tj +2.099 0 Td +(cept and F)Tj +4.512 0 Td +(orw)Tj +1.705 0 Td +(ard)Tj +/TT0 1 Tf +10 0 0 10 75 211.1001 Tm +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +1.527 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.416 0 Td +(implementation )Tj +7.251 0 Td +(is )Tj +1.138 0 Td +(tri)Tj +0.871 0 Td +(vial. )Tj +2.231 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.527 0 Td +(\223business\224 )Tj +4.972 0 Td +(logic )Tj +2.583 0 Td +(is )Tj +1.138 0 Td +(implemented )Tj +6.139 0 Td +(in )Tj +1.305 0 Td +(a )Tj +0.971 0 Td +(single )Tj +2.972 0 Td +(class:)Tj +( )Tj +/TT1 1 Tf +-39.866 -1.44 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +(. )Tj +16.105 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.355 0 Td +(method )Tj +/TT1 1 Tf +3.578 0 Td +(doFilter)Tj +/TT0 1 Tf +( )Tj +5.099 0 Td +(implements )Tj +5.3 0 Td +(the )Tj +1.633 0 Td +(core )Tj +2.188 0 Td +(functionality)Tj +5.3 0 Td +(. )Tj +0.577 0 Td +(It )Tj +-41.644 -1.44 Td +(gathers )Tj +3.339 0 Td +(the )Tj +1.617 0 Td +(interesting )Tj +4.729 0 Td +(data, )Tj +2.395 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(okes )Tj +2.228 0 Td +(the )Tj +1.617 0 Td +(Roller )Tj +2.839 0 Td +(application)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.369 0 Td +(and )Tj +1.895 0 Td +(sends )Tj +2.673 0 Td +(the )Tj +1.617 0 Td +(data )Tj +2.117 0 Td +(after )Tj +2.172 0 Td +(the )Tj +1.617 0 Td +(request )Tj +3.395 0 Td +(via)Tj +( )Tj +-40.922 -1.44 Td +(HTTP to the bac)Tj +6.986 0 Td +(kend \(see Listing 13\).)Tj +/TT1 1 Tf +-6.986 -1.79 Td +(@Override)Tj +0 -1.79 TD +(public void doFilter\(ServletRequest request, ServletResponse response, \ )Tj +0 -0.99 TD +(FilterChain chain\) throws IOException, ServletException {)Tj +0 -1.79 TD +( HttpServletRequest httpServletRequest = \(HttpServletRequest\) )Tj +0 -0.99 TD +(request;)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 76.5 Tm +( )Tj +ET +Q + +endstream +endobj +82 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 84 0 R>>endobj +83 0 obj<>endobj +84 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(31)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( String uri = httpServletRequest.getRequestURI\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( String referer = httpServletRequest.getHeader\(REFERER\);)Tj +0 -1.79 TD +( )Tj +T* +( chain.doFilter\(request, response\);)Tj +T* +( )Tj +T* +( )Tj +/TT2 1 Tf +(sendAsync\(uri, referer\);)Tj +/TT1 1 Tf +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 13: Basic Functionality of the HTTPRequestRESTInter)Tj +25.833 0 Td +(ceptor)Tj +-24.033 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.552 0 Td +(method )Tj +/TT1 1 Tf +3.775 0 Td +(sendAsync)Tj +/TT0 1 Tf +( )Tj +5.897 0 Td +(is )Tj +1.163 0 Td +(responsible )Tj +5.387 0 Td +(for )Tj +1.663 0 Td +(the )Tj +1.83 0 Td +(\223putting\224 )Tj +4.386 0 Td +(of )Tj +1.33 0 Td +(the )Tj +1.83 0 Td +(URI )Tj +2.163 0 Td +(and )Tj +2.108 0 Td +(the )Tj +1.83 0 Td +(referer)Tj +2.703 0 Td +(. )Tj +0.7 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(method )Tj +3.665 0 Td +(name )Tj +2.775 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.885 0 Td +(implies )Tj +3.498 0 Td +(its )Tj +1.33 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +3.888 0 Td +(nature. )Tj +3.313 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.441 0 Td +(REST )Tj +2.553 0 Td +(communication )Tj +7.165 0 Td +(is )Tj +1.052 0 Td +(fast )Tj +1.83 0 Td +(enough )Tj +-38.976 -1.44 Td +(for )Tj +1.554 0 Td +(sync)Tj +1.927 0 Td +(hronous )Tj +3.889 0 Td +(communication. )Tj +7.408 0 Td +(An )Tj +1.61 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.887 0 Td +(call )Tj +1.943 0 Td +(takes )Tj +2.554 0 Td +(about )Tj +2.833 0 Td +(1 )Tj +0.943 0 Td +(ms, )Tj +1.887 0 Td +(and )Tj +1.999 0 Td +(w)Tj +0.766 0 Td +(orst )Tj +1.943 0 Td +(case )Tj +2.276 0 Td +(is )Tj +1.054 0 Td +(about )Tj +2.833 0 Td +(10)Tj +( )Tj +-41.088 -1.44 Td +(ms. )Tj +1.913 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.543 0 Td +(actual )Tj +3.099 0 Td +(performance )Tj +5.932 0 Td +(of )Tj +1.321 0 Td +(the )Tj +1.821 0 Td +(Roller )Tj +3.043 0 Td +(application )Tj +5.323 0 Td +(is )Tj +1.154 0 Td +(orders )Tj +3.154 0 Td +(of )Tj +1.321 0 Td +(magnitude )Tj +5.044 0 Td +(slo)Tj +1.211 0 Td +(wer )Tj +2.098 0 Td +(than )Tj +2.377 0 Td +(the )Tj +-40.866 -1.44 Td +(communication with x)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +10.38 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.519 0 Td +(A single blog request takes between 50 ms and a few seconds.)Tj +/TT4 1 Tf +12 0 0 12 57 391.5 Tm +(T)Tj +0.511 0 Td +(hreads for Robustness)Tj +/TT0 1 Tf +10 0 0 10 75 369.1 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.392 0 Td +(reason )Tj +3.17 0 Td +(for )Tj +1.503 0 Td +(c)Tj +0.482 0 Td +(hoosing )Tj +3.727 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +3.838 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.56 0 Td +(is )Tj +1.003 0 Td +(not )Tj +1.726 0 Td +(performance; )Tj +6.059 0 Td +(r)Tj +0.321 0 Td +(ather)Tj +2.093 0 Td +(, )Tj +0.614 0 Td +(it )Tj +0.892 0 Td +(is )Tj +1.003 0 Td +(robustness. )Tj +-37.42 -1.44 Td +(P)Tj +0.511 0 Td +(otential )Tj +3.571 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.847 0 Td +(bottlenec)Tj +3.984 0 Td +(ks )Tj +1.236 0 Td +(must )Tj +2.403 0 Td +(not )Tj +1.737 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.847 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.847 0 Td +(serious )Tj +3.348 0 Td +(impact )Tj +3.292 0 Td +(on )Tj +1.459 0 Td +(the )Tj +1.681 0 Td +(stability )Tj +3.682 0 Td +(and )Tj +1.959 0 Td +(performance )Tj +5.792 0 Td +(of )Tj +-41.366 -1.44 Td +(Roller)Tj +2.482 0 Td +(. )Tj +0.55 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.421 0 Td +(careful )Tj +3.254 0 Td +(exception )Tj +4.533 0 Td +(handling, )Tj +4.367 0 Td +(the )Tj +1.643 0 Td +(robustness )Tj +4.811 0 Td +(can )Tj +1.865 0 Td +(be )Tj +1.365 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(ed, )Tj +1.643 0 Td +(but )Tj +1.699 0 Td +(timeout )Tj +3.588 0 Td +(loc)Tj +1.316 0 Td +(ks )Tj +1.198 0 Td +(might )Tj +-39.755 -1.44 Td +(still )Tj +1.88 0 Td +(occur)Tj +2.371 0 Td +(. )Tj +0.583 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.435 0 Td +(soc)Tj +1.427 0 Td +(ket )Tj +1.657 0 Td +(communication )Tj +7.159 0 Td +(could )Tj +2.825 0 Td +(get )Tj +1.657 0 Td +(stuc)Tj +1.705 0 Td +(k )Tj +0.879 0 Td +(for )Tj +1.546 0 Td +(few )Tj +1.935 0 Td +(seconds )Tj +3.825 0 Td +(until )Tj +2.325 0 Td +(the )Tj +1.713 0 Td +(timeout )Tj +3.658 0 Td +(occurs,)Tj +( )Tj +-39.088 -1.44 Td +(and )Tj +2.183 0 Td +(that )Tj +2.183 0 Td +(could )Tj +3.017 0 Td +(cause )Tj +3.016 0 Td +(serious )Tj +3.572 0 Td +(stability )Tj +3.906 0 Td +(problems. )Tj +4.849 0 Td +(Bloc)Tj +1.927 0 Td +(king )Tj +2.405 0 Td +(bac)Tj +1.538 0 Td +(k-end )Tj +3.016 0 Td +(calls )Tj +2.516 0 Td +(could )Tj +3.016 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.626 0 Td +(cause )Tj +-39.755 -1.44 Td +(uncontrolled threads gro)Tj +10.548 0 Td +(wth and lead to )Tj +/TT1 1 Tf +(OutOfMemoryError)Tj +/TT0 1 Tf +( and a serv)Tj +21.262 0 Td +(er cr)Tj +1.932 0 Td +(ash.)Tj +-31.942 -2.24 Td +(A )Tj +1.029 0 Td +(decent )Tj +3.252 0 Td +(thread )Tj +3.085 0 Td +(management )Tj +5.918 0 Td +(solution )Tj +3.809 0 Td +(comes )Tj +3.14 0 Td +(with )Tj +2.252 0 Td +(JDK )Tj +2.029 0 Td +(1.5. )Tj +1.956 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.418 0 Td +(java.util.concurrent)Tj +/TT0 1 Tf +( )Tj +-30.198 -1.44 Td +(pac)Tj +1.538 0 Td +(kage )Tj +2.405 0 Td +(pro)Tj +1.433 0 Td +(vides )Tj +2.628 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.183 0 Td +(robust )Tj +3.073 0 Td +(thread )Tj +3.128 0 Td +(pool )Tj +2.351 0 Td +(implementations. )Tj +7.852 0 Td +(It )Tj +0.961 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.461 0 Td +(includes )Tj +4.018 0 Td +(a )Tj +0.905 0 Td +(builder )Tj +3.462 0 Td +(called )Tj +/TT1 1 Tf +-39.588 -1.44 Td +(java.util.concurrent.Executors)Tj +/TT0 1 Tf +( )Tj +18.323 0 Td +(for )Tj +1.487 0 Td +(the )Tj +1.654 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +2.988 0 Td +(creation )Tj +3.821 0 Td +(and )Tj +/C2_0 1 Tf +1.932 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.488 0 Td +(of )Tj +1.154 0 Td +(thread )Tj +-39.477 -1.44 Td +(pools. )Tj +/C2_0 1 Tf +2.905 0 Td +<002C004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +6.293 0 Td +(thread )Tj +3.015 0 Td +(pools )Tj +2.627 0 Td +(can )Tj +1.847 0 Td +(be )Tj +1.347 0 Td +(easily )Tj +/C2_0 1 Tf +2.737 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +4.904 0 Td +(with )Tj +2.182 0 Td +(a )Tj +0.791 0 Td +(single )Tj +2.793 0 Td +(method )Tj +3.571 0 Td +(call. )Tj +2.052 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.347 0 Td +(method )Tj +/TT1 1 Tf +-38.921 -1.44 Td +(E)Tj +0.625 0 Td +(x)Tj +0.625 0 Td +(e)Tj +0.625 0 Td +(c)Tj +0.625 0 Td +(u)Tj +0.625 0 Td +(t)Tj +0.625 0 Td +(o)Tj +0.625 0 Td +(r)Tj +0.625 0 Td +(s)Tj +0.625 0 Td +(.)Tj +0.625 0 Td +(n)Tj +0.625 0 Td +(e)Tj +0.625 0 Td +(w)Tj +0.625 0 Td +(C)Tj +0.625 0 Td +(a)Tj +0.625 0 Td +(c)Tj +0.625 0 Td +(h)Tj +0.625 0 Td +(e)Tj +0.625 0 Td +(d)Tj +0.625 0 Td +(T)Tj +0.625 0 Td +(h)Tj +0.625 0 Td +(r)Tj +0.625 0 Td +(e)Tj +0.625 0 Td +(a)Tj +0.625 0 Td +(d)Tj +0.625 0 Td +(P)Tj +0.625 0 Td +(o)Tj +0.625 0 Td +(o)Tj +0.625 0 Td +(l)Tj +/TT0 1 Tf +( )Tj +1.39 0 Td +(r)Tj +0.357 0 Td +(e)Tj +0.524 0 Td +(t)Tj +0.302 0 Td +(u)Tj +0.58 0 Td +(r)Tj +0.357 0 Td +(n)Tj +0.58 0 Td +(s )Tj +1.179 0 Td +(a )Tj +1.29 0 Td +(\223)Tj +0.468 0 Td +(b)Tj +0.58 0 Td +(r)Tj +0.357 0 Td +(e)Tj +0.524 0 Td +(a)Tj +0.524 0 Td +(t)Tj +0.302 0 Td +(h)Tj +0.58 0 Td +(i)Tj +0.302 0 Td +(n)Tj +0.58 0 Td +(g)Tj +0.524 0 Td +(\224 )Tj +/TT1 1 Tf +1.234 0 Td +(E)Tj +0.625 0 Td +(x)Tj +0.625 0 Td +(e)Tj +0.625 0 Td +(c)Tj +0.625 0 Td +(u)Tj +0.625 0 Td +(t)Tj +0.625 0 Td +(o)Tj +0.625 0 Td +(r)Tj +0.625 0 Td +(S)Tj +0.625 0 Td +(e)Tj +0.625 0 Td +(r)Tj +0.625 0 Td +(v)Tj +0.625 0 Td +(i)Tj +0.625 0 Td +(c)Tj +0.625 0 Td +(e)Tj +/TT0 1 Tf +0.625 0 Td +(. )Tj +0.994 0 Td +(T)Tj +0.535 0 Td +(h)Tj +0.58 0 Td +(i)Tj +0.302 0 Td +(s )Tj +-41.811 -1.44 Td +(particular )Tj +/C2_0 1 Tf +4.591 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.648 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +/C2_0 1 Tf +2.426 0 Td +<005D>Tj +/TT0 1 Tf +(t )Tj +1.313 0 Td +(our )Tj +1.925 0 Td +(needs )Tj +2.981 0 Td +(perfectly)Tj +3.631 0 Td +(. )Tj +0.683 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.536 0 Td +(amount )Tj +3.759 0 Td +(of )Tj +1.313 0 Td +(threads )Tj +3.592 0 Td +(is )Tj +1.147 0 Td +(automatically )Tj +-36.365 -1.44 Td +(adapted )Tj +3.904 0 Td +(to )Tj +1.292 0 Td +(the )Tj +1.792 0 Td +(current )Tj +3.514 0 Td +(load. )Tj +2.626 0 Td +(Under )Tj +3.181 0 Td +(hea)Tj +1.526 0 Td +(vy )Tj +1.458 0 Td +(load)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.598 0 Td +(more )Tj +2.68 0 Td +(threads )Tj +3.57 0 Td +(are )Tj +1.791 0 Td +(created. )Tj +3.866 0 Td +(After )Tj +2.514 0 Td +(the )Tj +1.792 0 Td +(peak)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.764 0 Td +(the )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<004B004D0048003D004A005E>Tj +/TT0 1 Tf +(uous )Tj +5.327 0 Td +(threads )Tj +3.492 0 Td +(get )Tj +1.658 0 Td +(destro)Tj +2.6 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.436 0 Td +(automatically)Tj +5.743 0 Td +(. )Tj +0.584 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.603 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.047 0 Td +(is )Tj +1.047 0 Td +(realized )Tj +3.825 0 Td +(internally\227there )Tj +7.604 0 Td +(is )Tj +1.047 0 Td +(no )Tj +-41.088 -1.44 Td +(need for dev)Tj +5.379 0 Td +(eloper interv)Tj +5.434 0 Td +(ention. )Tj +-9.013 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.437 0 Td +(newCachedThreadPool)Tj +/TT0 1 Tf +( )Tj +11.782 0 Td +(builder )Tj +3.438 0 Td +(method )Tj +3.66 0 Td +(comes )Tj +3.159 0 Td +(with )Tj +2.271 0 Td +(one )Tj +1.993 0 Td +(serious )Tj +3.382 0 Td +(ca)Tj +0.97 0 Td +(v)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 405.8877 137.1001 Tm +(eat: )Tj +1.863 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.437 0 Td +(creation )Tj +-38.699 -1.44 Td +(of )Tj +1.191 0 Td +(threads )Tj +3.469 0 Td +(is )Tj +1.024 0 Td +(unbounded. )Tj +5.546 0 Td +(A )Tj +1.024 0 Td +(potential )Tj +4.137 0 Td +(bloc)Tj +1.872 0 Td +(king )Tj +2.191 0 Td +(of )Tj +1.191 0 Td +(the )Tj +1.691 0 Td +(communication )Tj +7.137 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(er )Tj +1.19 0 Td +(\(for )Tj +1.802 0 Td +(example, )Tj +4.302 0 Td +(Soc)Tj +1.538 0 Td +(kets )Tj +-40.533 -1.44 Td +(because )Tj +3.819 0 Td +(of )Tj +1.078 0 Td +(TCP/IP )Tj +3.209 0 Td +(problems\) )Tj +4.597 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.264 0 Td +(lead )Tj +2.152 0 Td +(to )Tj +1.152 0 Td +(the )Tj +1.652 0 Td +(uncontrolled )Tj +5.821 0 Td +(creation )Tj +3.819 0 Td +(of )Tj +1.152 0 Td +(new )Tj +2.152 0 Td +(threads. )Tj +3.634 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.541 0 Td +(in )Tj +1.152 0 Td +(turn )Tj +-40.477 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.342 0 Td +(result )Tj +2.73 0 Td +(in )Tj +1.23 0 Td +(lots )Tj +1.897 0 Td +(of )Tj +1.23 0 Td +(context )Tj +3.564 0 Td +(s)Tj +0.377 0 Td +(witc)Tj +1.816 0 Td +(hing, )Tj +2.564 0 Td +(bad )Tj +2.008 0 Td +(performance, )Tj +6.119 0 Td +(high )Tj +2.286 0 Td +(memory )Tj +3.951 0 Td +(consumption)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.26 0 Td +(and )Tj +2.008 0 Td +(an )Tj +-41.144 -1.44 Td +(ev)Tj +0.988 0 Td +(entual )Tj +/TT1 1 Tf +3.072 0 Td +(OutOfMemoryError)Tj +/TT0 1 Tf +(. )Tj +10.284 0 Td +(Uncontrolled )Tj +6.129 0 Td +(thread )Tj +3.127 0 Td +(gro)Tj +1.377 0 Td +(wth )Tj +2.016 0 Td +(cannot )Tj +3.35 0 Td +(be )Tj +1.46 0 Td +(accepted )Tj +4.294 0 Td +(in )Tj +1.238 0 Td +(the )Tj +1.738 0 Td +(case )Tj +2.293 0 Td +(of)Tj +( )Tj +ET + +endstream +endobj +85 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 86 0 R>>endobj +86 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(32)Tj +0 Tc 0 Tw -20.432 57.06 Td +(x)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.421 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.599 0 Td +(because )Tj +3.822 0 Td +(robustness )Tj +4.823 0 Td +(is )Tj +0.988 0 Td +(the )Tj +1.655 0 Td +(most )Tj +2.377 0 Td +(important )Tj +4.489 0 Td +(non)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(functional )Tj +6.658 0 Td +(quality )Tj +3.267 0 Td +(and )Tj +1.933 0 Td +(it )Tj +0.877 0 Td +(is )Tj +0.988 0 Td +(the )Tj +1.655 0 Td +(actual )Tj +2.933 0 Td +(reason )Tj +-39.366 -1.44 Td +(for using threads)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +(A )Tj +1.199 0 Td +(hard )Tj +2.477 0 Td +(thread )Tj +3.255 0 Td +(limit, )Tj +2.755 0 Td +(on )Tj +1.644 0 Td +(the )Tj +1.866 0 Td +(other )Tj +2.755 0 Td +(hand, )Tj +2.978 0 Td +(can )Tj +2.088 0 Td +(cause )Tj +2.977 0 Td +(deadloc)Tj +3.428 0 Td +(ks )Tj +1.421 0 Td +(and )Tj +2.144 0 Td +(bloc)Tj +1.872 0 Td +(king )Tj +2.366 0 Td +(calls. )Tj +2.755 0 Td +(If )Tj +1.088 0 Td +(the )Tj +-40.866 -1.44 Td +(maximum )Tj +4.656 0 Td +(number )Tj +3.657 0 Td +(of )Tj +1.157 0 Td +(threads )Tj +3.435 0 Td +(is )Tj +0.99 0 Td +(reac)Tj +1.815 0 Td +(hed )Tj +1.935 0 Td +(and )Tj +1.935 0 Td +(the )Tj +1.657 0 Td +(thread )Tj +3.046 0 Td +(pool )Tj +2.269 0 Td +(is )Tj +0.99 0 Td +(empty)Tj +2.575 0 Td +(, )Tj +0.601 0 Td +(the )Tj +1.657 0 Td +(incoming )Tj +4.38 0 Td +(calls )Tj +2.268 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.823 0 Td +(to)Tj +( )Tj +-41.366 -1.44 Td +(w)Tj +0.76 0 Td +(ait )Tj +1.402 0 Td +(and )Tj +1.958 0 Td +(so )Tj +1.291 0 Td +(they )Tj +2.18 0 Td +(bloc)Tj +1.872 0 Td +(k. )Tj +1.087 0 Td +(A )Tj +1.013 0 Td +(solution )Tj +3.793 0 Td +(for )Tj +1.513 0 Td +(this )Tj +1.847 0 Td +(problem )Tj +3.958 0 Td +(is )Tj +1.013 0 Td +(the )Tj +1.68 0 Td +(use )Tj +1.791 0 Td +(of )Tj +1.18 0 Td +(queuing. )Tj +4.052 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.402 0 Td +(incoming )Tj +4.403 0 Td +(requests )Tj +-38.699 -1.44 Td +(are )Tj +1.626 0 Td +(put )Tj +1.683 0 Td +(in )Tj +1.127 0 Td +(the )Tj +1.627 0 Td +(queue )Tj +/C2_0 1 Tf +2.961 0 Td +<005D>Tj +/TT0 1 Tf +(rst, )Tj +2.127 0 Td +(and )Tj +1.905 0 Td +(then )Tj +2.183 0 Td +(they )Tj +2.127 0 Td +(are )Tj +1.626 0 Td +(consumed )Tj +4.739 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.793 0 Td +(w)Tj +0.766 0 Td +(orking )Tj +3.016 0 Td +(threads. )Tj +3.646 0 Td +(A )Tj +0.96 0 Td +(full )Tj +1.683 0 Td +(bounded )Tj +4.129 0 Td +(queue, )Tj +-39.254 -1.44 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.57 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.238 0 Td +(lead )Tj +2.126 0 Td +(to )Tj +1.126 0 Td +(bloc)Tj +1.872 0 Td +(ks )Tj +1.181 0 Td +(and )Tj +1.904 0 Td +(potentially )Tj +4.85 0 Td +(to )Tj +1.126 0 Td +(deadloc)Tj +3.428 0 Td +(ks. )Tj +1.422 0 Td +(An )Tj +1.515 0 Td +(unbounded )Tj +5.24 0 Td +(queue )Tj +2.96 0 Td +(could )Tj +2.738 0 Td +(be )Tj +/C2_0 1 Tf +1.348 0 Td +<005D>Tj +/TT0 1 Tf +(lled )Tj +/C2_0 1 Tf +-40.032 -1.44 Td +<004D0048000100410046005D>Tj +/TT0 1 Tf +(nitely and lead to )Tj +/TT1 1 Tf +(OutOfMemoryError)Tj +/TT0 1 Tf +( again. )Tj +1.8 -2.24 Td +(T)Tj +0.625 0 Td +(h)Tj +0.67 0 Td +(e )Tj +/TT1 1 Tf +1.335 0 Td +(j)Tj +0.714 0 Td +(a)Tj +0.714 0 Td +(v)Tj +0.714 0 Td +(a)Tj +0.714 0 Td +(.)Tj +0.714 0 Td +(u)Tj +0.714 0 Td +(t)Tj +0.714 0 Td +(i)Tj +0.714 0 Td +(l)Tj +0.714 0 Td +(.)Tj +0.714 0 Td +(c)Tj +0.714 0 Td +(o)Tj +0.714 0 Td +(n)Tj +0.714 0 Td +(c)Tj +0.714 0 Td +(u)Tj +0.714 0 Td +(r)Tj +0.714 0 Td +(r)Tj +0.714 0 Td +(e)Tj +0.714 0 Td +(n)Tj +0.714 0 Td +(t)Tj +0.714 0 Td +(.)Tj +0.714 0 Td +(T)Tj +0.714 0 Td +(h)Tj +0.714 0 Td +(r)Tj +0.714 0 Td +(e)Tj +0.714 0 Td +(a)Tj +0.714 0 Td +(d)Tj +0.714 0 Td +(P)Tj +0.714 0 Td +(o)Tj +0.714 0 Td +(o)Tj +0.714 0 Td +(l)Tj +0.714 0 Td +(E)Tj +0.714 0 Td +(x)Tj +0.714 0 Td +(e)Tj +0.714 0 Td +(c)Tj +0.714 0 Td +(u)Tj +0.714 0 Td +(t)Tj +0.714 0 Td +(o)Tj +0.714 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.435 0 Td +(\()Tj +0.392 0 Td +(a )Tj +1.335 0 Td +(m)Tj +0.947 0 Td +(o)Tj +0.67 0 Td +(r)Tj +0.447 0 Td +(e )Tj +1.335 0 Td +(c)Tj +0.614 0 Td +(a)Tj +0.614 0 Td +(p)Tj +0.67 0 Td +(a)Tj +0.614 0 Td +(b)Tj +0.67 0 Td +(l)Tj +0.392 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(E)Tj +0.634 0 Td +(x)Tj +0.634 0 Td +(e)Tj +0.634 0 Td +(c)Tj +0.634 0 Td +(u)Tj +0.634 0 Td +(t)Tj +0.634 0 Td +(o)Tj +0.634 0 Td +(r)Tj +0.634 0 Td +(S)Tj +0.634 0 Td +(e)Tj +0.634 0 Td +(r)Tj +0.634 0 Td +(v)Tj +0.634 0 Td +(i)Tj +0.634 0 Td +(c)Tj +0.634 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.395 0 Td +(i)Tj +0.312 0 Td +(m)Tj +0.867 0 Td +(p)Tj +0.59 0 Td +(l)Tj +0.312 0 Td +(e)Tj +0.534 0 Td +(m)Tj +0.867 0 Td +(e)Tj +0.534 0 Td +(n)Tj +0.59 0 Td +(t)Tj +0.312 0 Td +(a)Tj +0.534 0 Td +(t)Tj +0.312 0 Td +(i)Tj +0.312 0 Td +(o)Tj +0.59 0 Td +(n)Tj +0.59 0 Td +(\) )Tj +1.073 0 Td +(s)Tj +0.423 0 Td +(o)Tj +0.59 0 Td +(l)Tj +0.312 0 Td +(v)Tj +0.522 0 Td +(e)Tj +0.534 0 Td +(s )Tj +1.184 0 Td +(t)Tj +0.312 0 Td +(h)Tj +0.59 0 Td +(e )Tj +1.295 0 Td +(\223)Tj +0.478 0 Td +(f)Tj +0.312 0 Td +(u)Tj +0.59 0 Td +(l)Tj +0.312 0 Td +(l )Tj +1.073 0 Td +(q)Tj +0.59 0 Td +(u)Tj +0.59 0 Td +(e)Tj +0.534 0 Td +(u)Tj +0.59 0 Td +(e )Tj +1.295 0 Td +(p)Tj +0.59 0 Td +(r)Tj +0.367 0 Td +(o)Tj +0.59 0 Td +(b)Tj +0.59 0 Td +(l)Tj +0.312 0 Td +(e)Tj +0.534 0 Td +(m)Tj +0.867 0 Td +(\224 )Tj +1.239 0 Td +(e)Tj +0.534 0 Td +(l)Tj +0.312 0 Td +(e)Tj +0.534 0 Td +(g)Tj +0.534 0 Td +(a)Tj +0.534 0 Td +(n)Tj +0.59 0 Td +(t)Tj +0.312 0 Td +(l)Tj +0.312 0 Td +(y)Tj +0.442 0 Td +(. )Tj +1.036 0 Td +(A)Tj +0.701 0 Td +(n )Tj +-41.644 -1.44 Td +(implementation )Tj +7.152 0 Td +(of )Tj +1.206 0 Td +(the )Tj +1.706 0 Td +(interface )Tj +/TT1 1 Tf +4.095 0 Td +(RejectedExecutionHandler)Tj +/TT0 1 Tf +(, )Tj +15.053 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.928 0 Td +(is )Tj +1.039 0 Td +(sho)Tj +1.489 0 Td +(wn )Tj +1.706 0 Td +(in )Tj +1.206 0 Td +(Listing )Tj +3.151 0 Td +(14,)Tj +( )Tj +-40.81 -1.44 Td +(is in)Tj +1.767 0 Td +(v)Tj +0.482 0 Td +(oked if all threads are busy and the request queue is full.)Tj +/TT1 1 Tf +-2.249 -1.79 Td +(public interface RejectedExecutionHandler {)Tj +0 -1.79 TD +( void rejectedExecution\(Runnable r, ThreadPoolExecutor executor\);)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 14: )Tj +4.651 0 Td +(T)Tj +0.511 0 Td +(he ja)Tj +2.082 0 Td +(v)Tj +0.476 0 Td +(a.util.concurrent.RejectedExecutionHandler)Tj +-5.92 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.395 0 Td +(most )Tj +2.395 0 Td +(suitable )Tj +3.674 0 Td +(reco)Tj +1.877 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.672 0 Td +(str)Tj +0.988 0 Td +(ategy )Tj +2.617 0 Td +(in )Tj +1.173 0 Td +(our )Tj +1.784 0 Td +(case )Tj +2.228 0 Td +(is )Tj +1.006 0 Td +(simple )Tj +3.173 0 Td +(y)Tj +0.482 0 Td +(et )Tj +1.117 0 Td +(effecti)Tj +2.594 0 Td +(v)Tj +0.488 0 Td +(e: )Tj +1.117 0 Td +(ignor)Tj +2.211 0 Td +(ance. )Tj +2.673 0 Td +(In )Tj +1.173 0 Td +(the )Tj +1.673 0 Td +(case )Tj +-40.311 -1.44 Td +(of )Tj +1.157 0 Td +(a )Tj +0.823 0 Td +(full )Tj +1.713 0 Td +(queue )Tj +2.991 0 Td +(and )Tj +1.935 0 Td +(busy )Tj +2.324 0 Td +(threads)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.685 0 Td +(all )Tj +1.379 0 Td +(new )Tj +2.157 0 Td +(requests )Tj +3.824 0 Td +(will )Tj +1.935 0 Td +(just )Tj +1.824 0 Td +(be )Tj +1.379 0 Td +(dropped. )Tj +4.14 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.379 0 Td +(rejections )Tj +4.491 0 Td +(are )Tj +1.656 0 Td +(logged )Tj +-39.31 -1.44 Td +(and )Tj +1.96 0 Td +(monitored )Tj +4.794 0 Td +(\(we )Tj +1.904 0 Td +(will )Tj +1.96 0 Td +(discuss )Tj +3.405 0 Td +(that )Tj +1.96 0 Td +(later\), )Tj +2.793 0 Td +(but )Tj +1.738 0 Td +(they )Tj +2.182 0 Td +(are )Tj +1.681 0 Td +(not )Tj +1.738 0 Td +(processed. )Tj +4.905 0 Td +(Unfortunately)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.545 0 Td +(there )Tj +2.515 0 Td +(is )Tj +1.015 0 Td +(no )Tj +-41.088 -1.44 Td +(p)Tj +0.845 0 Td +(r)Tj +0.622 0 Td +(e)Tj +0.789 0 Td +(d)Tj +0.845 0 Td +(e)Tj +/C2_0 1 Tf +0.789 0 Td +<005D>Tj +/TT0 1 Tf +0.845 0 Td +(n)Tj +0.845 0 Td +(e)Tj +0.789 0 Td +(d )Tj +1.518 0 Td +(b)Tj +0.845 0 Td +(u)Tj +0.845 0 Td +(i)Tj +0.567 0 Td +(l)Tj +0.567 0 Td +(d)Tj +0.845 0 Td +(e)Tj +0.789 0 Td +(r )Tj +1.295 0 Td +(m)Tj +1.122 0 Td +(e)Tj +0.789 0 Td +(t)Tj +0.567 0 Td +(h)Tj +0.845 0 Td +(o)Tj +0.845 0 Td +(d )Tj +1.518 0 Td +(i)Tj +0.567 0 Td +(n )Tj +1.518 0 Td +(t)Tj +0.567 0 Td +(h)Tj +0.845 0 Td +(e )Tj +/TT1 1 Tf +1.462 0 Td +(E)Tj +0.889 0 Td +(x)Tj +0.889 0 Td +(e)Tj +0.889 0 Td +(c)Tj +0.889 0 Td +(u)Tj +0.889 0 Td +(t)Tj +0.889 0 Td +(o)Tj +0.889 0 Td +(r)Tj +0.889 0 Td +(s)Tj +/TT0 1 Tf +( )Tj +1.562 0 Td +(c)Tj +0.789 0 Td +(l)Tj +0.567 0 Td +(a)Tj +0.789 0 Td +(s)Tj +0.678 0 Td +(s )Tj +1.351 0 Td +(w)Tj +1.067 0 Td +(i)Tj +0.567 0 Td +(t)Tj +0.567 0 Td +(h )Tj +1.518 0 Td +(a)Tj +0.789 0 Td +(n)Tj +( )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(I)Tj +0.711 0 Td +(g)Tj +ET +BT +/TT1 1 Tf +10 0 0 10 71.2142 302.7001 Tm +(n)Tj +0.711 0 Td +(o)Tj +0.711 0 Td +(r)Tj +0.711 0 Td +(i)Tj +0.711 0 Td +(n)Tj +0.711 0 Td +(g)Tj +0.711 0 Td +(R)Tj +0.711 0 Td +(e)Tj +0.711 0 Td +(j)Tj +0.711 0 Td +(e)Tj +0.711 0 Td +(c)Tj +0.711 0 Td +(t)Tj +0.711 0 Td +(e)Tj +0.711 0 Td +(d)Tj +0.711 0 Td +(E)Tj +0.711 0 Td +(x)Tj +0.711 0 Td +(e)Tj +0.711 0 Td +(c)Tj +0.711 0 Td +(u)Tj +0.711 0 Td +(t)Tj +0.711 0 Td +(i)Tj +0.711 0 Td +(o)Tj +0.711 0 Td +(n)Tj +0.711 0 Td +(H)Tj +0.711 0 Td +(a)Tj +0.711 0 Td +(n)Tj +0.711 0 Td +(d)Tj +0.711 0 Td +(l)Tj +0.711 0 Td +(e)Tj +0.711 0 Td +(r)Tj +/TT0 1 Tf +0.711 0 Td +(. )Tj +1.074 0 Td +(A )Tj +1.5 0 Td +(c)Tj +0.611 0 Td +(u)Tj +0.667 0 Td +(s)Tj +0.5 0 Td +(t)Tj +0.389 0 Td +(o)Tj +0.667 0 Td +(m )Tj +1.666 0 Td +(i)Tj +0.389 0 Td +(m)Tj +0.944 0 Td +(p)Tj +0.667 0 Td +(l)Tj +0.389 0 Td +(e)Tj +0.611 0 Td +(m)Tj +0.944 0 Td +(e)Tj +0.611 0 Td +(n)Tj +0.667 0 Td +(t)Tj +0.389 0 Td +(a)Tj +0.611 0 Td +(t)Tj +0.389 0 Td +(i)Tj +0.389 0 Td +(o)Tj +0.667 0 Td +(n )Tj +1.389 0 Td +(o)Tj +0.667 0 Td +(f )Tj +1.111 0 Td +(t)Tj +0.389 0 Td +(h)Tj +0.667 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(T)Tj +0.608 0 Td +(h)Tj +0.608 0 Td +(r)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(a)Tj +0.608 0 Td +(d)Tj +0.608 0 Td +(P)Tj +0.608 0 Td +(o)Tj +0.608 0 Td +(o)Tj +0.608 0 Td +(l)Tj +0.608 0 Td +(E)Tj +0.608 0 Td +(x)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(c)Tj +0.608 0 Td +(u)Tj +0.608 0 Td +(t)Tj +0.608 0 Td +(o)Tj +0.608 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.382 0 Td +(u)Tj +0.563 0 Td +(s)Tj +0.396 0 Td +(e)Tj +0.507 0 Td +(s )Tj +1.171 0 Td +(a )Tj +/TT1 1 Tf +1.282 0 Td +(R)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(j)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(c)Tj +0.608 0 Td +(t)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(d)Tj +0.608 0 Td +(E)Tj +0.608 0 Td +(x)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(c)Tj +0.608 0 Td +(u)Tj +0.608 0 Td +(t)Tj +0.608 0 Td +(i)Tj +0.608 0 Td +(o)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(H)Tj +0.608 0 Td +(a)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(d)Tj +0.608 0 Td +(l)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.382 0 Td +(t)Tj +0.285 0 Td +(o )Tj +1.338 0 Td +(i)Tj +0.285 0 Td +(g)Tj +0.507 0 Td +(n)Tj +0.563 0 Td +(o)Tj +0.563 0 Td +(r)Tj +0.341 0 Td +(e )Tj +1.282 0 Td +(\223)Tj +0.451 0 Td +(o)Tj +0.551 0 Td +(v)Tj +0.495 0 Td +(e)Tj +0.507 0 Td +(r)Tj +/C2_0 1 Tf +0.341 0 Td +<005E>Tj +/TT0 1 Tf +0.563 0 Td +(o)Tj +0.551 0 Td +(w)Tj +0.785 0 Td +(i)Tj +0.285 0 Td +(n)Tj +0.563 0 Td +(g)Tj +0.507 0 Td +(\224 )Tj +-41.756 -1.44 Td +(requests \(see Listing 15\).)Tj +/TT1 1 Tf +0 -1.79 TD +( private static void setupThreadPools\(\) {)Tj +T* +( MonitorableThreadFactory monitorableThreadFactory = new )Tj +0 -0.99 TD +(MonitorableThreadFactory\(\);)Tj +0 -1.79 TD +( RejectedExecutionHandler ignoringHandler = new )Tj +0 -0.99 TD +(RejectedExecutionHandler\(\) {)Tj +0 -1.79 TD +( @Override)Tj +T* +( public void rejectedExecution\(Runnable r, ThreadPoolExecutor )Tj +0 -0.99 TD +(executor\) {)Tj +0 -1.79 TD +( int rejectedJobs = nrOfRejectedJobs.incrementAndGet\(\);)Tj +T* +( LOG.log\(Level.SEVERE, "Job: {0} rejected. Number of rejected jobs: )Tj +0 -0.99 TD +({1}", new Object[]{r, rejectedJobs}\);)Tj +0 -1.79 TD +( })Tj +ET + +endstream +endobj +87 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 88 0 R>>endobj +88 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(33)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( };)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( BlockingQueue workQueue = new ArrayBlockingQueue)Tj +0 -0.99 TD +(\(QUEUE_CAPACITY\);)Tj +/TT2 1 Tf +0 -1.79 TD +( executor = new ThreadPoolExecutor\(NR_OF_THREADS, NR_OF_THREADS, )Tj +0 -0.99 TD +(Integer.MAX_VALUE, TimeUnit.SECONDS, workQueue, )Tj +T* +(monitorableThreadFactory, ignoringHandler\);)Tj +/TT1 1 Tf +0 -1.79 TD +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 15: )Tj +/C2_0 1 Tf +4.688 0 Td +<001D0001001F004D004B004C004700450001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +8.214 0 Td +(ation of )Tj +3.484 0 Td +(T)Tj +0.511 0 Td +(hreadP)Tj +2.956 0 Td +(oolExecutor)Tj +-18.053 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.555 0 Td +(method )Tj +/TT1 1 Tf +3.778 0 Td +(setupThreadPools)Tj +/TT0 1 Tf +( )Tj +10.101 0 Td +(creates )Tj +3.499 0 Td +(a )Tj +/TT1 1 Tf +0.999 0 Td +(MonitorableThreadFactory)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +14.902 0 Td +<005D>Tj +/TT0 1 Tf +(rst. )Tj +2.333 0 Td +(It )Tj +1.055 0 Td +(is )Tj +1.166 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(tri)Tj +0.871 0 Td +(vial implementation of the )Tj +/TT1 1 Tf +(ThreadFactory)Tj +/TT0 1 Tf +( interface \(see Listing 16\).)Tj +/TT1 1 Tf +-0.871 -1.79 Td +(public class MonitorableThreadFactory implements ThreadFactory {)Tj +0 -1.79 TD +( final AtomicInteger threadNumber = new AtomicInteger\(1\);)Tj +T* +( private String namePrefix;)Tj +T* +( public MonitorableThreadFactory\(\) {)Tj +T* +( this\("xray-rest-pool"\);)Tj +T* +( })Tj +0 -3.58 TD +( public MonitorableThreadFactory\(String namePrefix\) {)Tj +0 -1.79 TD +( this.namePrefix = namePrefix;)Tj +T* +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public Thread newThread\(Runnable r\) {)Tj +T* +( Thread t = new Thread\(r\);)Tj +T* +( )Tj +/TT2 1 Tf +(t.setName\(createName\(\)\);)Tj +/TT1 1 Tf +T* +( if \(t.isDaemon\(\)\) {)Tj +T* +( t.setDaemon\(false\);)Tj +T* +( })Tj +T* +( if \(t.getPriority\(\) != Thread.NORM_PRIORITY\) {)Tj +T* +( t.setPriority\(Thread.NORM_PRIORITY\);)Tj +T* +( })Tj +T* +( return t;)Tj +T* +( })Tj +ET + +endstream +endobj +89 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 90 0 R>>endobj +90 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(34)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( )Tj +/TT2 1 Tf +(String createName\(\){)Tj +ET +Q +BT +/TT2 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( return namePrefix +"-"+threadNumber.incrementAndGet\(\);)Tj +0 -1.79 TD +( })Tj +/TT1 1 Tf +T* +( public int getNumberOfCreatedThreads\(\){)Tj +T* +( return threadNumber.get\(\);)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 16: )Tj +4.688 0 Td +(A Monitor)Tj +4.379 0 Td +(able )Tj +2.038 0 Td +(T)Tj +0.511 0 Td +(hreadF)Tj +2.89 0 Td +(actory)Tj +-12.706 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.46 0 Td +(only )Tj +2.294 0 Td +(responsibility )Tj +6.129 0 Td +(of )Tj +1.238 0 Td +(the )Tj +/TT1 1 Tf +1.738 0 Td +(ThreadFactory)Tj +/TT0 1 Tf +( )Tj +8.206 0 Td +(is )Tj +1.071 0 Td +(custom )Tj +3.516 0 Td +(naming )Tj +3.627 0 Td +(and )Tj +2.016 0 Td +(counting )Tj +4.184 0 Td +(of )Tj +1.238 0 Td +(created )Tj +-39.033 -1.44 Td +(threads. )Tj +3.6 0 Td +(T)Tj +0.511 0 Td +(hreads )Tj +3.118 0 Td +(created )Tj +3.451 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.784 0 Td +(the )Tj +1.618 0 Td +(custom )Tj +/TT1 1 Tf +3.396 0 Td +(Executor)Tj +/TT0 1 Tf +( )Tj +5.085 0 Td +(should )Tj +3.175 0 Td +(be )Tj +1.34 0 Td +(distinguishable )Tj +6.732 0 Td +(from )Tj +2.284 0 Td +(threads )Tj +3.396 0 Td +(created )Tj +-39.033 -1.44 Td +(b)Tj +0.538 0 Td +(y )Tj +1.072 0 Td +(the )Tj +1.906 0 Td +(application )Tj +5.408 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.776 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.628 0 Td +(name )Tj +2.961 0 Td +(of )Tj +1.406 0 Td +(a )Tj +1.072 0 Td +(thread )Tj +3.295 0 Td +(will )Tj +2.184 0 Td +(look )Tj +2.462 0 Td +(like )Tj +/TT1 1 Tf +2.128 0 Td +(xray-rest-pool-42)Tj +/TT0 1 Tf +( )Tj +10.774 0 Td +(\(the )Tj +-40.588 -1.44 Td +(forty)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(third )Tj +4.924 0 Td +(created )Tj +3.545 0 Td +(thread\). )Tj +3.657 0 Td +(Proper )Tj +3.212 0 Td +(thread )Tj +3.101 0 Td +(naming )Tj +3.601 0 Td +(is )Tj +1.045 0 Td +(important )Tj +4.546 0 Td +(for )Tj +1.545 0 Td +(monitoring )Tj +5.102 0 Td +(in )Tj +1.212 0 Td +(production )Tj +5.103 0 Td +(and )Tj +-40.588 -1.44 Td +(during )Tj +3.216 0 Td +(stress )Tj +2.715 0 Td +(tests. )Tj +2.512 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.549 0 Td +(tools )Tj +2.494 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.993 0 Td +(as )Tj +1.234 0 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.994 0 Td +(\()Tj +(http://visualvm.ja)Tj +7.64 0 Td +(v)Tj +0.476 0 Td +(a.net/)Tj +(\))Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.355 0 Td +(thread )Tj +3.16 0 Td +(monitoring )Tj +5.161 0 Td +(is )Tj +-41.533 -1.44 Td +(relati)Tj +2.149 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.768 0 Td +(easy)Tj +1.797 0 Td +(. )Tj +0.676 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.602 0 Td +(will )Tj +2.102 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +/C2_0 1 Tf +1.379 0 Td +<005D>Tj +/TT0 1 Tf +(nd )Tj +2.158 0 Td +(a )Tj +0.99 0 Td +(bunc)Tj +2.15 0 Td +(h )Tj +1.046 0 Td +(of )Tj +1.324 0 Td +(threads )Tj +3.602 0 Td +(running )Tj +3.825 0 Td +(on )Tj +1.602 0 Td +(an )Tj +1.546 0 Td +(application )Tj +5.326 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.768 0 Td +(so )Tj +-41.255 -1.44 Td +(naming y)Tj +3.983 0 Td +(our custom threads differently is a good idea.)Tj +-2.183 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.629 0 Td +(class )Tj +/TT1 1 Tf +2.629 0 Td +(ThreadPoolExecutor)Tj +/TT0 1 Tf +( )Tj +11.375 0 Td +(reuses )Tj +3.24 0 Td +(alread)Tj +2.643 0 Td +(y)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(created )Tj +4.573 0 Td +(threads )Tj +3.685 0 Td +(behind )Tj +3.575 0 Td +(the )Tj +1.907 0 Td +(scenes, )Tj +3.685 0 Td +(so )Tj +-41.255 -1.44 Td +(threads )Tj +3.527 0 Td +(do )Tj +1.527 0 Td +(not )Tj +1.805 0 Td +(need )Tj +2.527 0 Td +(to )Tj +1.249 0 Td +(be )Tj +1.471 0 Td +(created )Tj +3.582 0 Td +(for )Tj +1.582 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.971 0 Td +(task. )Tj +2.323 0 Td +(An )Tj +1.638 0 Td +(unc)Tj +1.594 0 Td +(hec)Tj +1.538 0 Td +(ked )Tj +1.971 0 Td +(exception )Tj +4.639 0 Td +(terminates )Tj +4.86 0 Td +(a )Tj +0.915 0 Td +(thread; )Tj +-39.199 -1.44 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.709 0 Td +(immediately )Tj +5.709 0 Td +(initiates )Tj +3.71 0 Td +(its )Tj +1.32 0 Td +(re-creation )Tj +5.042 0 Td +(is )Tj +1.042 0 Td +(pro)Tj +1.433 0 Td +(vided )Tj +2.765 0 Td +(with )Tj +/TT1 1 Tf +2.265 0 Td +(MonitorableThreadFactory)Tj +/TT0 1 Tf +( )Tj +14.777 0 Td +(\(see)Tj +( )Tj +-40.533 -1.44 Td +(Listing )Tj +3.11 0 Td +(16\). )Tj +1.999 0 Td +(New )Tj +2.387 0 Td +(threads )Tj +3.443 0 Td +(are )Tj +1.664 0 Td +(created )Tj +3.498 0 Td +(only )Tj +2.221 0 Td +(until )Tj +2.277 0 Td +(the )Tj +/C2_0 1 Tf +1.665 0 Td +<0048004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +6.333 0 Td +(maximum )Tj +4.664 0 Td +(number )Tj +3.665 0 Td +(of )Tj +1.165 0 Td +(threads )Tj +3.443 0 Td +(is )Tj +-41.533 -1.44 Td +(reac)Tj +1.815 0 Td +(hed. )Tj +2.448 0 Td +(Some )Tj +/TT1 1 Tf +2.947 0 Td +(ThreadPool)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +6.559 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ations )Tj +3.115 0 Td +(\(suc)Tj +1.705 0 Td +(h )Tj +1.114 0 Td +(as )Tj +/TT1 1 Tf +1.447 0 Td +(newCachedThreadPool)Tj +/TT0 1 Tf +(\) )Tj +12.238 0 Td +(destro)Tj +2.6 0 Td +(y )Tj +1.058 0 Td +(idle )Tj +-40.588 -1.44 Td +(t)Tj +0.494 0 Td +(h)Tj +0.772 0 Td +(r)Tj +0.549 0 Td +(e)Tj +0.716 0 Td +(a)Tj +0.716 0 Td +(d)Tj +0.772 0 Td +(s)Tj +0.605 0 Td +(. )Tj +1.164 0 Td +(D)Tj +0.994 0 Td +(e)Tj +0.716 0 Td +(s)Tj +0.605 0 Td +(t)Tj +0.494 0 Td +(r)Tj +0.549 0 Td +(o)Tj +0.76 0 Td +(y)Tj +0.698 0 Td +(e)Tj +0.716 0 Td +(d )Tj +1.442 0 Td +(t)Tj +0.494 0 Td +(h)Tj +0.772 0 Td +(r)Tj +0.549 0 Td +(e)Tj +0.716 0 Td +(a)Tj +0.716 0 Td +(d)Tj +0.772 0 Td +(s )Tj +1.275 0 Td +(a)Tj +0.716 0 Td +(r)Tj +0.549 0 Td +(e )Tj +1.386 0 Td +(a)Tj +0.716 0 Td +(l)Tj +0.494 0 Td +(s)Tj +0.605 0 Td +(o )Tj +1.442 0 Td +(c)Tj +0.716 0 Td +(r)Tj +0.549 0 Td +(e)Tj +0.716 0 Td +(a)Tj +0.716 0 Td +(t)Tj +0.494 0 Td +(e)Tj +0.716 0 Td +(d )Tj +1.442 0 Td +(o)Tj +0.772 0 Td +(n )Tj +1.442 0 Td +(d)Tj +0.772 0 Td +(e)Tj +0.716 0 Td +(m)Tj +1.049 0 Td +(a)Tj +0.716 0 Td +(n)Tj +0.772 0 Td +(d )Tj +1.442 0 Td +(w)Tj +0.994 0 Td +(i)Tj +0.494 0 Td +(t)Tj +0.494 0 Td +(h )Tj +1.442 0 Td +(t)Tj +0.494 0 Td +(h)Tj +0.772 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(MonitorableThreadFactory)Tj +/TT0 1 Tf +(. )Tj +1.8 -2.24 Td +(W)Tj +0.963 0 Td +(e )Tj +1.081 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +1.081 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(ered )Tj +2.47 0 Td +(tw)Tj +1.044 0 Td +(o )Tj +1.137 0 Td +(of )Tj +1.415 0 Td +(the )Tj +1.915 0 Td +(par)Tj +1.377 0 Td +(ameters )Tj +3.914 0 Td +(of )Tj +1.415 0 Td +(the )Tj +1.915 0 Td +(constructor: )Tj +/TT1 1 Tf +5.694 0 Td +(ThreadPoolExecutor)Tj +-31.398 -1.32 Td +(\()Tj +0.608 0 Td +(N)Tj +0.608 0 Td +(R)Tj +0.608 0 Td +(_)Tj +0.608 0 Td +(O)Tj +0.608 0 Td +(F)Tj +0.608 0 Td +(_)Tj +0.608 0 Td +(T)Tj +0.608 0 Td +(H)Tj +0.608 0 Td +(R)Tj +0.608 0 Td +(E)Tj +0.608 0 Td +(A)Tj +0.608 0 Td +(D)Tj +0.608 0 Td +(S)Tj +0.608 0 Td +(, )Tj +1.704 0 Td +(N)Tj +0.608 0 Td +(R)Tj +0.608 0 Td +(_)Tj +0.608 0 Td +(O)Tj +0.608 0 Td +(F)Tj +0.608 0 Td +(_)Tj +0.608 0 Td +(T)Tj +0.608 0 Td +(H)Tj +0.608 0 Td +(R)Tj +0.608 0 Td +(E)Tj +0.608 0 Td +(A)Tj +0.608 0 Td +(D)Tj +0.608 0 Td +(S)Tj +0.608 0 Td +(, )Tj +1.704 0 Td +(I)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(t)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(g)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(r)Tj +0.608 0 Td +(.)Tj +0.608 0 Td +(M)Tj +0.608 0 Td +(A)Tj +0.608 0 Td +(X)Tj +0.608 0 Td +(_)Tj +0.608 0 Td +(V)Tj +0.608 0 Td +(A)Tj +0.608 0 Td +(L)Tj +0.608 0 Td +(U)Tj +0.608 0 Td +(E)Tj +0.608 0 Td +(, )Tj +1.704 0 Td +(T)Tj +0.608 0 Td +(i)Tj +0.608 0 Td +(m)Tj +0.608 0 Td +(e)Tj +0.608 0 Td +(U)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(i)Tj +0.608 0 Td +(t)Tj +0.608 0 Td +(.)Tj +0.608 0 Td +(S)Tj +0.608 0 Td +(E)Tj +0.608 0 Td +(C)Tj +0.608 0 Td +(O)Tj +0.608 0 Td +(N)Tj +0.608 0 Td +(D)Tj +0.608 0 Td +(S)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 472.9988 254.7001 Tm +(, )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 240.3001 Tm +(workQueue, )Tj +6.97 0 Td +(monitorableThreadFactory,)Tj +/TT0 1 Tf +( )Tj +15.649 0 Td +(and)Tj +/TT1 1 Tf +( )Tj +2.581 0 Td +(ignoringHandler\))Tj +/TT0 1 Tf +(. )Tj +10.452 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.703 0 Td +(remaining )Tj +-37.866 -1.44 Td +(par)Tj +1.377 0 Td +(ameters )Tj +3.719 0 Td +(are )Tj +1.719 0 Td +(less )Tj +1.942 0 Td +(interesting )Tj +4.832 0 Td +(and )Tj +/C2_0 1 Tf +1.998 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(ne )Tj +3.054 0 Td +(the )Tj +1.72 0 Td +(core )Tj +2.275 0 Td +(pool )Tj +2.332 0 Td +(size, )Tj +2.331 0 Td +(the )Tj +1.72 0 Td +(maximum )Tj +4.719 0 Td +(size, )Tj +2.331 0 Td +(the )Tj +1.72 0 Td +(keep)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(ali)Tj +3.427 0 Td +(v)Tj +0.488 0 Td +(e )Tj +-41.7 -1.44 Td +(time, the time unit, and an implementation of the )Tj +/TT1 1 Tf +(BlockingQueue)Tj +/TT0 1 Tf +( interface.)Tj +1.8 -2.24 Td +(T)Tj +0.586 0 Td +(h)Tj +0.631 0 Td +(e )Tj +1.316 0 Td +(c)Tj +0.575 0 Td +(r)Tj +0.408 0 Td +(e)Tj +0.575 0 Td +(a)Tj +0.575 0 Td +(t)Tj +0.353 0 Td +(i)Tj +0.353 0 Td +(o)Tj +0.631 0 Td +(n )Tj +1.372 0 Td +(a)Tj +0.575 0 Td +(n)Tj +0.631 0 Td +(d )Tj +1.372 0 Td +(c)Tj +0.575 0 Td +(o)Tj +0.631 0 Td +(n)Tj +/C2_0 1 Tf +0.631 0 Td +<005D>Tj +/TT0 1 Tf +0.631 0 Td +(g)Tj +0.575 0 Td +(u)Tj +0.631 0 Td +(r)Tj +0.396 0 Td +(a)Tj +0.575 0 Td +(t)Tj +0.353 0 Td +(i)Tj +0.353 0 Td +(o)Tj +0.631 0 Td +(n )Tj +1.372 0 Td +(o)Tj +0.631 0 Td +(f )Tj +1.094 0 Td +(t)Tj +0.353 0 Td +(h)Tj +0.631 0 Td +(e )Tj +1.316 0 Td +(t)Tj +0.353 0 Td +(h)Tj +0.631 0 Td +(r)Tj +0.408 0 Td +(e)Tj +0.575 0 Td +(a)Tj +0.575 0 Td +(d )Tj +1.372 0 Td +(p)Tj +0.631 0 Td +(o)Tj +0.631 0 Td +(o)Tj +0.631 0 Td +(l )Tj +1.094 0 Td +(w)Tj +0.835 0 Td +(a)Tj +0.575 0 Td +(s )Tj +1.205 0 Td +(e)Tj +0.575 0 Td +(x)Tj +0.575 0 Td +(t)Tj +0.353 0 Td +(r)Tj +0.396 0 Td +(a)Tj +0.575 0 Td +(c)Tj +0.575 0 Td +(t)Tj +0.353 0 Td +(e)Tj +0.575 0 Td +(d )Tj +1.372 0 Td +(i)Tj +0.353 0 Td +(n)Tj +0.631 0 Td +(t)Tj +0.353 0 Td +(o )Tj +1.372 0 Td +(t)Tj +0.353 0 Td +(h)Tj +0.631 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(setupThreadPools)Tj +/TT0 1 Tf +( )Tj +10.012 0 Td +(method. )Tj +3.894 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.467 0 Td +(ThreadPoolExecutor)Tj +/TT0 1 Tf +( )Tj +11.213 0 Td +(went )Tj +2.523 0 Td +(to )Tj +1.245 0 Td +(production )Tj +5.136 0 Td +(with )Tj +2.301 0 Td +(tw)Tj +1.044 0 Td +(o )Tj +0.967 0 Td +(core )Tj +-40.311 -1.44 Td +(threads, )Tj +3.774 0 Td +(a )Tj +0.884 0 Td +(maximum )Tj +4.717 0 Td +(size )Tj +2.051 0 Td +(of )Tj +1.218 0 Td +(2, )Tj +1.218 0 Td +(and )Tj +1.996 0 Td +(a )Tj +0.884 0 Td +(maximum )Tj +4.717 0 Td +(queue )Tj +3.052 0 Td +(size )Tj +2.051 0 Td +(of )Tj +1.218 0 Td +(2. )Tj +1.218 0 Td +(Not )Tj +1.996 0 Td +(a )Tj +0.884 0 Td +(single )Tj +2.885 0 Td +(request )Tj +3.496 0 Td +(has )Tj +1.829 0 Td +(been )Tj +-40.088 -1.44 Td +(rejected )Tj +4.021 0 Td +(so )Tj +1.521 0 Td +(far)Tj +1.037 0 Td +(. )Tj +0.78 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.632 0 Td +(ThreadPoolExecutor)Tj +/TT0 1 Tf +( )Tj +11.378 0 Td +(is )Tj +1.243 0 Td +(stored )Tj +3.188 0 Td +(in )Tj +1.41 0 Td +(a )Tj +1.076 0 Td +(static )Tj +2.799 0 Td +(member)Tj +3.481 0 Td +(. )Tj +0.854 0 Td +(Sev)Tj +1.488 0 Td +(er)Tj +0.821 0 Td +(al )Tj +/TT1 1 Tf +1.354 0 Td +(Filter)Tj +/TT0 1 Tf +( )Tj +-38.599 -1.44 Td +(instances share a single thread pool. )Tj +ET + +endstream +endobj +91 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 92 0 R>>endobj +92 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(35)Tj +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 593.2 Tm +(JMX or Logging?)Tj +/TT0 1 Tf +10 0 0 10 75 570.8 Tm +(I\222m )Tj +1.699 0 Td +(in )Tj +1.144 0 Td +(the )Tj +1.644 0 Td +(fortunate )Tj +4.145 0 Td +(situation )Tj +3.979 0 Td +(being )Tj +2.7 0 Td +(the )Tj +1.644 0 Td +(domain )Tj +3.589 0 Td +(expert, )Tj +3.255 0 Td +(the )Tj +1.644 0 Td +(product )Tj +3.645 0 Td +(o)Tj +0.544 0 Td +(wner)Tj +2.093 0 Td +(, )Tj +0.588 0 Td +(the )Tj +1.644 0 Td +(dev)Tj +1.544 0 Td +(eloper)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.283 0 Td +(and )Tj +-40.588 -1.44 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.724 0 Td +(the )Tj +2.002 0 Td +(oper)Tj +1.933 0 Td +(ator)Tj +1.593 0 Td +(, )Tj +0.946 0 Td +(all )Tj +1.724 0 Td +(in )Tj +1.502 0 Td +(one )Tj +2.28 0 Td +(person. )Tj +3.836 0 Td +(In )Tj +1.502 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.224 0 Td +(a )Tj +1.168 0 Td +(case)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.807 0 Td +(it )Tj +1.224 0 Td +(is )Tj +1.335 0 Td +(a )Tj +1.168 0 Td +(c)Tj +0.482 0 Td +(hallenge )Tj +4.336 0 Td +(not )Tj +2.058 0 Td +(to )Tj +1.502 0 Td +(become)Tj +( )Tj +-38.755 -1.44 Td +(sc)Tj +0.871 0 Td +(hizophrenic :-\). I began to think about the v)Tj +18.708 0 Td +(alue of systematic logging in suc)Tj +13.932 0 Td +(h a situation.)Tj +-31.711 -2.24 Td +(In )Tj +1.204 0 Td +(real )Tj +1.981 0 Td +(w)Tj +0.766 0 Td +(orld )Tj +2.093 0 Td +(projects)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.01 0 Td +(logging )Tj +3.538 0 Td +(is )Tj +1.037 0 Td +(obligatory)Tj +4.243 0 Td +(. )Tj +0.648 0 Td +(No )Tj +1.704 0 Td +(one )Tj +1.982 0 Td +(questions )Tj +4.428 0 Td +(it. )Tj +1.204 0 Td +(Log )Tj +1.926 0 Td +(statements )Tj +4.871 0 Td +(are )Tj +1.703 0 Td +(usually)Tj +( )Tj +-39.143 -1.44 Td +(written )Tj +3.352 0 Td +(without )Tj +3.631 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.407 0 Td +(thinking )Tj +3.853 0 Td +(about )Tj +2.797 0 Td +(the )Tj +1.685 0 Td +(person )Tj +3.241 0 Td +(w)Tj +0.76 0 Td +(ho )Tj +1.463 0 Td +(needs )Tj +2.852 0 Td +(to )Tj +1.185 0 Td +(extr)Tj +1.599 0 Td +(act )Tj +1.629 0 Td +(the )Tj +1.685 0 Td +(interesting )Tj +4.797 0 Td +(information. )Tj +-36.92 -1.44 Td +(In )Tj +1.136 0 Td +(fact)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.108 0 Td +(there )Tj +2.469 0 Td +(should )Tj +3.193 0 Td +(be )Tj +1.358 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.191 0 Td +(a )Tj +0.802 0 Td +(stakeholder )Tj +5.248 0 Td +(interested )Tj +4.47 0 Td +(in )Tj +1.136 0 Td +(log )Tj +/C2_0 1 Tf +1.636 0 Td +<005D>Tj +/TT0 1 Tf +(les. )Tj +2.266 0 Td +(W)Tj +0.982 0 Td +(ithout )Tj +2.804 0 Td +(a )Tj +0.802 0 Td +(stakeholder)Tj +4.872 0 Td +(, )Tj +0.58 0 Td +(there )Tj +2.469 0 Td +(is )Tj +-41.533 -1.44 Td +(no requirement)Tj +/TT2 1 Tf +(,)Tj +/C2_0 1 Tf +<000100390046003C0001004B004700010046004700010042004D004B004C0041005D>Tj +/TT0 1 Tf +(cation)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( for writing logs. )Tj +1.8 -2.24 Td +(Logs )Tj +2.413 0 Td +(are )Tj +1.801 0 Td +(not )Tj +1.858 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.801 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.136 0 Td +(to )Tj +1.302 0 Td +(write, )Tj +2.913 0 Td +(process)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.941 0 Td +(and )Tj +2.08 0 Td +(read. )Tj +2.635 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.357 0 Td +(instance)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.275 0 Td +(the )Tj +1.802 0 Td +(impact )Tj +3.413 0 Td +(of )Tj +1.302 0 Td +(the )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.53 0 Td +(of )Tj +1.196 0 Td +(the )Tj +/TT3 1 Tf +1.696 0 Td +(ThreadPool)Tj +/TT0 1 Tf +(, )Tj +6.641 0 Td +(the )Tj +1.696 0 Td +(number )Tj +3.696 0 Td +(of )Tj +1.196 0 Td +(rejected )Tj +3.807 0 Td +(requests)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.113 0 Td +(and )Tj +1.974 0 Td +(the )Tj +1.696 0 Td +(actual )Tj +2.974 0 Td +(performance )Tj +-36.755 -1.44 Td +(of )Tj +1.175 0 Td +(the )Tj +1.675 0 Td +(REST )Tj +2.508 0 Td +(communication )Tj +7.121 0 Td +(are )Tj +1.674 0 Td +(particularly )Tj +5.231 0 Td +(interesting )Tj +4.787 0 Td +(at )Tj +1.119 0 Td +(runtime. )Tj +3.953 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +0.897 0 Td +(runtime )Tj +3.675 0 Td +(statistics )Tj +3.898 0 Td +(can )Tj +1.897 0 Td +(be )Tj +-41.144 -1.44 Td +(logged )Tj +3.353 0 Td +(for )Tj +1.63 0 Td +(post-mortem )Tj +5.908 0 Td +(analysis)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.103 0 Td +(but )Tj +1.853 0 Td +(they )Tj +2.297 0 Td +(are )Tj +1.796 0 Td +(not )Tj +1.853 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.796 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.131 0 Td +(to )Tj +1.297 0 Td +(access )Tj +3.241 0 Td +(at )Tj +1.241 0 Td +(runtime. )Tj +4.075 0 Td +(Ev)Tj +0.988 0 Td +(en )Tj +-41.144 -1.44 Td +(tri)Tj +0.871 0 Td +(vial processing requires )Tj +/TT3 1 Tf +(grep)Tj +/TT0 1 Tf +( or )Tj +/TT3 1 Tf +(awk)Tj +/TT0 1 Tf +( commands. )Tj +0.929 -2.24 Td +(Although )Tj +(I )Tj +(ha)Tj +5.808 0 Td +(v)Tj +0.488 0 Td +(e )Tj +(root )Tj +(access )Tj +(to )Tj +(the )Tj +(serv)Tj +10.272 0 Td +(er )Tj +(and )Tj +(could )Tj +/C2_0 1 Tf +<00410046005E>Tj +/TT0 1 Tf +(uence )Tj +(the )Tj +(log )Tj +/C2_0 1 Tf +<005D>Tj +/TT0 1 Tf +(le )Tj +(format, )Tj +(I )Tj +(w)Tj +19.495 0 Td +(as )Tj +(just )Tj +(too)Tj +( )Tj +-37.863 -1.44 Td +(lazy )Tj +2.24 0 Td +(to )Tj +/TT3 1 Tf +1.296 0 Td +(grep)Tj +/TT0 1 Tf +( )Tj +2.862 0 Td +(for )Tj +1.629 0 Td +(the )Tj +1.796 0 Td +(interesting )Tj +4.908 0 Td +(information )Tj +5.464 0 Td +(,so )Tj +1.685 0 Td +(I )Tj +0.74 0 Td +(used )Tj +2.463 0 Td +(a )Tj +/TT3 1 Tf +0.962 0 Td +(tail )Tj +3.184 0 Td +(-n500 )Tj +3.785 0 Td +(-f )Tj +1.984 0 Td +(\205/server.log)Tj +/TT0 1 Tf +( )Tj +-34.999 -1.44 Td +(command )Tj +4.686 0 Td +(instead. )Tj +(T)Tj +4.124 0 Td +(he )Tj +/TT3 1 Tf +1.408 0 Td +(tail)Tj +/TT0 1 Tf +( )Tj +2.753 0 Td +(command )Tj +4.686 0 Td +(pro)Tj +1.433 0 Td +(vides )Tj +2.575 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.464 0 Td +(with )Tj +2.242 0 Td +(only )Tj +2.242 0 Td +(a )Tj +0.852 0 Td +(recent )Tj +3.019 0 Td +(few )Tj +1.908 0 Td +(lines )Tj +2.353 0 Td +(of )Tj +1.186 0 Td +(a )Tj +0.852 0 Td +(log )Tj +/C2_0 1 Tf +1.686 0 Td +<005D>Tj +/TT0 1 Tf +(le. )Tj +1.964 0 Td +(I )Tj +-41.922 -1.44 Td +(w)Tj +0.76 0 Td +(as )Tj +1.332 0 Td +(interested )Tj +4.611 0 Td +(only )Tj +2.333 0 Td +(in )Tj +1.277 0 Td +(the )Tj +1.777 0 Td +(latest )Tj +2.666 0 Td +(output )Tj +3.223 0 Td +(and )Tj +2.055 0 Td +(r)Tj +0.321 0 Td +(arely )Tj +2.554 0 Td +(used )Tj +2.444 0 Td +(the )Tj +1.777 0 Td +(log )Tj +/C2_0 1 Tf +1.777 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.166 0 Td +(for )Tj +1.61 0 Td +(problem )Tj +4.055 0 Td +(analysis. )Tj +4.111 0 Td +(F)Tj +0.455 0 Td +(or )Tj +-41.311 -1.44 Td +(monitoring )Tj +5.105 0 Td +(and )Tj +1.993 0 Td +(administr)Tj +3.989 0 Td +(ation )Tj +2.549 0 Td +(purposes)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.466 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient, )Tj +3.327 0 Td +(aggregated, )Tj +5.326 0 Td +(real-time )Tj +4.214 0 Td +(access )Tj +3.159 0 Td +(to )Tj +1.215 0 Td +(the )Tj +1.715 0 Td +(current )Tj +-39.144 -1.44 Td +(state of the system is more interesting than historical data.)Tj +1.8 -2.24 Td +(If )Tj +1.183 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.739 0 Td +(are )Tj +1.96 0 Td +(not )Tj +2.017 0 Td +(interested )Tj +4.795 0 Td +(in )Tj +1.461 0 Td +(historical )Tj +4.573 0 Td +(data, )Tj +2.739 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.127 0 Td +(Management )Tj +6.239 0 Td +(Extensions )Tj +5.129 0 Td +(\(JMX\) )Tj +2.961 0 Td +(\()Tj +(http://)Tj +-39.42 -1.44 Td +(w)Tj +0.806 0 Td +(w)Tj +0.806 0 Td +(w)Tj +0.732 0 Td +(.)Tj +0.306 0 Td +(o)Tj +0.584 0 Td +(r)Tj +0.349 0 Td +(a)Tj +0.528 0 Td +(c)Tj +0.528 0 Td +(l)Tj +0.306 0 Td +(e)Tj +0.528 0 Td +(.)Tj +0.306 0 Td +(c)Tj +0.528 0 Td +(o)Tj +0.584 0 Td +(m)Tj +0.861 0 Td +(/)Tj +0.306 0 Td +(t)Tj +0.306 0 Td +(e)Tj +0.528 0 Td +(c)Tj +0.51 0 Td +(h)Tj +0.584 0 Td +(n)Tj +0.584 0 Td +(e)Tj +0.528 0 Td +(t)Tj +0.306 0 Td +(w)Tj +0.794 0 Td +(o)Tj +0.584 0 Td +(r)Tj +0.361 0 Td +(k)Tj +0.528 0 Td +(/)Tj +0.306 0 Td +(j)Tj +0.306 0 Td +(a)Tj +0.498 0 Td +(v)Tj +0.504 0 Td +(a)Tj +0.528 0 Td +(/)Tj +0.306 0 Td +(j)Tj +0.306 0 Td +(a)Tj +0.498 0 Td +(v)Tj +0.504 0 Td +(a)Tj +0.528 0 Td +(s)Tj +0.417 0 Td +(e)Tj +0.528 0 Td +(/)Tj +0.306 0 Td +(t)Tj +0.306 0 Td +(e)Tj +0.528 0 Td +(c)Tj +0.51 0 Td +(h)Tj +0.584 0 Td +(/)Tj +0.306 0 Td +(j)Tj +0.306 0 Td +(a)Tj +0.498 0 Td +(v)Tj +0.504 0 Td +(a)Tj +0.528 0 Td +(m)Tj +0.861 0 Td +(a)Tj +0.528 0 Td +(n)Tj +0.584 0 Td +(a)Tj +0.528 0 Td +(g)Tj +0.528 0 Td +(e)Tj +0.528 0 Td +(m)Tj +0.861 0 Td +(e)Tj +0.528 0 Td +(n)Tj +0.584 0 Td +(t)Tj +0.306 0 Td +(-)Tj +0.361 0 Td +(1)Tj +0.584 0 Td +(4)Tj +0.584 0 Td +(0)Tj +0.584 0 Td +(5)Tj +0.584 0 Td +(2)Tj +0.584 0 Td +(5)Tj +0.584 0 Td +(.)Tj +0.306 0 Td +(h)Tj +0.584 0 Td +(t)Tj +0.306 0 Td +(m)Tj +0.861 0 Td +(l)Tj +0.306 0 Td +(\) )Tj +1.07 0 Td +(i)Tj +0.306 0 Td +(s )Tj +1.181 0 Td +(e)Tj +0.528 0 Td +(a)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 446.615 265.2001 Tm +(s)Tj +0.417 0 Td +(i)Tj +0.306 0 Td +(e)Tj +0.528 0 Td +(r )Tj +1.125 0 Td +(t)Tj +0.306 0 Td +(o)Tj +( )Tj +-41.644 -1.44 Td +(implement )Tj +4.963 0 Td +(and )Tj +1.963 0 Td +(access )Tj +3.129 0 Td +(than )Tj +2.241 0 Td +(logging. )Tj +3.797 0 Td +(Current )Tj +3.574 0 Td +(JDKs )Tj +2.407 0 Td +(come )Tj +2.74 0 Td +(with )Tj +/TT3 1 Tf +2.241 0 Td +(jconsole)Tj +/TT0 1 Tf +( )Tj +5.152 0 Td +(and )Tj +/TT3 1 Tf +1.963 0 Td +(jvisualvm)Tj +/TT0 1 Tf +(. )Tj +6.03 0 Td +(Both )Tj +-40.199 -1.44 Td +(are )Tj +1.764 0 Td +(capable )Tj +3.821 0 Td +(of )Tj +1.265 0 Td +(pro)Tj +1.433 0 Td +(viding )Tj +3.099 0 Td +(real-time )Tj +4.264 0 Td +(monitoring )Tj +5.155 0 Td +(of )Tj +1.265 0 Td +(JMX )Tj +2.209 0 Td +(beans. )Tj +3.173 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.543 0 Td +(the )Tj +1.765 0 Td +(MBean )Tj +3.487 0 Td +(Bro)Tj +1.488 0 Td +(wser )Tj +2.431 0 Td +(plug)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(in )Tj +-39.143 -1.44 Td +(\()Tj +0.31 0 Td +(h)Tj +0.588 0 Td +(t)Tj +0.31 0 Td +(t)Tj +0.31 0 Td +(p)Tj +0.588 0 Td +(s)Tj +0.421 0 Td +(:)Tj +0.31 0 Td +(/)Tj +0.31 0 Td +(/)Tj +0.31 0 Td +(v)Tj +0.532 0 Td +(i)Tj +0.31 0 Td +(s)Tj +0.421 0 Td +(u)Tj +0.588 0 Td +(a)Tj +0.532 0 Td +(l)Tj +0.31 0 Td +(v)Tj +0.532 0 Td +(m)Tj +0.865 0 Td +(.)Tj +0.31 0 Td +(d)Tj +0.588 0 Td +(e)Tj +0.532 0 Td +(v)Tj +0.44 0 Td +(.)Tj +0.31 0 Td +(j)Tj +0.31 0 Td +(a)Tj +0.502 0 Td +(v)Tj +0.508 0 Td +(a)Tj +0.532 0 Td +(.)Tj +0.31 0 Td +(n)Tj +0.588 0 Td +(e)Tj +0.532 0 Td +(t)Tj +0.31 0 Td +(/)Tj +0.31 0 Td +(p)Tj +0.588 0 Td +(l)Tj +0.31 0 Td +(u)Tj +0.588 0 Td +(g)Tj +0.532 0 Td +(i)Tj +0.31 0 Td +(n)Tj +0.588 0 Td +(s)Tj +0.421 0 Td +(.)Tj +0.31 0 Td +(h)Tj +0.588 0 Td +(t)Tj +0.31 0 Td +(m)Tj +0.865 0 Td +(l)Tj +0.31 0 Td +(#)Tj +0.588 0 Td +(a)Tj +0.502 0 Td +(v)Tj +0.508 0 Td +(a)Tj +0.532 0 Td +(i)Tj +0.31 0 Td +(l)Tj +0.31 0 Td +(a)Tj +0.532 0 Td +(b)Tj +0.588 0 Td +(l)Tj +0.31 0 Td +(e)Tj +0.532 0 Td +(_)Tj +0.532 0 Td +(p)Tj +0.588 0 Td +(l)Tj +0.31 0 Td +(u)Tj +0.588 0 Td +(g)Tj +0.532 0 Td +(i)Tj +0.31 0 Td +(n)Tj +0.588 0 Td +(s)Tj +0.421 0 Td +(\))Tj +0.31 0 Td +(, )Tj +0.98 0 Td +(V)Tj +0.662 0 Td +(i)Tj +0.31 0 Td +(s)Tj +0.421 0 Td +(u)Tj +0.588 0 Td +(a)Tj +0.532 0 Td +(l)Tj +0.31 0 Td +(V)Tj +0.699 0 Td +(M )Tj +1.683 0 Td +(f)Tj +0.31 0 Td +(u)Tj +0.588 0 Td +(l)Tj +0.31 0 Td +(l)Tj +0.31 0 Td +(y )Tj +1.294 0 Td +(s)Tj +0.421 0 Td +(u)Tj +0.588 0 Td +(p)Tj +0.588 0 Td +(e)Tj +0.532 0 Td +(r)Tj +0.365 0 Td +(s)Tj +0.421 0 Td +(e)Tj +0.532 0 Td +(d)Tj +0.588 0 Td +(e)Tj +0.532 0 Td +(s )Tj +-41.811 -1.44 Td +(JConsole)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +(All )Tj +1.539 0 Td +(interesting )Tj +4.762 0 Td +(attributes )Tj +4.262 0 Td +(need )Tj +2.428 0 Td +(to )Tj +1.15 0 Td +(be )Tj +1.372 0 Td +(exposed )Tj +3.873 0 Td +(as )Tj +1.205 0 Td +(getters )Tj +3.094 0 Td +(in )Tj +1.15 0 Td +(an )Tj +1.372 0 Td +(interface )Tj +4.039 0 Td +(that )Tj +1.928 0 Td +(has )Tj +1.761 0 Td +(a )Tj +0.816 0 Td +(name )Tj +2.705 0 Td +(ending )Tj +-39.254 -1.44 Td +(with )Tj +/TT3 1 Tf +2.251 0 Td +(MBean)Tj +/TT0 1 Tf +( )Tj +3.362 0 Td +(\(see )Tj +2.028 0 Td +(Listing )Tj +3.14 0 Td +(17\). )Tj +1.955 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.584 0 Td +(naming )Tj +3.584 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.085 0 Td +(is )Tj +1.028 0 Td +(important; )Tj +4.807 0 Td +(if )Tj +0.917 0 Td +(it )Tj +0.917 0 Td +(is )Tj +1.028 0 Td +(not )Tj +1.751 0 Td +(follo)Tj +1.934 0 Td +(wed, )Tj +2.473 0 Td +(the )Tj +1.695 0 Td +(class )Tj +-40.144 -1.44 Td +(will not be recognized as MBean.)Tj +/TT3 1 Tf +0 -1.79 TD +(public interface XRayMonitoringMBean {)Tj +T* +( public int getNrOfRejectedJobs\(\);)Tj +T* +( public long getXRayPerformance\(\);)Tj +0 -1.79 TD +( public long getWorstXRayPerformance\(\);)Tj +ET + +endstream +endobj +93 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 95 0 R>>endobj +94 0 obj<>endobj +95 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(36)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( public long getWorstApplicationPerformance\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( public long getApplicationPerformance\(\);)Tj +0 -1.79 TD +( public void reset\(\);)Tj +T* +(})Tj +/C2_0 1 Tf +1.8 -2.24 Td +<00280041004B004C00410046003F0001000E0014001700010020003D005D>Tj +/TT0 1 Tf +(nition of the MBean Interface)Tj +0 -2.24 TD +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.47 0 Td +(XRayMonitoringMBean)Tj +/TT0 1 Tf +( )Tj +11.816 0 Td +(interface )Tj +4.137 0 Td +(has )Tj +1.859 0 Td +(to )Tj +1.248 0 Td +(implemented )Tj +6.082 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.914 0 Td +(a )Tj +0.914 0 Td +(class )Tj +2.47 0 Td +(without )Tj +3.694 0 Td +(the )Tj +/TT1 1 Tf +1.748 0 Td +(MBean)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +-39.2 -1.44 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(x )Tj +2.696 0 Td +(\(see )Tj +2.084 0 Td +(Listing )Tj +3.196 0 Td +(17\). )Tj +2.048 0 Td +(All )Tj +1.64 0 Td +(getters )Tj +3.195 0 Td +(will )Tj +2.029 0 Td +(be )Tj +1.473 0 Td +(exposed )Tj +3.974 0 Td +(as )Tj +1.306 0 Td +(read)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(only )Tj +4.529 0 Td +(JMX )Tj +2.195 0 Td +(attributes )Tj +4.363 0 Td +(in )Tj +1.251 0 Td +(the )Tj +1.751 0 Td +(JConsole )Tj +4.197 0 Td +(/ )Tj +-41.922 -1.44 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.998 0 Td +(MBean )Tj +3.497 0 Td +(plug-in. )Tj +3.702 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.497 0 Td +(method )Tj +/TT1 1 Tf +3.72 0 Td +(reset)Tj +/TT0 1 Tf +( )Tj +3.442 0 Td +(will )Tj +2.053 0 Td +(appear )Tj +3.386 0 Td +(as )Tj +1.33 0 Td +(a )Tj +0.941 0 Td +(button. )Tj +3.425 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.497 0 Td +(implementation )Tj +7.221 0 Td +(of )Tj +/TT1 1 Tf +-41.366 -1.44 Td +(X)Tj +0.642 0 Td +(R)Tj +0.642 0 Td +(a)Tj +0.642 0 Td +(y)Tj +0.642 0 Td +(M)Tj +0.642 0 Td +(o)Tj +0.642 0 Td +(n)Tj +0.642 0 Td +(i)Tj +0.642 0 Td +(t)Tj +0.642 0 Td +(o)Tj +0.642 0 Td +(r)Tj +0.642 0 Td +(i)Tj +0.642 0 Td +(n)Tj +0.642 0 Td +(g)Tj +0.642 0 Td +(M)Tj +0.642 0 Td +(B)Tj +0.642 0 Td +(e)Tj +0.642 0 Td +(a)Tj +0.642 0 Td +(n)Tj +/TT0 1 Tf +( )Tj +1.399 0 Td +(i)Tj +0.32 0 Td +(s )Tj +1.188 0 Td +(t)Tj +0.32 0 Td +(r)Tj +0.375 0 Td +(i)Tj +0.302 0 Td +(v)Tj +0.542 0 Td +(i)Tj +0.32 0 Td +(a)Tj +0.542 0 Td +(l)Tj +0.32 0 Td +(. )Tj +1.077 0 Td +(I)Tj +0.32 0 Td +(t )Tj +1.077 0 Td +(j)Tj +0.32 0 Td +(u)Tj +0.598 0 Td +(s)Tj +0.431 0 Td +(t )Tj +1.077 0 Td +(e)Tj +0.542 0 Td +(x)Tj +0.542 0 Td +(p)Tj +0.598 0 Td +(o)Tj +0.598 0 Td +(s)Tj +0.431 0 Td +(e)Tj +0.542 0 Td +(s )Tj +1.188 0 Td +(t)Tj +0.32 0 Td +(h)Tj +0.598 0 Td +(e )Tj +1.299 0 Td +(e)Tj +0.542 0 Td +(x)Tj +0.542 0 Td +(i)Tj +0.32 0 Td +(s)Tj +0.431 0 Td +(t)Tj +0.32 0 Td +(i)Tj +0.32 0 Td +(n)Tj +0.598 0 Td +(g )Tj +1.299 0 Td +(s)Tj +0.431 0 Td +(t)Tj +0.32 0 Td +(a)Tj +0.542 0 Td +(t)Tj +0.32 0 Td +(i)Tj +0.32 0 Td +(s)Tj +0.431 0 Td +(t)Tj +0.32 0 Td +(i)Tj +0.32 0 Td +(c)Tj +0.542 0 Td +(s )Tj +1.188 0 Td +(f)Tj +0.32 0 Td +(r)Tj +0.375 0 Td +(o)Tj +0.598 0 Td +(m )Tj +1.632 0 Td +(t)Tj +0.32 0 Td +(h)Tj +0.598 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +( \(see Listing 18\).)Tj +/TT1 1 Tf +0 -4.03 TD +(public class XRayMonitoring implements XRayMonitoringMBean{)Tj +0 -1.79 TD +( )Tj +T* +( public final static String JMX_NAME = XRayMonitoring.class.getName\(\);\ )Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public int getNrOfRejectedJobs\(\) {)Tj +T* +( return HTTPRequestRESTInterceptor.getNrOfRejectedJobs\(\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public long getXRayPerformance\(\) {)Tj +T* +( return HTTPRequestRESTInterceptor.getXRayPerformance\(\);)Tj +T* +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public long getApplicationPerformance\(\) {)Tj +T* +( return HTTPRequestRESTInterceptor.getApplicationPerformance\(\);\ )Tj +T* +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public void reset\(\) {)Tj +ET + +endstream +endobj +96 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 97 0 R>>endobj +97 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(37)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( HTTPRequestRESTInterceptor.resetStatistics\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public long getWorstXRayPerformance\(\) {)Tj +T* +( return HTTPRequestRESTInterceptor.getWorstXRayPerformance\(\);)Tj +T* +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public long getWorstApplicationPerformance\(\) {)Tj +T* +( return )Tj +0 -0.99 TD +(HTTPRequestRESTInterceptor.getWorstApplicationPerformance\(\);)Tj +0 -1.79 TD +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 18: Implementation of the MBean Interface)Tj +1.8 -2.24 Td +(A)Tj +0.764 0 Td +(n )Tj +1.383 0 Td +(i)Tj +0.375 0 Td +(n)Tj +0.653 0 Td +(s)Tj +0.486 0 Td +(t)Tj +0.375 0 Td +(a)Tj +0.597 0 Td +(n)Tj +0.653 0 Td +(c)Tj +0.597 0 Td +(e )Tj +1.327 0 Td +(o)Tj +0.653 0 Td +(f )Tj +1.105 0 Td +(t)Tj +0.375 0 Td +(h)Tj +0.653 0 Td +(e )Tj +/TT1 1 Tf +1.327 0 Td +(X)Tj +0.698 0 Td +(R)Tj +0.698 0 Td +(a)Tj +0.698 0 Td +(y)Tj +0.698 0 Td +(M)Tj +0.698 0 Td +(o)Tj +0.698 0 Td +(n)Tj +0.698 0 Td +(i)Tj +0.698 0 Td +(t)Tj +0.698 0 Td +(o)Tj +0.698 0 Td +(r)Tj +0.698 0 Td +(i)Tj +0.698 0 Td +(n)Tj +0.698 0 Td +(g)Tj +/TT0 1 Tf +( )Tj +1.427 0 Td +(c)Tj +0.597 0 Td +(l)Tj +0.375 0 Td +(a)Tj +0.597 0 Td +(s)Tj +0.486 0 Td +(s )Tj +1.216 0 Td +(h)Tj +0.653 0 Td +(a)Tj +0.597 0 Td +(s )Tj +1.216 0 Td +(t)Tj +0.375 0 Td +(o )Tj +1.383 0 Td +(b)Tj +0.653 0 Td +(e )Tj +1.327 0 Td +(r)Tj +0.43 0 Td +(e)Tj +0.597 0 Td +(g)Tj +0.597 0 Td +(i)Tj +0.375 0 Td +(s)Tj +0.486 0 Td +(t)Tj +0.375 0 Td +(e)Tj +0.597 0 Td +(r)Tj +0.43 0 Td +(e)Tj +0.597 0 Td +(d )Tj +1.383 0 Td +(a)Tj +0.597 0 Td +(t )Tj +1.105 0 Td +(t)Tj +0.375 0 Td +(h)Tj +0.653 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(PlatformMBeanServer)Tj +/TT0 1 Tf +(. )Tj +12.04 0 Td +(It )Tj +0.916 0 Td +(is )Tj +1.027 0 Td +(similar )Tj +3.249 0 Td +(to )Tj +1.194 0 Td +(CORB)Tj +2.685 0 Td +(A )Tj +1.027 0 Td +(or )Tj +1.249 0 Td +(RMI )Tj +2.138 0 Td +(skeleton )Tj +3.917 0 Td +(registr)Tj +2.599 0 Td +(ation; )Tj +2.806 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.472 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.86 0 Td +(to )Tj +1.194 0 Td +(pass)Tj +( )Tj +-40.366 -1.44 Td +(the )Tj +1.777 0 Td +(instance )Tj +4 0 Td +(and )Tj +2.055 0 Td +(its )Tj +1.388 0 Td +(unique )Tj +3.445 0 Td +(name. )Tj +3.036 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.499 0 Td +(name, )Tj +3.11 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.721 0 Td +(has )Tj +1.888 0 Td +(to )Tj +/C2_0 1 Tf +1.277 0 Td +<005D>Tj +/TT0 1 Tf +(t )Tj +1.277 0 Td +(a )Tj +/C2_0 1 Tf +0.943 0 Td +<0048004A003D003C003D005D>Tj +/TT0 1 Tf +(ned )Tj +5.056 0 Td +(sc)Tj +0.871 0 Td +(heme. )Tj +3.11 0 Td +(It )Tj +0.999 0 Td +(is )Tj +1.11 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(composite )Tj +4.88 0 Td +(name )Tj +2.823 0 Td +(that )Tj +2.046 0 Td +(is )Tj +1.101 0 Td +(composed )Tj +4.88 0 Td +(of )Tj +1.268 0 Td +(the )Tj +1.768 0 Td +(actual )Tj +3.046 0 Td +(name )Tj +2.823 0 Td +(and )Tj +2.046 0 Td +(the )Tj +1.768 0 Td +(type )Tj +2.268 0 Td +(separ)Tj +2.266 0 Td +(ated )Tj +2.268 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.934 0 Td +(a )Tj +0.934 0 Td +(colon )Tj +2.88 0 Td +(\(see )Tj +-40.533 -1.44 Td +(Listing 19\).)Tj +/TT1 1 Tf +0 -1.79 TD +(public class JMXRegistry {)Tj +T* +( private MBeanServer mbs = null;)Tj +0 -1.79 TD +( public JMXRegistry\(\){)Tj +0 -1.79 TD +( this.init\(\);)Tj +T* +( })Tj +T* +( public void init\(\){)Tj +T* +( this.mbs = ManagementFactory.getPlatformMBeanServer\(\); )Tj +T* +( })Tj +T* +( public void rebind\(String name,Object mbean\){)Tj +T* +( ObjectName mbeanName=null;)Tj +T* +( String compositeName=null;)Tj +0 -1.79 TD +( try {)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 77.9 Tm +( compositeName = )Tj +/TT2 1 Tf +(name + ":type=" + mbean.getClass\(\).getName)Tj +ET +Q + +endstream +endobj +98 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 99 0 R>>endobj +99 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(38)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +(\(\))Tj +/TT2 1 Tf +(;)Tj +ET +Q +BT +/TT2 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( mbeanName = new ObjectName\(compositeName\);)Tj +0 -1.79 TD +( } catch \(MalformedObjectNameException ex\) {)Tj +T* +( throw new IllegalArgumentException\("The name:" + )Tj +0 -0.99 TD +(compositeName + " is invalid !"\);)Tj +0 -1.79 TD +( })Tj +T* +( try {)Tj +T* +( if\(this.mbs.isRegistered\(mbeanName\)\){)Tj +T* +( )Tj +7.2 0 Td +(this.mbs.unregisterMBean\(mbeanName\);)Tj +-7.2 -1.79 Td +( })Tj +T* +( )Tj +/TT1 1 Tf +(this.mbs.registerMBean\(mbean,mbeanName\);)Tj +/TT2 1 Tf +T* +( } catch \(InstanceAlreadyExistsException ex\) {)Tj +T* +( throw new IllegalStateException\("The mbean: " + )Tj +0 -0.99 TD +(mbean.getClass\(\).getName\(\) + " with the name: " + compositeName + " \ )Tj +T* +(already exists !",ex\);)Tj +0 -1.79 TD +( } catch \(NotCompliantMBeanException ex\) {)Tj +T* +( throw new IllegalStateException\("The mbean: " + )Tj +0 -0.99 TD +(mbean.getClass\(\).getName\(\) + " with the name "+ compositeName + " is\ )Tj +0 -0.99 TD +(not compliant JMX bean: " +ex,ex\);)Tj +0 -1.79 TD +( } catch \(MBeanRegistrationException ex\) {)Tj +T* +( throw new RuntimeException\("The mbean: " + mbean.getClass)Tj +0 -0.99 TD +(\(\).getName\(\) + " with the name "+ compositeName + " cannot be )Tj +T* +(registered. Reason: " +ex,ex\);)Tj +0 -1.79 TD +( } catch \(InstanceNotFoundException ex\) {)Tj +T* +( throw new RuntimeException\("The mbean: " + mbean.getClass)Tj +0 -0.99 TD +(\(\).getName\(\) + " with the name "+ compositeName + " not found - and \ )Tj +T* +(cannot be deregistered. Reason: " +ex,ex\);)Tj +0 -1.79 TD +( })Tj +T* +( })Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 19: )Tj +4.688 0 Td +(A JMX Registr)Tj +5.878 0 Td +(ation Utility)Tj +-8.766 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.407 0 Td +(type )Tj +2.185 0 Td +(of )Tj +1.185 0 Td +(the )Tj +1.685 0 Td +(MBean )Tj +3.407 0 Td +(is )Tj +1.018 0 Td +(deri)Tj +1.649 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.407 0 Td +(from )Tj +2.351 0 Td +(the )Tj +1.685 0 Td +(fully )Tj +/C2_0 1 Tf +2.241 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(ed )Tj +4.131 0 Td +(class )Tj +2.407 0 Td +(name )Tj +2.74 0 Td +(and )Tj +1.963 0 Td +(passed )Tj +3.241 0 Td +(as )Tj +1.24 0 Td +(a )Tj +0.851 0 Td +(string.)Tj +( )Tj +-39.588 -1.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.378 0 Td +(JMX )Tj +2.1 0 Td +(name )Tj +2.711 0 Td +(is )Tj +0.989 0 Td +(constructed )Tj +5.324 0 Td +(inside )Tj +/TT2 1 Tf +2.879 0 Td +(JMXRegistry )Tj +/TT0 1 Tf +7.246 0 Td +(\(see )Tj +1.989 0 Td +(Listing )Tj +3.101 0 Td +(19)Tj +/TT2 1 Tf +(\))Tj +/TT0 1 Tf +(. )Tj +2.22 0 Td +(V)Tj +0.612 0 Td +(arious )Tj +2.934 0 Td +(exceptions )Tj +4.935 0 Td +(that )Tj +1.934 0 Td +(are )Tj +-40.867 -1.44 Td +(caught )Tj +3.212 0 Td +(during )Tj +3.101 0 Td +(the )Tj +1.656 0 Td +(registr)Tj +2.599 0 Td +(ation )Tj +2.49 0 Td +(are )Tj +1.655 0 Td +(tr)Tj +0.599 0 Td +(ansformed )Tj +4.823 0 Td +(into )Tj +1.99 0 Td +(an )Tj +1.378 0 Td +(unc)Tj +1.594 0 Td +(hec)Tj +1.538 0 Td +(ked )Tj +/TT2 1 Tf +1.878 0 Td +(RuntimeException)Tj +/TT0 1 Tf +( )Tj +9.924 0 Td +(enric)Tj +2.149 0 Td +(hed)Tj +( )Tj +-40.588 -1.44 Td +(b)Tj +0.538 0 Td +(y a human)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(readable message. )Tj +12.984 0 Td +(T)Tj +0.511 0 Td +(he MBean is registered during the serv)Tj +16.437 0 Td +(er startup. )Tj +ET + +endstream +endobj +100 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 102 0 R>>endobj +101 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 291/Filter/FlateDecode/Width 812/Length 73470/Type/XObject/BitsPerComponent 8>>stream +HLYt<HGFGAEyFD] ʂ˪cApFu5v-d%Qh*QDT, (E4L/y;s=_ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0555hjjvpssnpwPWW]jׯbcca``177fTKOOV +899!00Gshhh@P,,,$==={L` 0@ 0 0d288!4$ s#ubmm +֦OIprtq_.lll?EVmmmѣGǏpssn?Bw60}zxx|ƍSb[>} -- =o߾EFFv)Xį]X#򀮮Rs511766Wɧ)QSS=-EOHk 4y{Ωe+33gϞœ'ODOW^Ŷm.< ֬Y#j7oޠV~\\LMMU< IIIؽ{7nݺ%ʩC}Bތ022´i$ޛO0 0LoCnk?UKa]*;wdawaуE(ߎY3'wk L,QH޽^E97ĨvB{jcRNhh3ww^{ݛ7oyرdiӦ}P GGG}IjŊR:t(n߾7o`ƌA9;v@CC}As:;;\K ' 055Ϭaee%H40f~ZU;;;1_{JgGq߾}hii˗K} 0 0%~Ä1(Uț| ==]mnNpk,F2I}ҋBða$U:+QQQTyN$tIL22Lr$''ƍxzO555Fff'SNgMMMR|ss3pM;v R]_WT! Ν;q]A߽{'t0}x~88Xx\/^,e˄&.--Ů]D?+33~kk+eddJÇs5]),,ߟ?fbhhks +\gJ;pݻ>}D|7_Ət|f઺9---}¥OxMff&ݺu={F9994}n{!ȈkJ}RgA:3t]ֶ[=ƃ_8 """"""""Z&Oi^*k1Ԅ=[+++/_0cXM˗G~XXX0 x^KyKoπy.N{щ'(22玀0FQQ{G[[3`cc#37nڴIOOOW.]4???JIIϟ3c|ŋTXXH.m_0aBwػҒq)ʇA-#ʮ]U3`www:t8_xx89 4F|fggy:\;۷){RaggG[lag+Wv{+8'苈ȯH6<.]s?h%IJ}𕙙VT=8T +|{|%**!{8>}'W]]M˖-e; \oPP]SS;CCC + soΝ;/m/8999_;W""""""""ZF6%vlȐ!+jW\\L>>>jr`zm_cUOclŋ\+9z5񜝝ٳ뱶f3f?~{u1cp?G3f``MFiiiX𻈈}AWR6QyM{~ wz̙szqϔ(`ﰷW^%JzEDDDDDDD~3,ў:N"+ݜu֛ w --Y8ް|;3Â.̧&&&\O8q9nܸAeiiIIII2 +}M/&+++j5]p1k׮%gggݻ_ٺu+(;}~ze||<2'?fmp}h}~:}/uK B1|xz-; qO:E޽t }ڿދ +W25!g'PjʟL 7o~3Oi`N3KM ,O˖p#=XXXi`N_SSCKcM2~߅{ +891<q/*,/43YJf:f&TLjItbҨLcRyL˙ "@Š?Pk}ܝd0~<~{7߄ KYׯe<֕CT]hz=yϞ>}޳AOE~D^100y65Q問?J/߂lmmebnnNr{}s^/=yye׮]o'y4%%eX\5ps~ |XwQ >{ngL>|PgϞ Wa + + +:{,{ǙDP=F} ahsA]|;3M􏚃c(m_ܬ!3鷜LYFi+hAxPo"Yd$8 +qxC~U6^J UTV^'-7ՑݿX^[[[䞒kZnii,XGC}fjjd7oJϩJJJd}}h!{^Yϟf^[HTRXXd+?"w444'NwDW8ȷqV}#mڴn߾-=2Ҽ]]vX^˗/n۶MsqQff&:u?~, gׯSyy9:UΕ߫)$$DW<==iΝtʙrssY><¿\?#SlÕjzOSυV:FjW5UW}{*ϣ@,FU4111ފ{%KPRR-_Օ&O,} +kkkJNNVٗ@yO={QQQgx^:K턄k~sR4339Xx^YCCCG?\:MMM庑 ~Os߸枔h2eϚ5K}o#O+|몼:9sPtt4-[L򈓓wokPC@:d?nnn߭{}=%gߟe!Fg>Ǐ9??gnn.\'?g9҄&>8888PPPq'|~}s;JKK 3}_ G2h_6g:p+S^N-$wW4 +ATR]]uͼX +UTTPgg'K&3```@VV7.%4nEJsڊ w`@iiiZאW􏍍 eggSddP0f/_Ћ/Wc +v244w9FkkkR(B!B7͝;\\\ B!P/Q^'###!B!ԋ+B!±* +B!p!B!"@!BǪ+B!±* +B!p:yeժU~JLLy?##:Dw`` jYYYIEEErB=݇ATRqq1kB!gw4 +ꃃtR(Z^zE[nko$h󔖖/sѢE߯侾kB!gwݻwRSSQUUkk׮i333jkkuKKK + tʢD&&&rԔONr?;;d̄ d%$$P@@\R$%%X[[?X233>ϯk͜G>|8l aaaHwkiiiRCJJ8sLu)8qmee%K2-tRrqqѪU󻒓Okmngp->B!V^ijj|:zSٳg%\t +g3fбch˖-r +< Z[[/Wƙc͚52z{{̙3zjBwݻN>-c.^H7n$GGG`[E'O8ZsREEɵӛ7ohǎx &^knn.H-ϟS__Oׯ{aݺu`:wd !)|yfjnn=JKKS=ɓ' ^sلB!p +s=7JWܹC^^^jy%8oooÇԩSeN JR>{{i…2sǣGHIOO>1%%%.Iz8sZ3{|5̛7Oqq<۷o 5upx;wwwkvvva*..&_19~HyJJXD1~$sa9 9Jf2sJȆ9csx6,y4~ucݏ|>g羯듚jk}z\޽Z' X;WvdNNʐ!CR6mkv]"""""-+zMiiرCBCCz۷okuuZJ\.&~$%%^gϞرuϯհ0z̘1h;wN:u䙳vݻw{QQw'goj+?~h7oػq+/_ΨmUL{Aw]CJJ~ڮȰԾF|IDN?k8+zws}^ eG˓[nyh軨%{E㺏}L>]>}* va^YVmsJUU̙3M8Q.?~>x 3gʵkפF޿oc~jcWΜ9h߷ѲpBr劼z旓cmԚuO>ֽ^^8y1ݿo߾]֯_/cs5k 4ɵk$33_777:HcҤIRSScԚ}òf;\ˮ]dƌ(RYY)UUU>sL9r>>/yyyB{~ڴ=z\.8^ymիWKYYo]C "+ ,-[gݷ|Ik>}ZG+]B'=K;VCB})q>[7^;v5-+/#GؿM/((*2e}̔ԩSyfʲϜ~l^ \9|,[LOMMs +..3t2bĈaÆjy )r<NENGԕEL+"ʔ[H13ތ 0c1h0=Two5ߜ3朳kk}>k׮_Q4k,'NPyy9? oCRSSiɒ%:Y #kvsg %ss';{y;; +hXQ LfE66vԻwoR@OvrR{t ݻE9LFtI + p .t|eذaz+w޽Rrssk5jȑ#GZbM<^zE999:A...0A bT*Vn]ee%c}}dz?ۗHAAc`'| ;$ˣGv{'+#FS0rvv¢՜ E$)KGbnҧOVXn1$#.(xp؟hIgʍ7˗7k׮ї/_hԨQa߾}q鍯ܺuhڴi.]5ٳg[׏ϱH-l2^~Zgffw<+WRFF똛NHH͜9hѢE{ޝB iΜ9] 1AoboojkkiVysϟ?Y4 ;wЕ+Wxl:Oqqq4w\Zf &pؗׯ_իiܳ?hZQƌCaaatz..WWW^`` Hr\7=ܪUhƌw^?uT:|0y'''7:^LJJJb]$ryHK,3ǽ@'22žWF]p߿wߒy1Vq6p%JJKKc< ~s#!-)Ux؃xn4ݓ\\\ۛ=||h@ # ty豤:Ʌ(./JaϝZ,-e9w-W2ur% F#͝⃞??8g;sppg"~w/R(U7޳B2oYyX~p6!t444Ж-[hѺq`͛7Sii)}_OII7\?~φC޾}.]y=i$ W%l,+vo)lH|POv닯TVVr޳g4iʔ)t|}g]^^,E&clݺ{WIgcڸq#ۂΩS8Mώ;x$uήA bD?o>^ބ~~~y|_x7AЇѣG< ao߾ݻYЧ`FWνرcT]]ͽ3rHzmx'mˌ[}RuGro `{<&'8 +t긧$~n?߼y?b/**b.'] + +0|;wˁ ,\ + [ p~{ѫW8Ws +680_p;a Ox/)); +_XFm$S+g}o]pa8ŅuaesrrX ,*q ӆ2; +_X_Kn`-_Oѱ?0>=uBG1>FFFW0ޣG1Zt ٳ' 0Paߚ}˕dkg1(C˜#6l:w!/o[p ~`O+ +X|c)_ؑ + #p`: >;2իȟ~XsOʹP\\xV.SZZݽ{s(񕸸8Їr YVV&ҕu6lhÇu +?%%eggnL\ͥF{{xw5k,@қ'_wc vfzN={n:=;jkhT/bM&hq1u2ƘUSZR"ҠB >Z[ZZ/O/sObr^83眵^G Zg9"NC_v^W8K.>L4?^ϔW;wB=|illlWt󖑑ߴ%g%nܸ!Yxʕ+WŘggxeM@0gֱFڵkR^^=hwZޒ Xzx%W`GZ-Q"}k8}GU^ GHqiU!#GUȨ1([$g Q7WXU"{hlN^qS\ZfWZA<aƕbyZW;w8p@uc{y0C0Tx53fOv]vw v;Zj+|C744hDӆ̘O֬Y#nݒ/Bxl" ,g݉'^QcMbG +ILLO&O> +bZZ;nkh +uoi $6p@գd^<}TzQ֮]gt|ccA=޹sKym_j=7s2|)))mG-6P7o,~j7CWlذ}ʬY4>>}n>@;$''7Mk2qD zܹsmQ]]o昕>FF+̙5D݃ +]tص֞6y|MbH + ^Ο?y 2z_چoZ˗?ԣGG;K\zUs"\:6my% +.z~`s^pwhG{b/g߾}2g}dղn:]G|[9{OUU:uJt]=y-RVV?^y55p5\soϧouHmUF)ׯ_zt8|An+<{Lv-999Ν+[nSO~~̙3&S;kjjҥK6{rEe!شiTO̞=[k/C+WԱNi׺{ɨ +uu,ɑ#G$//W~GбX-[ȢEl؇;/X5^am'Kgh\ \w-[~'9ζN^>HםG(FsD+&MR X|?t_$+/|JF~2`` +=u=lz=o1AR1+o`Z\s]S>R0SF~2h+䕤et-slY57s6^IMMȫJ?,ԒWuwuI'7N4q1++KL޽gƍl2=ʝ;w4_&&&jn3 +狳$ycxMvÇڵkU^ Bc;l}Eo۶M=}ڵK0z^fӣ+Z6"~K<~{4Wp$܂u1>h0x^;Y~2[֝=et ևh.85gL['={5N^'^̚0i{y=I2dh~^}̓Px~Y:tAya 印9W%8l?44\{!.Ma24@-(|敄 +4FqMX?h Xa5bHx%ѓ,p Izz_m:y5s{a~KMM})3qDŜkW}WKW_i|}Ξ=k +9KA˯VwKݘ͆W^y%%%3g;jҤIUmy1cƨZX1sƌ[!))I#>;&󑞞bz̍+_|5pGqZiii9~Tyz-ýa H̟}eι덑#G\יzE7X/2gŹ=rOY1Y1WΑ;_GٯzPk6< kt-fL?x-ZʣTހu9J~5oZG_m46sYG,!VmUN&d'!ʏ]R6-^9W;0W6ÄiWµ}}g^Jϕ~<ۯbxЛy4dǙ+N& UUU6<#" tįOGJ;s&B"~EA._1+ _A WG "~EA._1+ xA ~xį)WA_Yr%͛s + _ZdA 4#qh2 +Q/ ׯv"H$u5E ЉpWXf l6tUY,gϞF"DP]D EJEK{2et w5qD\~˖-CHH:aF7nW^Fbat"H01@}9z,kTzW򧽉^_5 +}RSSq1YVk<>oۇL&G\bb"VX'OW_~ + +Bpp0ƾ>}8rR5:r󜁁j|=lcN}]|T>s9eNe?ks|buY,ׅ ЀӧOTy/A3ɱjŋ}v^dݺux3޳lǞ5J{w ܹsgϞUkf·H$-O5<SH>ŠUh?c[xxzΒqݟ;lb^OOijtwCُƏW'ݩbW?~w+gܹ{_fvꯎ˗4_݀y 6kGh۸|*{-zzK~6/'[\Z›?yP{5z|w?Rf*oxgIM]ctq_|o|?1'K˖󸧭[KXe_ r+닅 %%%yr+Y7gL0Xv[+8uTMիWZyǎA||y%<<ؾ};|A"1Ǫ ǦLLLk.={>>>OyEEEͅ P]GHNNFGGAyy9󅑑+=h⠡GGG>[---hjjsСChmme"f"ɓ'+ױuVd2DFFNL(Q~I-X:I)06AĖTTU iƏΔc+0[8UյL>?YorgW7B7e9&V8]CB+`(y [S>>wjգX)[2E8[yfbʪ +5G 90D9K`H83CTvw1QZV. ޕ |(Hʼ>xBjhjFN^__e䣩>ܗ?Q/~!^eƕ_}/Dm6Y/\Bcڴio1Wn߾Lqh߼y3_9~WN>36 ^ģG'̙:1M]]G ;Z355}Jmm- N\B|" +q̚5^Q~#]]]tuu1CЀKzC<۫'╾> 򡺈I(;pOES('yl=!!AяyٳgGe) +M{qqxzF͜9עأ +QD +qZ ɕ} s-3|)3KuMRӲ {joݙ|RXL+#B"p +=+1"C@q +y&^6cxOj>JʐWPFľRSk5Nw Iў͈ǜČk_^#|׳ +~A{Kv;?Ldm SgvKaY4D:6Yy^U둝s6ͧDBs-݈ɓ'̳x%//ggQ?~)Sbb"Z[[xwdwW7L+O>bGcGyE+-uk} k+x06U'ٰsgnQwBw&ذq @{G"(}?0p3G+;`2,{Gӳplwu!0,DmEMgQ[[4iV!M+$=hV:88WhFWٳܰPyN:$9 .+.]b>#nػw/۞={XxCe]k׮;vhܸq)))fffC644'_O+,߿c۷,g2bbb SYPPr^W^"J)Jh&_͚0: _p SqH[VN>[#.U߃kvZ 5DZ2r=ѝ/ř7JcS /2kJ`!,4Q'srY\E=w$,vpM(Fv'H9|c90?畵_?ܦpLyxyDQ-2za+Aӹ|T[DmjdEB3kqq1jjjMMͷ:~WH){XkFp_){DwGcS ;h$(%,, JYY_և79Ab8 9>yC~~>_c,(//g'155///^o577s ~CX EEE{***b3ξA|2Ja_ޅZ-_~ڠ JJJfܸqFCCWZݻwDZ|쎆=1c\\I׀R_YU+Aܰ!>4i|n︆7:4K!/8Qt\Gu;efoo8~ ^W߀z/9ȨPs2B|Vîr<2wB"%-k輟Mwf'E;sZqe|_s)%Ψz2>iZq_o܂ ov"3k__~:Q0/q'/)%?=jAFoX#yJ}YPwfQ?I$Q*tFshBK  "H$HN[؜C!" |D"{)݋;wBV؜Chs8;;j C|E"H^F +WWWT*؜CannooQCA{H$؋   "H$c/JF_ AA]W$dE)3gDqq1<==?BAFD"{QC! #D"(|gϞEff&j5>WCPJ`` F A_=+D2nIIIh4,cjdggv zW$dE)+w܁9q-$''CVT&&&38wpp{Ǐ+PŠw]\\`gg3;h>'''XZZ}g 4Dښԣ;R54uƍ3>kzfcc}Q [WW}5 i +.dD"pbs͛7 EcY<..ׯ_Nj/ۋ&L4DKK >zO>ō70|YgiӦ111qdggcʕIx?~V^^@֮]K.59ȓ'OP\\۷osr֭c"4 .<{ W^ 5M$9r>|5ΝCDDqM'iiiW__^~o͛7zE  + /E?K$dw}ɸ{.mfDGGhn___444 ** +666 + +->yٳyHyP+(.SJJ +;=+ 嚬,vKr B5yyy7 .r5Z PWW"vrrR) |%#3E$D2QʻB~܌R +Z KKK'Ϙ2e +MGY̌kׇEޞ^@X[[yiii8s 1lOt7oƏ[[[+X8::Ԕz#_"Wl2jNʎAB;;;y fz7i Aax>+7 3gA;kD"f4/sF/|555سgZ-T*VXr֢MMMx;Atޟ8q /ڱcN ǿ//INwu|X&_}}a`x,R#$"۳ +n3 1k2:pgVaMҞKR%=?S Z?' ʓ'OpItuu 9@BCCw{XXX@T~:tHx?4jŷ:w5 33 +2LxũSZDFFرc5+‡OFZA֊Ǚ3g'j󕞞4a=60 f )puRL:,9g~Eڻm_ِ%b3ĮǦLGI9̅|ٳgn@1Sݍ2deea׮]ċ/Wr9ۋqo_d×rr-??0 G3TVVΝ;oJ?JKKsN477QQQ|˗ + EM[[x7;vb-^]z^L+O^C5 00W£␕[7⬗Y@&3_(wAhM\+Z I"\qu|׮]í[$''cpp>>>f!DP`xxnnn +*Jx@LL ,X` Aϧ#((>uuuyWTTU}|K| 9X\\-r=v SQPP7nyBCCyIehjjАp afv+Q1 -nki-ms8μ4~8z ľG\!Vr?Uo"U>W馭!_R1 03\_1ĮG~Q%,e29p8μj_4wcV{yEU+{='U˼+ 03+;q8μ}Ezddᗑf2ӧOjQTx9?bg 0LXAp8>rW{^+f2ej2lKKKh4,X#v0 ̔O?5gƨ}u'T8SES{ /7:Nurg7J5 pS.3v`Dszca3+9:/ևSK111vsTBM+5Ҹ\HH8|Ct 64 +ή^zk_17aa^1S_IbC:#oW<LcڀW^Hޚt +ΝGAaxnsťƅ="j p~컄'OaƤIyy{zw׷ЇIfp87C WmtY(kqou`rw`ao# hT_pU445ð: +71'#+#u_I諒VڿOuu5/^&q'gvI҉֋yK4Z=.o딕W"Hfpތ|;{"y׸~&aQseZڥ=n4յub:wu#bAy߈Z3>>y=z+VL;.#v{uu!,,샼 d222R>ȻCBBA͘}tlL"boY9>}ht6n/o5;=/,.0|bXW'|| + CD+V(֤y1kqUS%t +R}3w"iIO|GQZpP_AY%I)Q%*(cĀ.B$) *0@AnW=0੨sZO;rU#jY~;oWe}]鞙%JP0~w𡉓mIl{l)qO=|]#&-_<5Oyyydmm;FʗWRRR(<<*wh===);;}Jj5F?𜗗s1CCCСEGGFEEQhh(4J,ˠ 233ؘy~==FSHVVy{{sÃ9Fc r5a„F󧕆KCJs=24i +/۝з+ruf'?~CQ)6.&ЌR&l8d* lwѿqS>{tt+ЄđtL EZժVTp'7Z||6m{.HB ,_Nvfw!| F:~:_AJokĄ{>b``@ +{VWdөSa4H"##I&dmmMF禨 + /7o(hт^xAԣGj֬iӦ|f/]&jLȠ 2vdo|zƿ8ȲQxD {E9t?t1%ceeLYY%PsVUBM$StI-e;o_ڔ gMK_dl(qI{D)MpN6/CÇ%IڴiUWW[UU޻w^~v[lq $bnnN666s IGGٲeKj۶-ڒ!֪U+m===1b,|_Skcޕcƞ={ G3l$D___OR,,,x P|kPP +ֆT +A?mڴDnMMM]Sĭ˱)7##Zq <[֨c:!O/ևB0'C<İ+X +% W5ԕ?&!NQKGnG!vZ/9]wRf̃ y&''Sii)ٱOr0_[!hcm1a />g[A(|J߱cҢEϏ׏wRռpӧs S˗} r̩)s _֏7(ƌCǏ+9"oh+!߰[lmذXe-PG| +oYSmqYOV+ Ղ'-lhhp3_o%˨}G2mmIAO<%6l _b_p||;oᩲsyjժVU( glgbRݫ\ǥHSջ/]p"vjgڳw?I6qC+~2;w8MZIXޑR%r{ɉ/_N< //ZOVXA}׮]iǎSѣG85>>1իWi̙QSnn.ڵy)FEW\W^ѵkhȑΝK̹nKLSAW.]ٳgTVV ,OCcwx?`;lt}k>{r.?9sP`` ر#} O׭[&;;߼ykxΝ/A!==vM2'G`)R޷or'OܹC/`JMM|ݛ%Q3XTkDfRN佒OSLa|#s5kx!ruZp!c pttmp7o qO8M1/Κ\C%_G¹8q"?srJ"W `-9 ˗/,^BhG%_An Gnٳ5r ֭[nA7o;W^\Oֈuƌl(!!A fk?~<g ;/))ϟ95k(uq 3|ϯZ[~ _16kzC+1;ӧ=Mvmݶ?G$C:t&+5FGL[XڰMqq /o?ThAgr>_Wi/m/cOgEUjUPS'| ;wǦG(_aFY@p58l'Y R?fvQc\-_1.'gQ +޷mF , OuFK,a10yի)))tHHmܸ&M$BLuŋ_pp pLLLL8 + +,cBW;9@Lc\\W};`.^_51 +̠( R*Pj5-8VɌ&>1HBjmF~Tc[>=zы6LrWXkW6E hEGzC.oƌg]>Ѷk׮$gU| _yF3mhB#~WO* @rFEWiW\":5|hhhPmmm*((H& 2^<(sӧYj,22RxwD2sQL +$GR_{`iii-DDDy` <+,ye꽲RrFv P6s[Gr%Uzz9è!|e/Y|0WPf?1+P?ƾyOI]&''&|9EEEɾWWWY ʕ+%˗ ?+Inٳ%:W_j711QꪵC +y,Kiӹ,em-L +~ԅ=<'Frš xmȼ2Ooi+ygڗ^TTy?JH۹~;u_?^1;^7wxwkFLWM{3wTѣO*zz{c]\h+ +n6}}|'~oh*<*}oԚ?W4gϤC lݶCb1Gfj7tGV?{sl mv۶mnjo1)$$Dڜa =jyG#G|;qO4"~1ĉx^A[й"y uV(?2ߴNEr>pd-..- ktvvF3a8t sELyrc? ?RXX(Q6;2x>~~~#qI>fX8KKiiaѵhSZɑ>,J-74deeIc)sDU===Oj]6+srnݺ%}#N"qG^aO`-cJJJd +8p@mذA#^fȧsmm `bЦy3i,xty۷r^}Uccڳg :LHH_Y+((Hj| W}MO&ϺyOcTJj' PaˤtFcKIjҔ |RI)\ScT*!i92VXWs5Ws5ڗ^J M__w wKqMyC;(qF + Tӓͻ{N6(2:^% waxdmQ1 N0 lr9OgϞg$Ig -wv09Zth)oo||1EAAݰ u]'NБQWX!]t ^AG wycǎ/hg9^^~/[F߁Ayx&FB>>(#7{^9}ħVmm>(mԈ=;O :^k+777+G...guSXy}ּY }[ooʒ7m$u떜yzz +w1x^W+Ξ|qx=Z+nj~㝵2us̑7#=='s^n-^8qZj)%6mcWDs'&&FGkaRSS#s1qذa:_ʼyT||{c*$$D5552eh3GVs$oooY?<<\NGGM-[_L'0ƍM>WZZZ$`1xm^QF؜KoxUTT$i 5"A &CԒ֦: .?Wx&3}*hc`5g +uIk֬ Ϭg/88X:}`8+uHvuuYs69C䆚33y+--eM]V^gѢE0{^s™"*p& }6Mܲ6 ٯ*3,#A=;QE= +V̓ +P J!AFn4Ly3flԇ4>?Y/_BݺuKwPl+vX!)))it]P=[~W{5GAUc+m7ճzLh>`EQozii.S*_xoj~{o_th^blY0_`_B+)RB@E?UTT$t9󘑑 +*4`ͺ XX&<_xN͛ٳ-<ĕ+Wۋlv2~WWksQR)VV@S__/;Lu?eԬԱ666.\HeP]]-)oÇK\\ܰX===0]+55Phhޡ>rssE_aԚ u)Z9_>5"Aq\)--mXԱw;wZ{5 E9z,{>ԕC}777d@mG+ҋ{״5AżkxWYY`)/MW|Gzg|@ww뭭CYb's1Ο??=6m$-$$dX;ڙ>c6$7VUUd Qs 3+I< ׯ_>71\^Aϵk6l랞1ב#GT {{{QRzܻwxf)OxO?zJo$7׽Qs#1:,+=A+ XoVIO`\$㽖[w/qmOAt,]^KB]'18z wW̵ub:Z ٩vX˺:o$FކPP;4~E>* :W[."b%%%%w6#~k +jv`\{/[]uUObbh4 -+d`0 ""(--E__ ӧ}vÙppp@ss)^^^hllsjfԯ7=˚X~چV5ŇVƺ6TkFF^9C~3ϒ`ɄE@@^zO">>w dffNptTܾ}/^QXXs=z$겲...j3agg2<~/_ 0gCJůwr[$%%%v5b?INâE`kk+˖͛$&Ժjh4³Κ5K.666j3b3#TGk%~z$S%%%%}0Un4є{JIcȯT6b}B>Y_,p +<VmtCKDŽݞ CF5k;{BnLԢnqW+}jJ|6Eo_?vUYW쒒SW'z!xJ񏽻q +W'Ρ7H-iBim; @]<={3ۖǛ~d"|П'xp:LݟXibN 8y߽Dh? +~130 +Ŧ` 8 +KWˬW6&ў_yN膄0ũ5Bhɾh`NX;_ն6]!q=DzZC-vuj!;_ݟVƶ2afw[U m&]D$F9kL+]gWޝ=EE4ziۡGx<7 wcQ!,,ǟ|&CV9Xl3ϣʪezePu^O|5JKKED;vÌYظi >s?P Q(▭H;wRgvb LlBʴyƌL7_y,R'/{{0&<¦@Z9]Cnv~nJ5C9a@Z !CaDzY% P|>V#l1W$zqc\gY‡_ɲ|h|͸ig2,ck-8{y1c\yo3=׉L vZ||Ғ#cufC>2MAucEuėFc8dX֭/WSOSX[j܈5^j3`Ɩ5̲ԜF~N,11Oœ\cɣ2 tB MИFh]_N+Z/pBs]-=js->iX}m,^ uqV3 KFalqhwk^7XZuZ`;|xZ?`QqP;kї,܌zN.{}_`܅ؽ#g7}Nh~PGDm>&8:{9o`"ƨ!)Wܼ~hhY%ҘB^aY5.Foˬ}+,իU` o8FqJwkE~TWPEowuW:17jP aP֖> wmXsx5CMiUp 0ǝ.RSsPXd{5d xƧ_p kc%z6Tx;}x4Mg,ܞH|=Srui!XyJcDϸFj?4{,5oe2`LGxʝڲ_XAvx>Qz:2.-WwR{6/k}ElC3:2~/EAFĜg#rf7sy蕒K]aLS+|? wy ah^C~C,Z ǏbBg圶:ۊݻ` f9^ba|p +}xL=Ƒ8ZY=޴X`2ݬm|[@Lt:W ހN9&W2zve/{u9N<|d1z#VJfߵ\Kcy4ޣDƭ"iln斡6/W`_د ++Evk3oRu;sεWVq}IkJjLGets[{"ƶR9Z+T})sQCC4]q[+ȣl2*4oKsτK\# Q>s_ 6>gٿ?̗_]dpr>cQ:]0? +{9c}SL]r8_yλKf@y|SrIϘmm\/#*?`LJq$٫<"{@lSgKL5;w C2qR{c<.ōO +++4-Ǥ||qrHT(s6 +>02 JCRcqZ|%!9Cj/[b,_Sn1>kJʹyVv1 E"N9bŽnC8(b|4꽹CۢW>^?u=icFqi3FyrF5x2^Ȋ䴾7m,6e+/Zdq[D{^-69 e˶r$wI_VҞ#GK-?'jp۵WxW"z*o'\ /~&e~X.^Y:bW +fJ2qdζ?c_=-ʚdI[t,&P9_]̻fj1 {ʀ83l/xY ǀh,6мɡY)\kSzJW`rxT82*+p6uY]`zp{Xsyl( 3oԅ2AN?#reaR֭)S_+%k6 /wy8 moonCJ)9|d꽰9>Lmߕ媾x|iv:WpΘ.7I1:Nu&&#=>^=&9lS\?9_!OyV +ʐpĽ=ºPQ +=_EZM +G?B}óf:uArqO:(5y1Eڬz~yb咱p@%|9Wxg?^4ڸ?:>Ebl+_}qlbt+ٹR}mK&cM(u =ʷkn6WՏ1'T0L"^bKUgfKrz_[ǘgU<hmΜ='s-j s-X!V>b+pIBb4'套_B,噟1\~ ~;ݷUZ|ϿFHI9?E%[/7njOs;H̓yUXobË6<]%M}[h6 :orjk,ڞ6}<ҿ'69u 2gi-ϙo}z엓'~B}Gmd,VY?{u\+9;oUMg")4;)( LʖO>_a޳Qup~Vs͞crwώCAݍyYd^_<)>Y^<=|ePBG_Obҹ1Óʿ=ۋU*_q[\|&o]B{ 3))C~ ޑ7NNG},N)J[;+M+&|_llo]{q5_ZІ1?wޕ}`kb"If̺um`Qc0YZ!'8e9ى^'m4Mr?\#W|TW+y$f]Rsw'\ZMUǑ;KKk5-74d(^Sgs7eUv355U#4 8n 踃K#DqGDD'U$fܒ8jK&UIU*3:&r>It\s}?kQWhmf|޾i[qA}5W__KXҙM{}'e^'C~ϝș1/KOUWW$ӐI h[M +ˤYI~YӂJL&a袃笎臿ey A`r?xG +&VS7_{p hUp:hxG33r!c +8!fƘJ5 |eˬȅΆb9npgrgs\\ {We!.a&`'7iMXL )Ǧ,)ulWg5n | w +DFw4sxN\*Ya9FSA_KmCޑuF_9i[#x{skW|(Lε8R}e{Zg"C6aVj7_ SGx+x-P]as'<)s +gyV-T>Ÿj_P; +r`2~ +aFwvn 3{(_VZ_Q{)x3pZTk~hW^YҾ!`P|kTnAJ+'3j+ +;\I5wh_'8f{|sEvSz+(7l~ʍonR,3w>Y1-ه}ϊ oe=_KNˠH/xc7͹ݐbb㤏ʿJ {OJnP]Eh_QAinS|WN 9{A>{xQTYK9|3cW1U9B$[h+ sXm50g}T2;/Ei 1ې?kwodFkf.w0E0NfR0Ɔ'wĮy}L{\u1W_IM ͉g*5#3#ִ*MGap&Upx +bB9F}lDJggf ۳\-Q.3{!v<x}j_A-0ԡ>f߁!O|N+7j 9>\ؿS7iʁDg>Ū`b0[Mq +.8@ث{vyJ Ng!މc<ϒSW&8TaEpSgϞ cq%,zւ2c 7/4) OovC8RJZ&g.x_7IXWqgQz' _U}._Jxд&-1F̌R # >kT@c#'WY9ҧ\=%%)J[~+ynx+WIOp ǥO_|=w#ڼu(>e\OYIM`m&\_6io믯L5ns^4\WMx?jeO鷗S|r N# J=im]t&}z]k-:ޣ{F_g'y IgO;`Qc E|g0G5` +xV7;bM0{`i̠Z_+۠?*Ѫ3VqۦVe³Q48\[?)1`3WyfUv̏V4M+>Cėks&^ p~6ϓkǜ!X+`i^iA]W*oq:j}ZJ9c&BW;J_y<`&` +p*1w{J`H,ae\/c7x*ڶJ*QJCcihRaiKݑ(w-kE>+'=U>P_.}+.z<##Wj +1o0}c]cp\|Ç֮RI)FuxgΖ\Y7ڶ/CC^:ioJp ك[|Be]ɓ't]j8-- $r@3Ň(~eTP}R6VyuQڑ.:|}{*j#(qhaTvt/` g9 ++`ʅ|Fkyf^3PEx3p"_# bo`sp&oZһ\L;L0-[f.7DKuڈq>uC({u 'r:߀P.oDTdEC^ Z%B G(iMhcIR#ܪ`'>.ջ?aܵ SfRjC g^s95 +͛rE|NY<|N쓘^_XM99Wlq;\v1КS~Ms9LW!1#}G׻zUlCֲױv9_HEsj{OOWvvfsCN_sGܔ}c7N.^:y{[#7<~┧#1VD굿ڹOQSy}Oת:뗩~*b̒$P؅EiPN58ܓ|u8UƓĴG_Ml 䵉rΜE6JK;3W:%^=6+7n܀N:EXXX-iL_|*W[~9oOS`nӴ ] ^-oBJR`eeQ:yS 2"m)~k<鳋]gc[CxA:Um$^geVNxx%7`-xEXXXxe]ӫ}= U`~X9[Sݵnc/ +uq X]Dp!bޛ<ߟ`sp0ƪ{F~W. v^wcHǼ8&M-W=WVc{c})?}WȿeFbu~u}M}SygS~n^kuy mK?gu;X3v ޾0ym ,,,xvf#G èQud?w>3̜i {sss:mebbBu{!!!!!&my%6q½Kd!6~ k+RBҝ啐pouz"<JHH@kk+ + + +~;au::o!B¢/)ojX:|==Wn޼R\۷s|k uWaU~BY6 aj䔹p2\uIGݷ3=U߀0ܺuvNn:pOqO商puu"$$$$kY^ut˓"4"2{vX7ሌRgwo>΄II8xzVjG<1] )Ӹ)D:SMy{!Z",yz*;~FGi<9a߾}Xt)\\\`hh8FFF;睁O>?433<<< $\L{{{>366cQKqo'1َ([[_k/}(.q9͡P(x?I=Vʁ xl]~4ޠA4|1>4&[---Zt_ԟQ47ƢuR_~-} + DuW!>>8icS?O<=la/wi:]~\؄X?g¯9q8JtZI̘eJVs +^y$2:gT}՝º77`Pg_W[[I"IT6>,, r +X.ѿ?Ʃؿ?{6ɓ˃jGt._JN8!-- 2\p/^ߣVVVw^䠤ݻCgxNH;zGAkk+Ν;78talٲUUUHLLTq[hh(]㭯ߩ]JJjݤ%XljBBBBᕟ~+ހ/-I˦'oPPɐ)JЋHdhߊJ>J!BH ;&W +z +IL5}!$̷fp묽:gvƶV01[񪺶u:wBԹR~?)*2.J/?0u0#N!̎zO}22s=,ږ, 4sx[gmOg|/s-'RZfVX}az>^ykdmsmm+ݟ +5~+R>ƒY{ɞvn4;› ++7Z_HOR2qV#&$ok-oxXXpATT:wÆ C^^abb"~ٲe66m6l B–-[z4Jee%)\]]j_666x(zqmݻ?ѣG`֬Y2^^ijjqqqAn0alܸQ-̔<=u>y{^\y^2{90k0z'NGg1{6f//\KBu6&+!͞#ϟ u^֙=c ٹz\q;U|i=EVܸygY9{U^~ɩp {*bJL䕻wbG j'p*݇Ɋ=>v + ׯjɩpsFo+!ݨၓG^:O)88Xjy%<<\!c9.**yرc$NNN…{pwwG׮]^z iiiXhĐW$V_TTTQ3ьf'WxX8/6}q3%\rۿډ΀b +~t@Yme爼k")Uq=ލOJs]+, x5< +7oz ߄/bjk=n\달UHIěo.|U_1VL[#&$ʜˀ8ӘCƾ.1E_`x-a21d3x ^XcaxVثd6Lje+`I y ۶c?7%-aDUl6x->n;w`7 +^1@ŋy&NB---E\\'z=rJdddH֬9A5???>>|8Μ9m?m٘1c[~.\(Z^^illGo̙:aaa(,,Ğ={w^=z.]zC^ + +ĿgUU2zhf2f&M$=/++CII h|wpJs8pG}NyQ1,^:pU׻bʇqKJ; =MFO` !efab*qru8NiPרصsrϊL;_X+}qxUbӧ?N8Q)EZFĐWwDZtVj̎ '7ُV֍F7zGxs^{*y~~&OXkiWN:%@ݛGGv +->>^?|qq1ѵkWw1'͵xr5zK^i +*99YL2e{^1cy5z}}}w1Hod)777ymNN͖9#22SN:+gϞ}`C@`` \\\*g4hO/±7*P{ZGD3eS Z 9nW6}R(a2Div p(J˭d*BU -9dBuYRlS׿z[1\sER*^`xe¤44\Î]RZ z!wLtslW]n}eMɧ[dL^ymID;;w~% , +ÿbiY(Fe2 +-jL-2"- " *\dlڲhk8X1y0>tUiSIURrp"Q_}:{s}lvep_^)P+P/|T*2OQ__@'M<(//> px7fΜkѽtttiӦI + +s ڼj5ڴw xCl&ͼgFXڃRcƌ kee:}N0^1/㕩S";;9%&&ͼO!!!Y:VG˯9&|ux]W6JCqN[ +cs*9EY +Jg9r_^V3#/E~aag_ʷ+ah:ŋx%0d +|1xݗz`j1KtOЛa('y .12FT[u!rm׻jG jRQXX<ܿO\-L#},g?߿eѣG;ӹgDZZ'N(..Fee%2227ǽ7i8B*11IIIAVV/آ ܗ2/tww6 ={ <5yyy6rY`ӦM(--eΠ|)lݺc***v|Y՜֡}P^ =)#9''˖-㘗 +)44kABz5\^!ZbPURz%K4p䞛z'O()}A*^!x,7ŢO|/[ H9 @s}y%-= MNI`*p̶ # azƍkD^G@\c棚8:s̊0)$9O8ܾ}煼bic|93wx@4H,Vs ~A1!["+g&?f"/fRep_^ ZߟgH(EG8tҷe$sokkU%O6#Zp! +:::P[[~lD}[9REw``flcc{bHJJ҂ m=ykk+ߧܩ'rM&LoHizzzɓyLk$''|aa!"""x ZDBC,Bh/I+_QQ׳ +b<,]v!::ƚ9P*P\(f,]?+KKKoff!!!IoW.ns|+yt&Cy%.a=E +8؎mb+d;ǹ9:槀Pv֡ xΌ\n)<ӗW,Z*H1jjn}2b|6$oz'lp 1QEU5j$E;%%3'5k['$mLC Rα)Wl׬.u!Gox yԊT[zPoy0<}k RNć+w7*e IL\"2uB#ep_^5{_oڞ}:G?Q17vDsצ~_x%,,l//򊽓+/f<;9hLrspX4 ĊoڽG5Tw ,|M?Z'N߳Lx~׌̬%Pk0_s/pO\w? D3HQG!~[ciޘeh,2;k5K|p gfkS>)i8qK\S30:;Tr:.\f;v$""c8fsf|5ohM3gv-{IlzR)Ib +1S#[?PC^6׹s ǥ:;Z:7 + ᾼB4iY~[fл)Acn߾-xEHHH uyexo[,{. cKdf1WȝhyEN :<y&,Yv!ʴL0}!n Ȟ`֛a +olz f ^zL mmׇ+VwT*Us+{>ygmzZH|G {yEo)>^Yvs0L|lyJ\|GG^сBBBBBBj8aaaQ<$({BHHHHHH> WVa£ =Pb +ֽ 9>UUADNNbccE^MѬY3X[[044Wڴi;;;cǎ011Zp=KKKh48991^%h@OOT/c366Fvqud]D}u c _5j`4i"sf?Zl! }:t֭[~C_icc#V5yѧSNW#iӦRrnnnB22'}̪e\SתU+]\sϬr8q"JJJ$ZF*Txb`b s+[t #vUVrOW\oܺ8:nJ㠌sWX?WJj+vGg8yrGףW}~׎.X'ñ73 ~jՖWl>f*s^њkneg. ]G[| MUSh,ٳz¶mpe;wNg ర0:tޜ9sjq)_^b\t HKKLӧOի8{,&M$:ŋQ\\-[O>2Fs6bؼy\#?}QQQ8r\̚5=ٷooߎY <<\+??111əsnܸ!CB籿ׯ_G^^ƍ'5DFF͛F``APa޽vΟ?s7 fYYB;^x!WX"ףGcǎEff+,,E$)>>^y|8߿/XQQ!FB +m +9_ ;V  bj?,3}T9kbBU;qITg<^mKlLI}/|Cx!޽(+Wwt8?yԡjb/땉#]p+;G*sgϞoeP w򫸡p+@¼B?]'9 +$5yfddAжm[$&&8ѣÏ5 +Ÿyf+mڴ /^1 qrgr@K^omm-_~RQS3̣yYԩS]̙3R!`(a=߸qqsu&5Rqlʕ;Ar3rHڵ  K_=<:쇱ę9sh %C]½fԧ5*%-ZeC Ǐ^bǏg}3ڰaC1>*TPQF𞣋'2va`A+:fXn#Lj䞹-2* 2o7镅ұn} +Rl<13`j*شkzW5&g~}/uڻz<o+OV?2rD~3KDMk0"8yek Y#'' kcccE[PS _ޘ6m^9#1rӧO/AB.JKrА +zzz >uETTT߿IIIp{5+= /ZHV3f'g z~~~MXK.żyd^FDWo5k ""BzH={`̘_)R_p-묬,g`Æ U:Rh4uJ~~7,5 П:Zd___u-5Ar-XXXHCBMC E^RBm +5Jϰ}Ntr,|3}垍3vڍI޾ͭf߷u ǎ3<ز؜EEꫵuTRMgW̉OĿ~OV=-רS9AugPBR*6]xc$ ۅJ;B{_W27X(Od|M]{}tK-{jF^"?ŎXKϟ?A:3x. d& +tkWҽg۶m1UWWSHH3 ssssxyy)񑝝x$HV^^Nqqq]=eddPUUPRRlKf'ECLp s)怚WԔ|Z\w^fjmm߅_X+;U$j '999Qqq1SKK y)CJ{}yCjoo0)g?~W\!v[[ݻw^s`NWT2 ņ+Ьf:,\L|IVQCBkm< + +KXB +ƒnoh1iRFsKZ̧JO֞먹4C-a wq'k EUk;ނOLN#Wwoσv3hhO"b'Wz =>a 9/>b/cx_龟{{ +;83s *ϰnjRC'jj)4,BقU?=Z-^ӷfЩg DWo]y/R<0 jwZܼB}޻O5'O5y0w:0l]MxT,3gӆ[xv~C_[Ɵ+/^V1? Miߦ߆M[۷̯&9^gϞQo{n`}Jzzz4|AHKKc^3f̀׏=Jaaa4b>>7n( +4WxEѣ%88)99Ws?;? W$vL,+`ò2C~~~D7of5o0֖(228`>"""x.)7pŸqx/$^ILL丁C&g5&񊶶XWǼM11HT2Cm1Y]:Lk^:Ӑ_ - +N:fktx|t7Y;h-k=|% nbJVd$=_({XN7X. zܦ֕_kԵSHw!+UdhbAD'Nʱ+#cHy<,WYC]}Jfhoܧ;ׄ,:> r韣"$S^A1֨-r^F؜}+%]oX QBoI{$M3b~6 +| Ce;=d23=&W6oILXE|:Es]" [%utvx&}\&|+ ̉:6'>s 3 l9PuُU㕵멦%$3vIKn\=|<}Ν17ލ Ƀ~W9#WL;v 777=8q"}(L4***(::qذa\?KKK233c +jST?O&k`amCƭ<*&O{k8֤ϴZ9JhXCi.hB^Ak=̵݋y+KŷS~a1 -"^ʺh.#\p _h x]Nյf 4Dݙv3socgJn^!}+y}}W8^IV9w hW^ ͿJ"`xMͭEeWPTB'jjBi/K?^R Pzx -x;}#3z05-VrC8z9c^ιgS(( N+QOԩ:uѶ]CxL<_.i hN#_~'ܼyͣ䴯=3[V^IO=ׯ߈eyֶܓ5JxΡuttX?QQcL8~,Ta$l +Q @D@eAvYbbdeQ@!h0BpIL*n f\JRSq&6= #zU뾧o>}'fA4%%|7J&Avv6߿ &M7[[[mOm8iiiPTTDQogAff&Պ<ڼ, Р… VdUVAee%u<``@D,xMp `Qt ###455)gB>c-ș%=k5kְ|....Acp =<(ɑ[cgc R 7"$!KOheG<'zSM/>RFQZ^ uM 6.>Kx%8=W޻:*ePRZAo - +y1׮CP)953kO\# +WsW\<C^vư D+C^gq;95=̮{,{WA^Y<<+oܤ+yfy98z%lTP/+C1Dw#G-:v _O {wp2-[ FFFsN Y=)Sh hŊ,p$y6!*/T + 6A+**קɓ'6qǡƱv5w\6my 44TVWW'QSSm͎ + yB󡐡p>ǐO( h;99ٳg+>> +u`9s# ^ +G;%%%î5,,L.콿?]"0#H 9d7/XI^d)+,[;Gw&fK!!1UG]\/wp- bK4'N%^Üy~s2G#伌W1$yY@ЄƱ:.Qp y'O#2N$E“OTJ~rqԩSSZ٥qqqqބW7C#Yʠ`ߧp~7?&78NCl\:3_t6n|`[L|Bhq/)9 JÊUlbK|B_x®iPsp JgW7fd1&%!伌Wæe2VhMk gii>Ǯ"Ǹ:+pXV<<ϊx(8JO_r`K!#+o ; {o3Z^NaU' Lnm^oh^Fz/bK_Won|fw=q)m7~L|XfVx_yL+{gGnWٳg/ȭ10g۠OάlV9g0{C`p|ɘ[B0{7Q:O/xo4pM`C||;G/q '[1FJ/̃EËr\#~9oJgWV:OoヌǮ{9GJ+'1H}}.|T՜>"'>R~>lٶ.t\;.^`EḠ<.\Ct\CL*lc?޻~`Ԝ8I - =g[M+3nG"\EjY1-` t?AUlyCyѣ#4[hmC?{pg%??n'fCh=54pM`I$˃gϞϡ +tuu.Mx][_Zy11W\\/~UTT@MMbUiq^ƒ5J9zzaOkƟWTUUA"WKzy9k=HZy1g8z(bǎ3g*.... oH4;))9s7#77rˇo8eaaׯ_c飚+ao{dJ0y+╞`ݐR DppPǰJл4X^Ys7nQσ6[[y֭[Ӄ.^TfLMMaffutt0aX[[sٳgSL1c'd2 +M +ՅΖ?P ###888~|xquu5klm^QO~Udeeq.>Ԟ={w^~?qDx{{ǏQ__pfJrL6O Ç#66&&& ř3g#twwJe '&&ٴ<߫&u5fW͕;h%HM7C&w3g.SJUs|ۻ~[iL{[~&V?! 2['ʆ$&B:?J]6.HsFƒU^!peb M^!޹~:<<<0vX"::YDvv6""" ٵkn:{{{)&MΝ;q!(s+HII)ƌ`D؈ ,ZCUVV=z1 a 赗H㖖̟? +' V͋XDAlDQfٲew:˗h 埐 xEHHHH4^9G8w{dSK[#݇(47LЏ15?mq`sn󐞙SAnUtON.s*,(x/Ö7<3ȳg'8Z~ s۷bmQkʊ|j$m|t<[R!gF2WWwuuŅ B1i +1Eqq11s3?,XP*cB2466cx .0BxTWW͛O>+!!!}lѢETiϒ%K8/ +^" We +lܼG,0WOTqmWzLcHHLsLUfS3ݜÙ\*}sAn4\+dT>V|y[S%mg?{$]8"~8\Ruq'q?.PN+t_rK9]WDZV>×.NK0Cbb>(ΦOJv!lM?P_fdNARv[8̂t4MW];|/_Ç=w%~L:ǓQ 8QYlI[`eGX~\ohĵݏKyy ۘAE鳡xƦ28mz~|'N"ak +.]z8)ݏ Xب{IkoחD၃h 30̚?uߚ===oYQ8}aΏd.JGGCmm-222*$M^CEE~r +233yľ}f"22|"..x|||̡?}dgg#**"))IW4Eեcܸq<ׇJ"$$$E*P" +xUX+s&2xxK53-(/B\DöLy*>n'oniuLC5RLEF"k&6:RZ[puzu꿩ǍRoݻFW繐j%hX&"RgP?O\D{lqW0i +{շgfxhjAsi4RSS1U^!.(,,DJJ +x+yLCCJKK_~>;;;3oDFFtZJXXF\\_|9+Ǐ)CVTTFm$dI&٧ +i\⑜6`N!](+ddc[a#qbKۈW9:ퟔz+Q#͐IIGD +Lb .^1>J#Y~"Jw"mmg>K6dx''t mIػo?vMQL۷0th88ɉWU줹i 6`sop&3"jzZ#q JաjeޚWuWenRij= +q\+0._Q2.:Oy/ +C78N`ΤC_R2MD7lB?`v#Hρbo [Wr;ꪼ2V?}Vw Jwg. r[3=2W`jj* nb~wkǏ^z1SǴWI *$/v +S~ڊ{qު瓤bo%܌_~y3m~Glvo+aca xO%nB3DU0559`hhX, ;4zE&vgdpzGWO0ϵs){RN'7Gs-\ܳsr[XwռTkK93=Y.\T'Y}b4w|koBR]4( jҚS=u'd{gG:>\]4jHUs-j:CkXz.L{]3[k\ bX,S+NJ%/ O Rͽ3ZWi]eii //><%X,үWzpU.c\x&6{]vA.I>8q"rrr"bWzow22Yi kbٽ+'OF{{; `hhs !!&ME&L۷]`:_~bt/ffaRT6]izW:::P(n:ظG2eJO 2339$o}E,5+LW$Nf+_{d]Eq-DFFĉχLLLЏBBBCCnc>T^aX,V+L&l@y {d]ErUaԨQ8ucccr]\41c`1Bpa``\{{{Q dR."Xu@& +xbbb0vX 2Dxxx5z+T7 Gu\uҺ===~DDD@՜Dhߜ:Kڏ |>w`jjIq(WbXW <9>OHO5+J ++W7n׃Fll,vލ7o޽{8wRSS̞={Fkkk( +̝;W3f#Gp455 "077_| +V@iiǏիWhnn 17oƚ5kuOxAƝ}8(ԣ'&&"** +WFZZFYfaժUI222}v3(??;wo5W[^>|8֯_" Cc$'' 6qȐ!ݻwU"WTTT)&z>}111033Cdd$QTT$b,,,PPPuS9sb^aXz+#F:UXls/ōttnLyNCs=]sʏH>S{6z{-}κJWF .`): 6L%!Q?uV,YVVVHOOѣG5r۷O0 5555$Cr7+`,Z#I|BGE/MgUWWC.5S3?F^'cHRMMM?~ +/_ƵkP__'O //Ozf󩏎Ɩ-[_:CNIIAee`O=e xNNN*6z۶m3E $ڃbК5򔗗WRWFFΜ9#~ϻtRiPU~p-QKBPYE (P@E@E@@7P$( @Ǯ; ,[T̤?hFMdU9ֻy&SD>}ϭw7^al/ e(_ K{Z#X|%2U"ONlÎ}~]|jUXkh|)3>{3 d]wڼbk瀼Bk %X4/w`wL<-. 0+;wB1c86XYY111eOfddhf3JJJuVL6׭[nj}v^q]l +:#xSGGjw;^&M5ixEML:Ubɓ'97^WtuuW%MmĒo2&lWt8n`PXaC(>Tn+9xe=ޥ1+[{k>B70â%qsgߋ:x4CSxYt,xen[5hLsxo4k|r;8|Vv>ϧgp_z@+x.\_gқ>5 qRwgZ{OEF[ rq%;_=l GCa|}'N vKvmsABPS׀ΞCGd`bnL3=#+Yhu} cR/U|Un + CCOZ17BkHeW+7mk7}'W?Ǚ,]FLC 77GbڼT*qmxzzbر7θp,YN8::JИksaaayQQQlhh\<0~xxxxG;;;fʧa_J'''6 顽.ƍիQQQ]vq sGbb"S~~~t+666j`\~W +}6b9I-lHxH#϶rsY7[gP̿ +q_HKWW%^K+z=r +/{z@Q ־÷@m}#|ױ +9isY^gn^= \7/=Q{{YoJevM@}=LElێ7 k;!^i9qz wSRVCe\cekiznm@FV*]o`Efb3b!e]6/˗/<;#4,l@Zך6L0JV + +b#8q"<==Yߓ7n4___^[]]\3( +)Ƣ4<1BEE5ttt{S ϖڦR{5 πjMHHy.PT1\yy9"##̤Exx8*++41tF)))Ll_msuueѣ/΄X\6dC_+ŝNZ?|m0e!>?|T[;z ijXs if)tMHB*׮@rJ]C2չ7tr + .a/,jmxQ%FL=2rwX1+9\㕦G)z%&r=+3IKWcu+=1&gah\zo6w"+={9r Gi^4y7Rtѱ_AQ]Y,?%°I HC#Fq7EqFŅ5Q0*dSǡ4Q3Dqh\0RS&VJ`w&Jjxs=޻LT/">9"/ĩĄ}y{HZ6畴 +JÆ M}:j~xܹ:ƫ.b) b2bf1cƘhZ1TC y/QL^7cƌܑH$U/UWnYiXS|zN۝\)-5nMu_n=[27]{| +kי-h^S +G{Mlܴo@OBC<W1=e Y|Ο;q}y$DJ:#??xČ`g t٪OHOzqKyea\$MOa6ڌ 71/We-Qiνk>Ǐ++G_ÄIn]UT?Gl?11W,~m+/X39saҜ+>l-Q?MQ֬X~V/C/ץE"uSex%4-VEL{kL_\1`P,['~L^i3"eVjŋ . prQ2nBN,Ư\tS>=zC(9=x+v2_Әk`0xs4 {;`^ c汜\<w5q*]i .>A Q7 4J[m1EEh#-B1 ] -6/38Iݡ{=bZOTVVZMLL.KӥA@>;vg]ih㔔֕k bǵcYcX__o}244$~&''ǚѣG{| iiikǴYn߾-dm2??/6mq0===Cqܿ_6lÇ%111t&++UC?&Q+31Kill;.yuhQ9r$''C?땺:}=[t++qqqRPP Ϟ=6ٺuŗ#W޿o ݺuKΜ9ڻe]SP(핽{QSS#߾}wԔ}޼y#_|&}M/^Hmmm|{tտz6Yl W[3ϡW ziLOO[gȉ'd۶m/˵TDytuu^GWlݻwe``@_./++[W^+}ƍmʓ'OI{СCaǴW޾}>99)UUUo^zEnjYE+##&`+tgy={V|>/Z^}vŅ RJKKŋnRRXX(@@;&n[bbb$%%#;;N\vM.]d=RTTdcum333R\\Z*))jnne<u]{zʧO[233%66X^N8wTWWKrr]D5j ,+v^B:uJvic~WCz{{m~m~ݻ;w~RRSS#W^]_|A@^X+>瑎=*aǒlvZAA.zE۷o_4[W8ymE׵I^^^1aW}KKK6_bbb= Vgz׺u$++kׯYz˫*V|ֿDʕ+d׮]{),^T +W8NEp*zS+^T +W8p +endstream +endobj +102 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(39)Tj +ET +q +484 611.8 -409 -146 re +W n +q +410.2145386 0 0 147.010376 74.494812 465.2947998 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 454.4 Tm +(F)Tj +0.482 0 Td +(igure 1: XRa)Tj +5.249 0 Td +(yMonitoring MBean Inside )Tj +11.635 0 Td +(V)Tj +0.63 0 Td +(isualVM with MBean Plugin)Tj +-16.196 -2.24 Td +(T)Tj +0.511 0 Td +(he usage of the )Tj +/TT1 1 Tf +(JMXRegistry)Tj +/TT0 1 Tf +( is tri)Tj +15.476 0 Td +(vial. )Tj +2.02 0 Td +(Y)Tj +0.482 0 Td +(ou only ha)Tj +4.584 0 Td +(v)Tj +0.488 0 Td +(e to instantiate it and pass the MBean )Tj +-25.361 -1.44 Td +(name and the MBean itself to the method )Tj +/TT1 1 Tf +(rebind)Tj +/TT0 1 Tf +( \(see Listing 20\).)Tj +/TT1 1 Tf +0 -1.79 TD +( private static void registerMonitoring\(\) {)Tj +T* +( new JMXRegistry\(\).rebind\(XRayMonitoring.JMX_NAME, new )Tj +0 -0.99 TD +(XRayMonitoring\(\)\);)Tj +0 -1.79 TD +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 20: XRa)Tj +6.417 0 Td +(yMonitoring Registr)Tj +8.435 0 Td +(ation with JMXRegistry Helper)Tj +-13.052 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.459 0 Td +(monitoring )Tj +5.127 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +2.626 0 Td +(in )Tj +1.237 0 Td +(our )Tj +1.848 0 Td +(example )Tj +4.07 0 Td +(are )Tj +1.736 0 Td +(not )Tj +1.793 0 Td +(automatically )Tj +6.238 0 Td +(updated. )Tj +4.109 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.959 0 Td +(update )Tj +3.349 0 Td +(the )Tj +1.737 0 Td +(recent )Tj +-39.533 -1.44 Td +(v)Tj +0.476 0 Td +(alues, )Tj +2.94 0 Td +(we )Tj +1.717 0 Td +(need )Tj +2.551 0 Td +(to )Tj +1.273 0 Td +(clic)Tj +1.538 0 Td +(k )Tj +0.939 0 Td +(the )Tj +1.773 0 Td +(\223refresh\224 )Tj +4.216 0 Td +(button )Tj +3.219 0 Td +(in )Tj +1.273 0 Td +(the )Tj +1.681 0 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.996 0 Td +(or )Tj +1.328 0 Td +(JConsole )Tj +4.219 0 Td +(user )Tj +2.217 0 Td +(interface. )Tj +4.44 0 Td +(JMX )Tj +-40.422 -1.44 Td +(pro)Tj +1.433 0 Td +(vides )Tj +2.516 0 Td +(a )Tj +0.793 0 Td +(solution )Tj +3.74 0 Td +(for )Tj +1.46 0 Td +(automatic )Tj +4.572 0 Td +(updates. )Tj +3.814 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.405 0 Td +(could )Tj +2.739 0 Td +(use )Tj +1.738 0 Td +(JMX )Tj +/C2_0 1 Tf +2.071 0 Td +<00460047004C0041005D>Tj +/TT0 1 Tf +(cations )Tj +5.574 0 Td +(for )Tj +1.46 0 Td +(the )Tj +1.627 0 Td +(implementation )Tj +-35.42 -1.44 Td +(of )Tj +1.166 0 Td +(automatic )Tj +4.611 0 Td +(updates. )Tj +3.908 0 Td +(Also)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.472 0 Td +(the )Tj +1.666 0 Td +(implementation )Tj +7.112 0 Td +(of )Tj +1.166 0 Td +(bounded )Tj +4.168 0 Td +(or )Tj +1.221 0 Td +(r)Tj +0.321 0 Td +(ange )Tj +2.388 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +2.555 0 Td +(is )Tj +0.999 0 Td +(nati)Tj +1.594 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.61 0 Td +(supported)Tj +-37.92 -1.44 Td +(b)Tj +0.538 0 Td +(y )Tj +0.941 0 Td +(JMX )Tj +2.219 0 Td +(with )Tj +2.331 0 Td +(implementations )Tj +7.61 0 Td +(of )Tj +1.275 0 Td +(the )Tj +/TT1 1 Tf +1.775 0 Td +(GaugeMonitor)Tj +/TT0 1 Tf +( )Tj +7.642 0 Td +(class )Tj +2.497 0 Td +(\()Tj +(http://do)Tj +3.88 0 Td +(wnload.or)Tj +4.379 0 Td +(acle.com/ja)Tj +4.971 0 Td +(v)Tj +0.476 0 Td +(ase/)Tj +-40.533 -1.44 Td +(1.5.0/docs/api/ja)Tj +7.141 0 Td +(v)Tj +0.476 0 Td +(ax/management/monitor/GaugeMonitor)Tj +16.986 0 Td +(.html)Tj +(\). )Tj +-22.803 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.343 0 Td +(NrOfRejectedJobs)Tj +/TT0 1 Tf +( )Tj +9.888 0 Td +(\(see )Tj +1.954 0 Td +(F)Tj +0.482 0 Td +(igure )Tj +2.454 0 Td +(1\) )Tj +1.121 0 Td +(attribute )Tj +3.844 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.233 0 Td +(be )Tj +1.343 0 Td +(a )Tj +0.787 0 Td +(good )Tj +2.455 0 Td +(candidate )Tj +4.511 0 Td +(for )Tj +1.454 0 Td +(observ)Tj +2.81 0 Td +(ation. )Tj +-39.754 -1.44 Td +(In )Tj +1.384 0 Td +(case )Tj +2.439 0 Td +(of )Tj +1.384 0 Td +(an )Tj +1.606 0 Td +(increasing )Tj +4.94 0 Td +(number )Tj +3.884 0 Td +(of )Tj +1.384 0 Td +(rejected )Tj +3.995 0 Td +(jobs, )Tj +/TT1 1 Tf +2.607 0 Td +(GaugeMonitor)Tj +/TT0 1 Tf +( )Tj +7.751 0 Td +(could )Tj +2.996 0 Td +(send )Tj +/C2_0 1 Tf +2.551 0 Td +<00460047004C0041005D>Tj +/TT0 1 Tf +(cations )Tj +-36.919 -1.44 Td +(\(ev)Tj +1.266 0 Td +(ents\) )Tj +2.395 0 Td +(proacti)Tj +2.983 0 Td +(v)Tj +0.488 0 Td +(ely)Tj +1.186 0 Td +(. )Tj +0.672 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +0.95 0 Td +(ev)Tj +0.988 0 Td +(ents )Tj +2.117 0 Td +(usually )Tj +3.451 0 Td +(cause )Tj +2.839 0 Td +(the )Tj +1.728 0 Td +(creation )Tj +3.895 0 Td +(of )Tj +1.228 0 Td +(emergenc)Tj +4.198 0 Td +(y )Tj +0.894 0 Td +(tic)Tj +1.038 0 Td +(ket )Tj +1.672 0 Td +(e)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(mails )Tj +3.505 0 Td +(or )Tj +1.283 0 Td +(SMS )Tj +-40.311 -1.44 Td +(messages )Tj +4.341 0 Td +(to )Tj +1.175 0 Td +(notify )Tj +2.787 0 Td +(the )Tj +1.675 0 Td +(oper)Tj +1.933 0 Td +(ators )Tj +2.397 0 Td +(about )Tj +2.787 0 Td +(an )Tj +1.397 0 Td +(issue. )Tj +2.657 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.397 0 Td +(attribute )Tj +/TT1 1 Tf +3.898 0 Td +(NrOfRejecteJobs)Tj +/TT0 1 Tf +( )Tj +9.343 0 Td +(is )Tj +1.008 0 Td +(particularly )Tj +-37.31 -1.44 Td +(simple; ev)Tj +4.378 0 Td +(ery v)Tj +2.087 0 Td +(alue other zero should be considered a problem)Tj +/TT2 1 Tf +(.)Tj +/TT3 1 Tf +12 0 0 12 57 125.6 Tm +(T)Tj +0.511 0 Td +(he Self-Contained REST Client)Tj +/TT0 1 Tf +10 0 0 10 75 103.2 Tm +(O)Tj +0.865 0 Td +(b)Tj +0.576 0 Td +(v)Tj +0.532 0 Td +(i)Tj +0.31 0 Td +(o)Tj +0.588 0 Td +(u)Tj +0.588 0 Td +(s)Tj +0.421 0 Td +(l)Tj +0.31 0 Td +(y)Tj +/TT2 1 Tf +0.532 0 Td +(,)Tj +/TT0 1 Tf +( )Tj +1.044 0 Td +(H)Tj +0.81 0 Td +(T)Tj +0.588 0 Td +(T)Tj +0.588 0 Td +(P )Tj +1.35 0 Td +(p)Tj +0.588 0 Td +(r)Tj +0.365 0 Td +(o)Tj +0.588 0 Td +(t)Tj +0.31 0 Td +(o)Tj +0.588 0 Td +(c)Tj +0.532 0 Td +(o)Tj +0.588 0 Td +(l )Tj +1.072 0 Td +(i)Tj +0.31 0 Td +(m)Tj +0.865 0 Td +(p)Tj +0.588 0 Td +(l)Tj +0.31 0 Td +(e)Tj +0.532 0 Td +(m)Tj +0.865 0 Td +(e)Tj +0.532 0 Td +(n)Tj +0.588 0 Td +(t)Tj +0.31 0 Td +(a)Tj +0.532 0 Td +(t)Tj +0.31 0 Td +(i)Tj +0.31 0 Td +(o)Tj +0.588 0 Td +(n )Tj +1.35 0 Td +(i)Tj +0.31 0 Td +(s )Tj +1.183 0 Td +(n)Tj +0.588 0 Td +(o)Tj +0.588 0 Td +(t )Tj +1.072 0 Td +(t)Tj +0.31 0 Td +(h)Tj +0.588 0 Td +(e )Tj +1.294 0 Td +(c)Tj +0.532 0 Td +(o)Tj +0.588 0 Td +(r)Tj +0.365 0 Td +(e )Tj +1.294 0 Td +(r)Tj +0.365 0 Td +(e)Tj +0.532 0 Td +(s)Tj +0.421 0 Td +(p)Tj +0.588 0 Td +(o)Tj +0.588 0 Td +(n)Tj +0.588 0 Td +(s)Tj +0.421 0 Td +(i)Tj +0.31 0 Td +(b)Tj +0.588 0 Td +(i)Tj +0.31 0 Td +(l)Tj +0.31 0 Td +(i)Tj +0.31 0 Td +(t)Tj +0.31 0 Td +(y )Tj +1.294 0 Td +(o)Tj +0.588 0 Td +(f )Tj +1.072 0 Td +(t)Tj +0.31 0 Td +(h)Tj +0.588 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(HttpRequestRESTInterceptor)Tj +/TT0 1 Tf +(; )Tj +16.278 0 Td +(r)Tj +0.321 0 Td +(ather)Tj +2.093 0 Td +(, )Tj +0.675 0 Td +(its )Tj +1.342 0 Td +(core )Tj +2.286 0 Td +(responsibility )Tj +6.122 0 Td +(is )Tj +1.064 0 Td +(the )Tj +1.731 0 Td +(inter)Tj +1.933 0 Td +(ception )Tj +3.621 0 Td +(of )Tj +1.231 0 Td +(requests)Tj +ET + +endstream +endobj +103 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 104 0 R>>endobj +104 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(40)Tj +0 Tc 0 Tw -20.432 57.06 Td +(and )Tj +2.048 0 Td +(the )Tj +1.77 0 Td +(forw)Tj +1.927 0 Td +(arding )Tj +3.159 0 Td +(of )Tj +1.27 0 Td +(the )Tj +1.77 0 Td +(relev)Tj +2.087 0 Td +(ant )Tj +1.77 0 Td +(data )Tj +2.27 0 Td +(to )Tj +1.27 0 Td +(a )Tj +0.935 0 Td +(sink. )Tj +2.4 0 Td +(Although )Tj +4.383 0 Td +(the )Tj +/C2_0 1 Tf +1.77 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.381 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.713 0 Td +(care )Tj +2.269 0 Td +(about )Tj +2.882 0 Td +(REST)Tj +2.056 0 Td +(, )Tj +-41.922 -1.44 Td +(HTTP)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.032 0 Td +(or )Tj +1.225 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.836 0 Td +(protocol, )Tj +4.227 0 Td +(the )Tj +1.67 0 Td +(fr)Tj +0.599 0 Td +(agment )Tj +3.503 0 Td +(\223REST\224 )Tj +3.391 0 Td +(in )Tj +1.17 0 Td +(the )Tj +/C2_0 1 Tf +1.67 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.281 0 Td +(name )Tj +2.725 0 Td +(makes )Tj +3.058 0 Td +(the )Tj +1.67 0 Td +(c)Tj +0.482 0 Td +(hosen )Tj +2.893 0 Td +(protocol )Tj +3.949 0 Td +(visible )Tj +-39.421 -1.44 Td +(in )Tj +1.476 0 Td +(the )Tj +1.976 0 Td +(web.xml )Tj +/C2_0 1 Tf +4.365 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation. )Tj +3.014 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.698 0 Td +(name )Tj +3.031 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.531 0 Td +(c)Tj +0.482 0 Td +(hosen )Tj +3.199 0 Td +(for )Tj +1.809 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enience)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.282 0 Td +(not )Tj +2.032 0 Td +(for )Tj +1.809 0 Td +(the )Tj +1.976 0 Td +(actual )Tj +/C2_0 1 Tf +-39.588 -1.44 Td +<004A003D004B004800470046004B0041003A004100440041004C0041003D004B00010047003E0001004C0040003D0001005D>Tj +/TT0 1 Tf +(lter)Tj +11.265 0 Td +(.)Tj +-9.465 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.358 0 Td +(actual )Tj +2.914 0 Td +(HTTP )Tj +2.748 0 Td +(implementation )Tj +7.082 0 Td +(is )Tj +0.969 0 Td +(fully )Tj +2.192 0 Td +(encapsulated )Tj +5.971 0 Td +(in )Tj +1.136 0 Td +(a )Tj +0.802 0 Td +(self-contained )Tj +/TT2 1 Tf +6.36 0 Td +(RESTClient)Tj +/TT0 1 Tf +( )Tj +6.303 0 Td +(class )Tj +-40.144 -1.44 Td +(\()Tj +0.295 0 Td +(s)Tj +0.406 0 Td +(e)Tj +0.517 0 Td +(e )Tj +1.286 0 Td +(L)Tj +0.517 0 Td +(i)Tj +0.295 0 Td +(s)Tj +0.406 0 Td +(t)Tj +0.295 0 Td +(i)Tj +0.295 0 Td +(n)Tj +0.573 0 Td +(g )Tj +1.286 0 Td +(2)Tj +0.573 0 Td +(1)Tj +0.573 0 Td +(\))Tj +0.295 0 Td +(. )Tj +1.064 0 Td +(I)Tj +0.295 0 Td +(t )Tj +1.064 0 Td +(d)Tj +0.573 0 Td +(o)Tj +0.573 0 Td +(e)Tj +0.517 0 Td +(s)Tj +0.406 0 Td +(n)Tj +0.573 0 Td +(\222)Tj +0.258 0 Td +(t )Tj +1.064 0 Td +(r)Tj +0.35 0 Td +(e)Tj +0.517 0 Td +(l)Tj +0.295 0 Td +(y )Tj +1.286 0 Td +(o)Tj +0.573 0 Td +(n )Tj +1.342 0 Td +(a)Tj +0.517 0 Td +(n)Tj +0.555 0 Td +(y )Tj +1.286 0 Td +(e)Tj +0.517 0 Td +(x)Tj +0.517 0 Td +(t)Tj +0.295 0 Td +(e)Tj +0.517 0 Td +(r)Tj +0.35 0 Td +(n)Tj +0.573 0 Td +(a)Tj +0.517 0 Td +(l )Tj +1.064 0 Td +(l)Tj +0.295 0 Td +(i)Tj +0.295 0 Td +(b)Tj +0.573 0 Td +(r)Tj +0.338 0 Td +(a)Tj +0.517 0 Td +(r)Tj +0.35 0 Td +(y )Tj +1.286 0 Td +(a)Tj +0.517 0 Td +(n)Tj +0.573 0 Td +(d )Tj +1.342 0 Td +(i)Tj +0.295 0 Td +(n)Tj +0.573 0 Td +(s)Tj +0.406 0 Td +(t)Tj +0.295 0 Td +(e)Tj +0.517 0 Td +(a)Tj +0.517 0 Td +(d )Tj +1.342 0 Td +(u)Tj +0.573 0 Td +(s)Tj +0.406 0 Td +(e)Tj +0.517 0 Td +(s )Tj +1.175 0 Td +(p)Tj +0.573 0 Td +(l)Tj +0.295 0 Td +(a)Tj +0.517 0 Td +(i)Tj +0.295 0 Td +(n )Tj +1.342 0 Td +(o)Tj +0.573 0 Td +(l)Tj +0.295 0 Td +(d )Tj +/TT2 1 Tf +-41.644 -1.44 Td +(java.net.Sockets)Tj +/TT0 1 Tf +(. )Tj +10.495 0 Td +(As )Tj +1.708 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +1.152 0 Td +(mentioned)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.515 0 Td +(the )Tj +1.986 0 Td +(performance )Tj +6.097 0 Td +(is )Tj +1.319 0 Td +(good )Tj +2.82 0 Td +(enough; )Tj +4.154 0 Td +(the )Tj +1.986 0 Td +(w)Tj +0.766 0 Td +(orst )Tj +-40.644 -1.44 Td +(measured )Tj +4.49 0 Td +(response )Tj +4.102 0 Td +(time )Tj +2.212 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.212 0 Td +(around )Tj +3.38 0 Td +(10 )Tj +1.435 0 Td +(ms. )Tj +1.749 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.379 0 Td +(performance )Tj +5.768 0 Td +(data )Tj +2.157 0 Td +(is )Tj +0.99 0 Td +(exposed )Tj +3.88 0 Td +(through )Tj +3.658 0 Td +(JMX. )Tj +2.379 0 Td +(K)Tj +0.587 0 Td +(eep )Tj +-40.644 -1.44 Td +(in )Tj +1.144 0 Td +(mind )Tj +2.533 0 Td +(that )Tj +1.922 0 Td +(the )Tj +1.644 0 Td +(measured )Tj +4.477 0 Td +(performance )Tj +5.755 0 Td +(represents )Tj +4.644 0 Td +(the )Tj +1.644 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.2 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.534 0 Td +(c)Tj +0.482 0 Td +(hain)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.45 0 Td +(not )Tj +1.7 0 Td +(only )Tj +2.2 0 Td +(the )Tj +1.644 0 Td +(REST )Tj +-40.033 -1.44 Td +(communication.)Tj +/TT2 1 Tf +1.8 -1.79 Td +(public class RESTClient {)Tj +0 -1.79 TD +( public static final String PATH = "/x-ray/resources/hits";)Tj +T* +( private InetAddress inetAddress;)Tj +T* +( private int port;)Tj +T* +( private String path;)Tj +T* +( private static final Logger logger = Logger.getLogger)Tj +-1.8 -0.99 Td +(\(RESTClient.class.getName\(\)\);)Tj +1.8 -3.58 Td +( public RESTClient\(String hostName, int port, String path\) {)Tj +0 -1.79 TD +( try {)Tj +0 -1.79 TD +( this.inetAddress = InetAddress.getByName\(hostName\);)Tj +0 -1.79 TD +( this.port = port;)Tj +0 -1.79 TD +( this.path = path;)Tj +0 -1.79 TD +( } catch \(UnknownHostException ex\) {)Tj +T* +( throw new IllegalArgumentException\("Wrong: " + hostName )Tj +-1.8 -0.99 Td +(+ " Reason: " + ex, ex\);)Tj +1.8 -1.79 Td +( })Tj +T* +( })Tj +0 -3.58 TD +( public RESTClient\(URL url\) {)Tj +0 -1.79 TD +( this\(url.getHost\(\), url.getPort\(\), url.getPath\(\)\);)Tj +T* +( })Tj +ET +q +52 72 432 569 re +W n +BT +/TT2 1 Tf +10 0 0 10 75 78.4 Tm +( public RESTClient\(\) {)Tj +ET +Q + +endstream +endobj +105 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 107 0 R>>endobj +106 0 obj<>endobj +107 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(41)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( this\("localhost", 8080, PATH\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( })Tj +/TT2 1 Tf +-1.8 -3.58 Td +( public String put\(String content\) {)Tj +0 -1.79 TD +( try {)Tj +T* +( Socket socket = new Socket\(inetAddress, port\);)Tj +0 -1.79 TD +( BufferedWriter wr = new BufferedWriter\(new OutputStreamWriter)Tj +0 -0.99 TD +(\(socket.getOutputStream\(\), "UTF8"\)\);)Tj +0 -1.79 TD +( InputStreamReader is = new InputStreamReader)Tj +0 -0.99 TD +(\(socket.getInputStream\(\)\);)Tj +0 -1.79 TD +( wr.write\(\223PUT " + path + " HTTP/1.0\\r\\n"\);)Tj +0 -1.79 TD +( wr.write\("Content-Length: " + content.length\(\) + "\\r\\n"\);)Tj +0 -1.79 TD +( wr.write\("Content-Type: text/plain\\r\\n"\);)Tj +0 -1.79 TD +( wr.write\("\\r\\n"\);)Tj +T* +( wr.write\(content\);)Tj +3.6 -1.79 Td +( )Tj +/TT1 1 Tf +(//\205 exception handling / InputStream -> String conversion)Tj +/TT2 1 Tf +-3.6 -1.79 Td +(})Tj +/TT1 1 Tf +1.8 -3.58 Td +( public InetAddress getInetAddress\(\) {)Tj +0 -1.79 TD +( return inetAddress;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public String getPath\(\) {)Tj +0 -1.79 TD +( return path;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public int getPort\(\) {)Tj +0 -1.79 TD +( return port;)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -2.24 TD +(Listing 21: )Tj +4.688 0 Td +(An HTTP POST Implementation in RESTClient)Tj +-4.688 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.687 0 Td +(key )Tj +2.131 0 Td +(functionality )Tj +6.023 0 Td +(is )Tj +1.298 0 Td +(implemented )Tj +6.299 0 Td +(in )Tj +1.465 0 Td +(the )Tj +1.965 0 Td +(method )Tj +/TT1 1 Tf +3.91 0 Td +(public )Tj +4.554 0 Td +(String )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 418.9902 86.2 Tm +(put\(String )Tj +ET +Q + +endstream +endobj +108 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 109 0 R>>endobj +109 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(42)Tj +/TT1 1 Tf +0 Tc 0 Tw -20.432 57.06 Td +(content\) )Tj +5.536 0 Td +(\()Tj +/TT0 1 Tf +(see )Tj +2.402 0 Td +(Listing )Tj +3.192 0 Td +(21\). )Tj +2.007 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.469 0 Td +(implementation )Tj +7.193 0 Td +(of )Tj +1.247 0 Td +(a )Tj +/TT1 1 Tf +0.913 0 Td +(PUT)Tj +/TT0 1 Tf +( )Tj +2.213 0 Td +(request )Tj +3.525 0 Td +(requires )Tj +3.858 0 Td +(only )Tj +2.303 0 Td +(three )Tj +2.58 0 Td +(lines )Tj +2.414 0 Td +(of )Tj +-41.366 -1.44 Td +(code. )Tj +2.651 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.465 0 Td +(only )Tj +2.243 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.853 0 Td +(to )Tj +1.187 0 Td +(specify )Tj +3.354 0 Td +(the )Tj +1.687 0 Td +(HTTP )Tj +2.799 0 Td +(method )Tj +3.632 0 Td +(\()Tj +/TT1 1 Tf +(PUT)Tj +/TT0 1 Tf +(, )Tj +2.71 0 Td +(in )Tj +1.187 0 Td +(our )Tj +1.798 0 Td +(case\), )Tj +2.798 0 Td +(the )Tj +1.687 0 Td +(content )Tj +3.577 0 Td +(length)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.271 0 Td +(and )Tj +1.965 0 Td +(the )Tj +-40.866 -1.44 Td +(type and then pro)Tj +7.603 0 Td +(vide the actual pa)Tj +7.64 0 Td +(yload. )Tj +-13.443 -2.24 Td +(Note )Tj +2.494 0 Td +(the )Tj +1.716 0 Td +(intentional )Tj +4.996 0 Td +(s)Tj +0.377 0 Td +(w)Tj +0.76 0 Td +(allo)Tj +1.6 0 Td +(wing )Tj +2.494 0 Td +(of )Tj +1.216 0 Td +(exceptions. )Tj +5.273 0 Td +(Inside )Tj +2.939 0 Td +(the )Tj +/TT1 1 Tf +1.716 0 Td +(catch)Tj +/TT0 1 Tf +( )Tj +3.383 0 Td +(bloc)Tj +1.872 0 Td +(k)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.132 0 Td +(only )Tj +2.272 0 Td +(the )Tj +1.716 0 Td +(content )Tj +3.606 0 Td +(of )Tj +-41.366 -1.44 Td +(the )Tj +1.759 0 Td +(exception )Tj +4.649 0 Td +(is )Tj +1.092 0 Td +(logged. )Tj +3.593 0 Td +(Sw)Tj +1.26 0 Td +(allo)Tj +1.6 0 Td +(wing )Tj +2.537 0 Td +(an )Tj +1.481 0 Td +(exception )Tj +4.649 0 Td +(is )Tj +1.092 0 Td +(uncommon, )Tj +5.649 0 Td +(but )Tj +1.815 0 Td +(it )Tj +0.981 0 Td +(is )Tj +1.092 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.758 0 Td +(effecti)Tj +2.594 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.925 0 Td +(in )Tj +1.259 0 Td +(our )Tj +-40.755 -1.44 Td +(case. )Tj +2.502 0 Td +(Ev)Tj +0.988 0 Td +(en )Tj +1.391 0 Td +(if )Tj +0.891 0 Td +(the )Tj +1.669 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.835 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.447 0 Td +(is )Tj +1.002 0 Td +(not )Tj +1.725 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable, )Tj +3.503 0 Td +(the )Tj +1.669 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.835 0 Td +(probe )Tj +2.836 0 Td +(will )Tj +1.947 0 Td +(not )Tj +1.725 0 Td +(affect )Tj +2.669 0 Td +(the )Tj +1.669 0 Td +(stability )Tj +3.67 0 Td +(of )Tj +1.169 0 Td +(the )Tj +-40.866 -1.44 Td +(blog. )Tj +2.578 0 Td +(All )Tj +1.67 0 Td +(data )Tj +2.281 0 Td +(will )Tj +2.059 0 Td +(be )Tj +1.503 0 Td +(lost )Tj +1.948 0 Td +(during )Tj +3.226 0 Td +(this )Tj +1.948 0 Td +(period )Tj +3.226 0 Td +(of )Tj +1.281 0 Td +(time, )Tj +2.614 0 Td +(but )Tj +1.837 0 Td +(there )Tj +2.614 0 Td +(is )Tj +1.114 0 Td +(no )Tj +1.559 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.947 0 Td +(to )Tj +1.281 0 Td +(process )Tj +3.67 0 Td +(the )Tj +1.781 0 Td +(data)Tj +( )Tj +-40.366 -1.44 Td +(correctly )Tj +4.248 0 Td +(without )Tj +3.75 0 Td +(ha)Tj +1.026 0 Td +(ving )Tj +2.304 0 Td +(a )Tj +0.97 0 Td +(fully )Tj +2.36 0 Td +(functional )Tj +4.806 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.582 0 Td +(in )Tj +1.304 0 Td +(place )Tj +2.804 0 Td +(an)Tj +1.038 0 Td +(yw)Tj +1.26 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.674 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.526 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.97 0 Td +(exceptions )Tj +5.083 0 Td +(are )Tj +-40.867 -1.44 Td +(handled )Tj +4.029 0 Td +(is )Tj +1.194 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.86 0 Td +(dependent )Tj +5.085 0 Td +(on )Tj +1.639 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y\222)Tj +0.686 0 Td +(s )Tj +0.916 0 Td +(responsibilities)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +( )Tj +7.169 0 Td +(Imagine )Tj +3.972 0 Td +(if )Tj +1.083 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.027 0 Td +(were )Tj +2.638 0 Td +(an )Tj +1.583 0 Td +(audit )Tj +2.695 0 Td +(system )Tj +-39.311 -1.44 Td +(required )Tj +4.268 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.156 0 Td +(a )Tj +/C2_0 1 Tf +1.156 0 Td +<005D>Tj +/TT0 1 Tf +(ctional )Tj +4.158 0 Td +(legal )Tj +2.712 0 Td +(department. )Tj +5.75 0 Td +(T)Tj +0.511 0 Td +(hen )Tj +2.268 0 Td +(all )Tj +1.712 0 Td +(relev)Tj +2.087 0 Td +(ant )Tj +1.99 0 Td +(bac)Tj +1.538 0 Td +(k)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(end )Tj +3.101 0 Td +(problems )Tj +4.657 0 Td +(should )Tj +3.547 0 Td +(be )Tj +-41.144 -1.44 Td +(propagated to the user interface)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +(In )Tj +1.468 0 Td +(our )Tj +2.079 0 Td +(case)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.773 0 Td +(robustness )Tj +5.136 0 Td +(and )Tj +2.246 0 Td +(performance )Tj +6.079 0 Td +(are )Tj +1.967 0 Td +(more )Tj +2.856 0 Td +(important )Tj +4.802 0 Td +(than )Tj +2.524 0 Td +(the )Tj +1.968 0 Td +(consistenc)Tj +4.478 0 Td +(y )Tj +1.134 0 Td +(or )Tj +-41.311 -1.44 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.02 0 Td +(of )Tj +1.13 0 Td +(the )Tj +1.63 0 Td +(statistical )Tj +4.242 0 Td +(data. )Tj +2.408 0 Td +(It )Tj +0.852 0 Td +(is )Tj +0.963 0 Td +(a )Tj +0.796 0 Td +(pure )Tj +2.241 0 Td +(business )Tj +3.909 0 Td +(decision. )Tj +4.187 0 Td +(If )Tj +0.852 0 Td +(I )Tj +0.574 0 Td +(\(in )Tj +1.408 0 Td +(the )Tj +1.63 0 Td +(role )Tj +1.963 0 Td +(of )Tj +1.13 0 Td +(a )Tj +0.796 0 Td +(domain )Tj +3.575 0 Td +(expert\) )Tj +-39.255 -1.44 Td +(decide )Tj +3.173 0 Td +(that )Tj +1.895 0 Td +(absolutely )Tj +4.674 0 Td +(all )Tj +1.339 0 Td +(requests )Tj +3.784 0 Td +(must )Tj +2.339 0 Td +(be )Tj +1.339 0 Td +(captured )Tj +4.062 0 Td +(in )Tj +1.117 0 Td +(real )Tj +1.894 0 Td +(time, )Tj +2.45 0 Td +(then )Tj +2.173 0 Td +(I )Tj +0.561 0 Td +(\(in )Tj +1.395 0 Td +(the )Tj +1.617 0 Td +(role )Tj +1.95 0 Td +(of )Tj +1.117 0 Td +(a )Tj +0.783 0 Td +(dev)Tj +1.544 0 Td +(eloper\) )Tj +-39.199 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.262 0 Td +(need )Tj +2.428 0 Td +(to )Tj +1.15 0 Td +(thro)Tj +1.711 0 Td +(w )Tj +1.094 0 Td +(an )Tj +1.372 0 Td +(unc)Tj +1.594 0 Td +(hec)Tj +1.538 0 Td +(ked )Tj +1.872 0 Td +(exception )Tj +4.54 0 Td +(to )Tj +1.15 0 Td +(roll )Tj +1.761 0 Td +(bac)Tj +1.538 0 Td +(k )Tj +0.816 0 Td +(the )Tj +1.65 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.206 0 Td +(tr)Tj +0.599 0 Td +(ansaction. )Tj +4.633 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.539 0 Td +(means )Tj +3.094 0 Td +(that )Tj +-40.588 -1.44 Td +(the )Tj +1.704 0 Td +(blog )Tj +2.26 0 Td +(will )Tj +1.982 0 Td +(only )Tj +2.26 0 Td +(function )Tj +3.928 0 Td +(correctly )Tj +4.148 0 Td +(if )Tj +0.926 0 Td +(the )Tj +1.704 0 Td +(x)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.87 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.482 0 Td +(is )Tj +1.037 0 Td +(up )Tj +1.482 0 Td +(and )Tj +1.982 0 Td +(running. )Tj +3.909 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.426 0 Td +(decision )Tj +3.983 0 Td +(about )Tj +-39.754 -1.44 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.141 0 Td +(to )Tj +1.197 0 Td +(react )Tj +2.474 0 Td +(to )Tj +1.197 0 Td +(a )Tj +0.863 0 Td +(failure )Tj +3.086 0 Td +(of )Tj +1.197 0 Td +(the )Tj +/TT1 1 Tf +1.697 0 Td +(put)Tj +/TT0 1 Tf +( )Tj +2.164 0 Td +(method )Tj +3.642 0 Td +(cannot )Tj +3.309 0 Td +(be )Tj +1.419 0 Td +(made )Tj +2.752 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.863 0 Td +(a )Tj +0.863 0 Td +(dev)Tj +1.544 0 Td +(eloper )Tj +3.086 0 Td +(without )Tj +3.643 0 Td +(asking )Tj +3.086 0 Td +(the )Tj +-40.866 -1.44 Td +(domain expert. )Tj +/TT3 1 Tf +12 0 0 12 57 332.4 Tm +(HTTPRequestRESTInter)Tj +10.157 0 Td +(ceptor at Large)Tj +/TT0 1 Tf +10 0 0 10 75 310 Tm +(Until )Tj +2.457 0 Td +(no)Tj +1.1 0 Td +(w)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.317 0 Td +(I )Tj +0.567 0 Td +(discussed )Tj +4.402 0 Td +(v)Tj +0.476 0 Td +(arious )Tj +2.901 0 Td +(snippets )Tj +3.791 0 Td +(from )Tj +2.289 0 Td +(the )Tj +/TT1 1 Tf +1.623 0 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +(. )Tj +16.169 0 Td +(It\222)Tj +0.742 0 Td +(s )Tj +0.678 0 Td +(time )Tj +-40.311 -1.44 Td +(to put all the pieces together \(see Listing 22\). )Tj +1.8 -2.24 Td +(Surprisingly)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +5.614 0 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +( )Tj +15.909 0 Td +(relies )Tj +2.585 0 Td +(on )Tj +1.419 0 Td +(a )Tj +0.807 0 Td +(static )Tj +2.53 0 Td +(initializer )Tj +4.364 0 Td +(to )Tj +1.141 0 Td +(instantiate )Tj +4.698 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(threadpools )Tj +5.445 0 Td +(and )Tj +1.999 0 Td +(register )Tj +3.498 0 Td +(the )Tj +1.721 0 Td +(JMX )Tj +2.165 0 Td +(monitoring. )Tj +5.389 0 Td +(References )Tj +5.054 0 Td +(to )Tj +1.221 0 Td +(the )Tj +1.721 0 Td +(thread )Tj +3.11 0 Td +(pool, )Tj +2.611 0 Td +(as )Tj +1.276 0 Td +(well )Tj +2.221 0 Td +(as )Tj +1.276 0 Td +(the )Tj +1.721 0 Td +(JMX )Tj +-40.422 -1.44 Td +(monitoring, )Tj +5.563 0 Td +(are )Tj +1.894 0 Td +(stored )Tj +3.173 0 Td +(in )Tj +1.395 0 Td +(static )Tj +/C2_0 1 Tf +2.784 0 Td +<005D>Tj +/TT0 1 Tf +(elds. )Tj +3.044 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.45 0 Td +(should )Tj +3.452 0 Td +(be )Tj +1.617 0 Td +(only )Tj +2.451 0 Td +(a )Tj +1.061 0 Td +(single )Tj +3.062 0 Td +(thread )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 414.4186 244.4 Tm +(pool )Tj +2.507 0 Td +(and )Tj +2.173 0 Td +(JMX )Tj +-40.422 -1.44 Td +(monitoring for all )Tj +/TT1 1 Tf +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +( instances. )Tj +/TT1 1 Tf +1.8 -4.03 Td +(public class HTTPRequestRESTInterceptor implements Filter {)Tj +0 -3.58 TD +( private final static Logger LOG = Logger.getLogger)Tj +-1.8 -0.99 Td +(\(HTTPRequestRESTInterceptor.class.getName\(\)\);)Tj +1.8 -1.79 Td +( private String serviceURL;)Tj +0 -1.79 TD +( private URL url;)Tj +T* +( RESTClient client;)Tj +ET + +endstream +endobj +110 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 111 0 R>>endobj +111 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(43)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( static final String REFERER = "referer";)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( static final String DELIMITER = "|";)Tj +0 -1.79 TD +( static Executor executor = null;)Tj +T* +( private static AtomicInteger nrOfRejectedJobs = new )Tj +-1.8 -0.99 Td +(AtomicInteger\(0\);)Tj +1.8 -1.79 Td +( private static long xrayPerformance = -1;)Tj +0 -1.79 TD +( private static long worstXrayPerformance = -1;)Tj +0 -1.79 TD +( private static long applicationPerformance = -1;)Tj +0 -1.79 TD +( private static long worstApplicationPerformance = -1;)Tj +T* +( public final static int NR_OF_THREADS = 2;)Tj +0 -1.79 TD +( public final static int QUEUE_CAPACITY = 5;)Tj +0 -3.58 TD +( static {)Tj +0 -1.79 TD +( setupThreadPools\(\);)Tj +T* +( registerMonitoring\(\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public void init\(FilterConfig filterConfig\) throws )Tj +-1.8 -0.99 Td +(ServletException {)Tj +1.8 -1.79 Td +( this.serviceURL = filterConfig.getInitParameter)Tj +-1.8 -0.99 Td +(\("serviceURL"\);)Tj +1.8 -1.79 Td +( try {)Tj +0 -1.79 TD +( this.url = new URL\(this.serviceURL\);)Tj +0 -1.79 TD +( this.client = new RESTClient\(this.url\);)Tj +T* +( } catch \(MalformedURLException ex\) {)Tj +T* +( Logger.getLogger)Tj +-1.8 -0.99 Td +(\(HTTPRequestRESTInterceptor.class.getName\(\)\).log\(Level.SEVERE, null\ , )Tj +0 -0.99 TD +(ex\);)Tj +1.8 -1.79 Td +( })Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( private static void setupThreadPools\(\) {)Tj +0 -1.79 TD +( MonitorableThreadFactory monitorableThreadFactory = new )Tj +ET + +endstream +endobj +112 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 113 0 R>>endobj +113 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(44)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +(MonitorableThreadFactory\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( RejectedExecutionHandler ignoringHandler = new )Tj +-1.8 -0.99 Td +(RejectedExecutionHandler\(\) {)Tj +1.8 -3.58 Td +( @Override)Tj +0 -1.79 TD +( public void rejectedExecution\(Runnable r, )Tj +-1.8 -0.99 Td +(ThreadPoolExecutor executor\) {)Tj +1.8 -1.79 Td +( int rejectedJobs = nrOfRejectedJobs.incrementAndGet)Tj +-1.8 -0.99 Td +(\(\);)Tj +1.8 -1.79 Td +( LOG.log\(Level.SEVERE, "Job: {0} rejected. Number of )Tj +-1.8 -0.99 Td +(rejected jobs: {1}", new Object[]{r, rejectedJobs}\);)Tj +1.8 -3.58 Td +( })Tj +T* +( };)Tj +T* +( BlockingQueue workQueue = new )Tj +-1.8 -0.99 Td +(ArrayBlockingQueue\(QUEUE_CAPACITY\);)Tj +1.8 -1.79 Td +( executor = new ThreadPoolExecutor\(NR_OF_THREADS, )Tj +-1.8 -0.99 Td +(NR_OF_THREADS, Integer.MAX_VALUE, TimeUnit.SECONDS, workQueue, )Tj +0 -0.99 TD +(monitorableThreadFactory, ignoringHandler\);)Tj +1.8 -1.79 Td +( })Tj +0 -3.58 TD +( private static void registerMonitoring\(\) {)Tj +0 -1.79 TD +( new JMXRegistry\(\).rebind\(XRayMonitoring.JMX_NAME, new )Tj +-1.8 -0.99 Td +(XRayMonitoring\(\)\);)Tj +1.8 -1.79 Td +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public void doFilter\(ServletRequest request, ServletResponse )Tj +-1.8 -0.99 Td +(response, FilterChain chain\) throws IOException, ServletException {)Tj +1.8 -1.79 Td +( HttpServletRequest httpServletRequest = )Tj +-1.8 -0.99 Td +(\(HttpServletRequest\) request;)Tj +1.8 -3.58 Td +( String uri = httpServletRequest.getRequestURI\(\);)Tj +0 -1.79 TD +( String referer = httpServletRequest.getHeader\(REFERER\);)Tj +0 -3.58 TD +( long start = System.currentTimeMillis\(\);)Tj +ET + +endstream +endobj +114 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 115 0 R>>endobj +115 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(45)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( chain.doFilter\(request, response\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( applicationPerformance = \(System.currentTimeMillis\(\) - )Tj +-1.8 -0.99 Td +(start\);)Tj +1.8 -1.79 Td +( worstApplicationPerformance = Math.max)Tj +-1.8 -0.99 Td +(\(applicationPerformance, worstApplicationPerformance\);)Tj +1.8 -1.79 Td +( sendAsync\(uri, referer\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public void sendAsync\(final String uri, final String referer\) {)Tj +0 -1.79 TD +( Runnable runnable = getInstrumentedRunnable\(uri, referer\);)Tj +T* +( String actionName = createName\(uri, referer\);)Tj +T* +( executor.execute\(new ThreadNameTrackingRunnable\(runnable, )Tj +-1.8 -0.99 Td +(actionName\)\);)Tj +1.8 -1.79 Td +( })Tj +T* +( )Tj +T* +( public Runnable getInstrumentedRunnable\(final String uri, final )Tj +-1.8 -0.99 Td +(String referer\) {)Tj +1.8 -1.79 Td +( return new Runnable\(\) {)Tj +0 -1.79 TD +( @Override)Tj +0 -1.79 TD +( public void run\(\) {)Tj +T* +( long start = System.currentTimeMillis\(\);)Tj +T* +( send\(uri, referer\);)Tj +T* +( xrayPerformance = \(System.currentTimeMillis\(\) - )Tj +-1.8 -0.99 Td +(start\);)Tj +1.8 -1.79 Td +( worstXrayPerformance = Math.max\(xrayPerformance, )Tj +-1.8 -0.99 Td +(worstXrayPerformance\);)Tj +1.8 -1.79 Td +( })Tj +T* +( };)Tj +T* +( } )Tj +0 -3.58 TD +( String createName\(final String uri, final String referer\) {)Tj +0 -1.79 TD +( return uri + "|" + referer;)Tj +T* +( })Tj +ET + +endstream +endobj +116 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 118 0 R>>endobj +117 0 obj<>endobj +118 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(46)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( public void send\(final String uri, final String referer\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( String message = createMessage\(uri, referer\);)Tj +0 -1.79 TD +( client.put\(message\);)Tj +T* +( })Tj +0 -3.58 TD +( String createMessage\(String uri, String referer\) {)Tj +0 -1.79 TD +( if \(referer == null\) {)Tj +T* +( return uri;)Tj +T* +( })Tj +T* +( return uri + DELIMITER + referer;)Tj +T* +( })Tj +0 -3.58 TD +( public static int getNrOfRejectedJobs\(\) {)Tj +0 -1.79 TD +( return nrOfRejectedJobs.get\(\);)Tj +T* +( })Tj +0 -3.58 TD +( public static long getApplicationPerformance\(\) {)Tj +0 -1.79 TD +( return applicationPerformance;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public static long getXRayPerformance\(\) {)Tj +0 -1.79 TD +( return xrayPerformance;)Tj +T* +( })Tj +0 -3.58 TD +( public static long getWorstApplicationPerformance\(\) {)Tj +0 -1.79 TD +( return worstApplicationPerformance;)Tj +T* +( })Tj +0 -3.58 TD +( public static long getWorstXRayPerformance\(\) {)Tj +0 -1.79 TD +( return worstXrayPerformance;)Tj +T* +( })Tj +ET + +endstream +endobj +119 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 120 0 R>>endobj +120 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(47)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( public static void resetStatistics\(\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( worstApplicationPerformance = 0;)Tj +0 -1.79 TD +( worstXrayPerformance = 0;)Tj +T* +( applicationPerformance = 0;)Tj +T* +( xrayPerformance = 0;)Tj +T* +( nrOfRejectedJobs.set\(0\);)Tj +T* +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public void destroy\(\) {)Tj +T* +( })Tj +0 -3.58 TD +(})Tj +/TT0 1 Tf +-1.8 -1.88 Td +(Listing 22: HTTPRequestRESTInter)Tj +14.661 0 Td +(ceptor at Large)Tj +-12.861 -2.24 Td +(Starting )Tj +3.576 0 Td +(threads )Tj +3.465 0 Td +(in )Tj +1.187 0 Td +(an )Tj +1.409 0 Td +(EJB )Tj +1.742 0 Td +(container )Tj +4.41 0 Td +(is )Tj +1.02 0 Td +(prohibited. )Tj +5.078 0 Td +(Starting )Tj +3.576 0 Td +(threads )Tj +3.465 0 Td +(in )Tj +1.187 0 Td +(a )Tj +0.816 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.409 0 Td +(container )Tj +4.41 0 Td +(is )Tj +1.02 0 Td +(not. )Tj +-40.532 -1.44 Td +(Both )Tj +2.388 0 Td +(containers )Tj +4.833 0 Td +(are )Tj +1.72 0 Td +(usually )Tj +3.444 0 Td +(executed )Tj +4.277 0 Td +(in )Tj +1.221 0 Td +(the )Tj +1.721 0 Td +(same )Tj +2.609 0 Td +(JVM )Tj +2.221 0 Td +(process, )Tj +3.888 0 Td +(so )Tj +1.332 0 Td +(constr)Tj +2.6 0 Td +(aints )Tj +2.388 0 Td +(regarding )Tj +4.443 0 Td +(the )Tj +1.721 0 Td +(EJB )Tj +-40.811 -1.44 Td +(container )Tj +4.491 0 Td +(might )Tj +2.879 0 Td +(seem )Tj +2.656 0 Td +(str)Tj +0.988 0 Td +(ange )Tj +2.49 0 Td +(at )Tj +1.212 0 Td +(the )Tj +/C2_0 1 Tf +1.768 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.99 0 Td +(glance. )Tj +3.546 0 Td +(K)Tj +0.587 0 Td +(eep )Tj +1.99 0 Td +(in )Tj +1.268 0 Td +(mind )Tj +2.657 0 Td +(that )Tj +2.046 0 Td +(the )Tj +1.768 0 Td +(Servlet )Tj +/C2_0 1 Tf +3.323 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +5.881 0 Td +(is )Tj +-41.533 -1.44 Td +(older than EJB)Tj +6.034 0 Td +(. Furthermore)Tj +/TT2 1 Tf +(,)Tj +/C2_0 1 Tf +<0001003A0047004C00400001004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cations were dev)Tj +18.633 0 Td +(eloped independently of eac)Tj +12.266 0 Td +(h other)Tj +2.983 0 Td +(. )Tj +-38.116 -2.24 Td +(Our )Tj +2.091 0 Td +(setup )Tj +2.648 0 Td +(is )Tj +1.036 0 Td +(unusual; )Tj +4.038 0 Td +(we )Tj +1.647 0 Td +(are )Tj +1.702 0 Td +(executing )Tj +4.537 0 Td +(the )Tj +1.703 0 Td +(frontend )Tj +3.982 0 Td +(and )Tj +1.981 0 Td +(the )Tj +1.703 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.481 0 Td +(in )Tj +1.203 0 Td +(separ)Tj +2.266 0 Td +(ate )Tj +1.647 0 Td +(JVMs )Tj +2.592 0 Td +(and )Tj +-40.588 -1.44 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.573 0 Td +(domains. )Tj +4.296 0 Td +(Roller )Tj +2.906 0 Td +(runs )Tj +2.184 0 Td +(as )Tj +1.239 0 Td +(a )Tj +0.85 0 Td +(J2EE )Tj +2.184 0 Td +(1.4 )Tj +1.74 0 Td +(application )Tj +5.186 0 Td +(and )Tj +1.962 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.85 0 Td +(runs )Tj +2.184 0 Td +(in )Tj +1.184 0 Td +(a )Tj +0.85 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.85 0 Td +(EE )Tj +1.35 0 Td +(6 )Tj +0.906 0 Td +(container)Tj +3.983 0 Td +(. )Tj +-41.922 -1.44 Td +(REST communication is used to bridge the gap between both processes. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.339 0 Td +(size )Tj +1.95 0 Td +(of )Tj +1.117 0 Td +(the )Tj +1.617 0 Td +(class )Tj +/TT1 1 Tf +2.339 0 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +( )Tj +15.885 0 Td +(is )Tj +0.95 0 Td +(about )Tj +2.729 0 Td +(170 )Tj +1.951 0 Td +(lines )Tj +2.284 0 Td +(of )Tj +1.117 0 Td +(code. )Tj +2.599 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.339 0 Td +(main )Tj +-40.033 -1.44 Td +(responsibility )Tj +6.266 0 Td +(of )Tj +1.375 0 Td +(this )Tj +2.042 0 Td +(class )Tj +2.597 0 Td +(is )Tj +1.208 0 Td +(the )Tj +1.875 0 Td +(extr)Tj +1.599 0 Td +(action )Tj +3.209 0 Td +(of )Tj +1.375 0 Td +(interesting )Tj +4.987 0 Td +(metadata )Tj +4.486 0 Td +(from )Tj +2.541 0 Td +(HTTP )Tj +2.987 0 Td +(requests )Tj +4.042 0 Td +(and )Tj +-40.588 -1.44 Td +(performance )Tj +5.845 0 Td +(measurements )Tj +6.567 0 Td +(in )Tj +1.234 0 Td +(a )Tj +0.9 0 Td +(non-intrusi)Tj +4.651 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.9 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(. )Tj +/C2_0 1 Tf +0.678 0 Td +<002C004A0047005D>Tj +/TT0 1 Tf +(ling )Tj +4.013 0 Td +(and )Tj +2.012 0 Td +(JMX )Tj +2.178 0 Td +(handling )Tj +4.18 0 Td +(are )Tj +1.733 0 Td +(actually )Tj +3.79 0 Td +(not )Tj +-40.81 -1.44 Td +(the )Tj +1.871 0 Td +(core )Tj +2.426 0 Td +(responsibilities )Tj +6.929 0 Td +(of )Tj +1.371 0 Td +(the )Tj +/TT1 1 Tf +1.871 0 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +( )Tj +16.139 0 Td +(class )Tj +2.593 0 Td +(and )Tj +2.149 0 Td +(they )Tj +2.371 0 Td +(should )Tj +3.428 0 Td +(be )Tj +-41.144 -1.44 Td +(extr)Tj +1.599 0 Td +(acted )Tj +2.898 0 Td +(into )Tj +2.232 0 Td +(standalone )Tj +5.233 0 Td +(classes. )Tj +3.787 0 Td +(On )Tj +1.953 0 Td +(the )Tj +1.898 0 Td +(other )Tj +2.787 0 Td +(hand)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +2.982 0 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +( )Tj +16.166 0 Td +(is )Tj +-41.533 -1.44 Td +(feature)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(complete. Excessi)Tj +10.873 0 Td +(v)Tj +0.488 0 Td +(e gro)Tj +2.155 0 Td +(wth in complexity is r)Tj +9.325 0 Td +(ather unlikely)Tj +5.799 0 Td +(.)Tj +-26.84 -2.24 Td +(I )Tj +0.667 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(en\222)Tj +1.297 0 Td +(t )Tj +0.667 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(ered )Tj +2.278 0 Td +(the )Tj +1.723 0 Td +(class )Tj +/TT1 1 Tf +2.445 0 Td +(ThreadNameTrackingRunnable)Tj +/TT0 1 Tf +( )Tj +15.991 0 Td +(y)Tj +0.482 0 Td +(et. )Tj +1.445 0 Td +(It )Tj +0.945 0 Td +(is )Tj +1.056 0 Td +(a )Tj +0.889 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.722 0 Td +(useful )Tj +2.946 0 Td +(hac)Tj +1.538 0 Td +(k.)Tj +( )Tj +/TT1 1 Tf +-41.422 -1.44 Td +(T)Tj +0.653 0 Td +(h)Tj +0.653 0 Td +(r)Tj +0.653 0 Td +(e)Tj +0.653 0 Td +(a)Tj +0.653 0 Td +(d)Tj +0.653 0 Td +(N)Tj +0.653 0 Td +(a)Tj +0.653 0 Td +(m)Tj +0.653 0 Td +(e)Tj +0.653 0 Td +(T)Tj +0.653 0 Td +(r)Tj +0.653 0 Td +(a)Tj +0.653 0 Td +(c)Tj +0.653 0 Td +(k)Tj +0.653 0 Td +(i)Tj +0.653 0 Td +(n)Tj +0.653 0 Td +(g)Tj +0.653 0 Td +(R)Tj +0.653 0 Td +(u)Tj +0.653 0 Td +(n)Tj +0.653 0 Td +(n)Tj +0.653 0 Td +(a)Tj +0.653 0 Td +(b)Tj +0.653 0 Td +(l)Tj +0.653 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.404 0 Td +(i)Tj +0.33 0 Td +(s )Tj +1.193 0 Td +(a )Tj +1.304 0 Td +(c)Tj +0.552 0 Td +(l)Tj +0.33 0 Td +(a)Tj +0.552 0 Td +(s)Tj +0.441 0 Td +(s)Tj +0.441 0 Td +(i)Tj +0.33 0 Td +(c )Tj +1.304 0 Td +(d)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(c)Tj +0.552 0 Td +(o)Tj +0.608 0 Td +(r)Tj +0.373 0 Td +(a)Tj +0.552 0 Td +(t)Tj +0.33 0 Td +(o)Tj +0.608 0 Td +(r)Tj +0.311 0 Td +(, )Tj +1.082 0 Td +(o)Tj +0.608 0 Td +(r )Tj +1.137 0 Td +(a)Tj +0.552 0 Td +(s)Tj +0.441 0 Td +(p)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(c)Tj +0.552 0 Td +(t)Tj +0.33 0 Td +(. )Tj +1.082 0 Td +(I)Tj +0.33 0 Td +(t )Tj +1.082 0 Td +(e)Tj +0.552 0 Td +(x)Tj +0.552 0 Td +(p)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(c)Tj +0.552 0 Td +(t)Tj +0.33 0 Td +(s )Tj +1.193 0 Td +(a)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(java.lang.Runnable)Tj +/TT0 1 Tf +( )Tj +11.251 0 Td +(instance )Tj +4.006 0 Td +(in )Tj +1.283 0 Td +(a )Tj +0.949 0 Td +(constructor )Tj +5.284 0 Td +(as )Tj +1.338 0 Td +(a )Tj +0.949 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.393 0 Td +(and )Tj +2.061 0 Td +(wr)Tj +1.099 0 Td +(aps )Tj +1.894 0 Td +(the )Tj +/TT1 1 Tf +1.783 0 Td +(run)Tj +/TT0 1 Tf +( )Tj +2.25 0 Td +(method )Tj +-38.921 -1.44 Td +(with )Tj +2.5 0 Td +(additional )Tj +4.946 0 Td +(functionality)Tj +5.3 0 Td +(. )Tj +0.814 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.666 0 Td +(added )Tj +3.278 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.444 0 Td +(of )Tj +/TT1 1 Tf +1.444 0 Td +(ThreadNameTrackingRunnable)Tj +/TT0 1 Tf +( )Tj +16.212 0 Td +(is )Tj +1.277 0 Td +(the )Tj +-40.866 -1.44 Td +(tempor)Tj +3.044 0 Td +(ary )Tj +1.769 0 Td +(renaming )Tj +4.492 0 Td +(of )Tj +1.27 0 Td +(the )Tj +1.77 0 Td +(current )Tj +3.492 0 Td +(thread. )Tj +3.363 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.492 0 Td +(name )Tj +2.825 0 Td +(of )Tj +1.27 0 Td +(the )Tj +1.77 0 Td +(thread )Tj +3.159 0 Td +(comprises )Tj +4.77 0 Td +(the )Tj +1.77 0 Td +(name )Tj +2.825 0 Td +(of )Tj +1.27 0 Td +(the )Tj +-40.866 -1.44 Td +(action )Tj +3.009 0 Td +(and )Tj +1.953 0 Td +(the )Tj +1.675 0 Td +(original )Tj +3.62 0 Td +(thread )Tj +3.064 0 Td +(name. )Tj +2.971 0 Td +(After )Tj +2.397 0 Td +(the )Tj +1.675 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.565 0 Td +(of )Tj +1.175 0 Td +(the )Tj +1.675 0 Td +(actual )Tj +/TT1 1 Tf +2.953 0 Td +(run)Tj +/TT0 1 Tf +( )Tj +2.141 0 Td +(method)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.87 0 Td +(the )Tj +1.675 0 Td +(c)Tj +0.482 0 Td +(hanges )Tj +-39.199 -1.44 Td +(are rolled bac)Tj +5.928 0 Td +(k \(see Listing 23\).)Tj +ET + +endstream +endobj +121 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 122 0 R>>endobj +122 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(48)Tj +/TT1 1 Tf +0 Tc 0 Tw -20.432 55.27 Td +(public class ThreadNameTrackingRunnable implements Runnable{)Tj +0 -1.79 TD +( private String actionName;)Tj +T* +( private Runnable runnable;)Tj +0 -3.58 TD +( public ThreadNameTrackingRunnable\(Runnable runnable,String )Tj +0 -0.99 TD +(actionName\) {)Tj +0 -1.79 TD +( this.actionName = actionName;)Tj +T* +( this.runnable = runnable;)Tj +T* +( })Tj +T* +( @Override)Tj +T* +( public void run\(\) {)Tj +T* +( String originName = Thread.currentThread\(\).getName\(\);)Tj +T* +( String tracingName = this.actionName + "#" + originName;)Tj +T* +( try{)Tj +T* +( Thread.currentThread\(\).setName\(tracingName\);)Tj +T* +( this.runnable.run\(\);)Tj +T* +( }finally{)Tj +0 -1.79 TD +( Thread.currentThread\(\).setName\(originName\);)Tj +0 -1.79 TD +( })Tj +T* +( })Tj +T* +( @Override)Tj +T* +( public String toString\(\) {)Tj +T* +( return "CurrentThreadRenameableRunnable{" + "actionName=" + )Tj +0 -0.99 TD +(actionName + '}';)Tj +0 -1.79 TD +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 23: Renaming the Current )Tj +14.376 0 Td +(T)Tj +0.511 0 Td +(hread)Tj +-13.087 -2.24 Td +(T)Tj +0.511 0 Td +(hread )Tj +2.731 0 Td +(renaming )Tj +4.342 0 Td +(inside )Tj +2.843 0 Td +(an )Tj +1.342 0 Td +(EJB )Tj +1.675 0 Td +(container )Tj +4.343 0 Td +(is )Tj +0.953 0 Td +(not )Tj +1.676 0 Td +(allo)Tj +1.6 0 Td +(wed, )Tj +2.398 0 Td +(but )Tj +1.676 0 Td +(there )Tj +2.453 0 Td +(are )Tj +1.619 0 Td +(no )Tj +1.398 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.842 0 Td +(restrictions )Tj +4.954 0 Td +(in )Tj +1.12 0 Td +(a )Tj +-41.7 -1.44 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.73 0 Td +(container)Tj +3.983 0 Td +(. )Tj +0.952 0 Td +(Naming )Tj +4.119 0 Td +(threads )Tj +3.786 0 Td +(more )Tj +/C2_0 1 Tf +2.896 0 Td +<005E>Tj +/TT0 1 Tf +(uently )Tj +/C2_0 1 Tf +3.898 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly )Tj +/C2_0 1 Tf +5.843 0 Td +<004B00410045004800440041005D>Tj +/TT0 1 Tf +(es )Tj +4.731 0 Td +(the )Tj +2.008 0 Td +(interpretation )Tj +6.454 0 Td +(of )Tj +-41.366 -1.44 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.893 0 Td +(and )Tj +1.948 0 Td +(JConsole )Tj +4.116 0 Td +(output)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.366 0 Td +(and )Tj +1.948 0 Td +(it )Tj +0.892 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.392 0 Td +(increases )Tj +4.281 0 Td +(the )Tj +1.67 0 Td +(readability )Tj +4.893 0 Td +(of )Tj +1.17 0 Td +(a )Tj +0.836 0 Td +(thread )Tj +3.059 0 Td +(dump. )Tj +3.078 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.448 0 Td +(that )Tj +-40.588 -1.44 Td +(tric)Tj +1.371 0 Td +(k)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.158 0 Td +(it )Tj +0.964 0 Td +(is )Tj +1.075 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.741 0 Td +(easy )Tj +2.297 0 Td +(to )Tj +1.242 0 Td +(monitor )Tj +3.798 0 Td +(stuc)Tj +1.705 0 Td +(k )Tj +0.908 0 Td +(threads. )Tj +3.706 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.52 0 Td +(only )Tj +2.298 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.908 0 Td +(to )Tj +1.242 0 Td +(connect )Tj +3.854 0 Td +(to )Tj +1.242 0 Td +(the )Tj +1.742 0 Td +(JVM )Tj +2.242 0 Td +(and )Tj +2.02 0 Td +(list )Tj +1.631 0 Td +(all )Tj +-41.144 -1.44 Td +(threads )Tj +3.511 0 Td +(to )Tj +1.233 0 Td +(identify )Tj +3.623 0 Td +(slo)Tj +1.211 0 Td +(w )Tj +1.177 0 Td +(actions. )Tj +/TT1 1 Tf +3.734 0 Td +(ThreadNameTrackingRunnable )Tj +/TT0 1 Tf +16.324 0 Td +(uses )Tj +2.233 0 Td +(the )Tj +1.733 0 Td +(name )Tj +2.788 0 Td +(of )Tj +1.233 0 Td +(the )Tj +1.733 0 Td +(URI )Tj +ET + +endstream +endobj +123 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 124 0 R>>endobj +124 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(49)Tj +0 Tc 0 Tw -20.432 57.06 Td +(for )Tj +1.613 0 Td +(renaming. )Tj +4.78 0 Td +(J)Tj +0.26 0 Td +(ust )Tj +1.669 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.946 0 Td +(looking )Tj +3.67 0 Td +(at )Tj +1.224 0 Td +(the )Tj +1.78 0 Td +(thread )Tj +3.169 0 Td +(dump)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.197 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.558 0 Td +(get )Tj +1.724 0 Td +(an )Tj +1.502 0 Td +(idea )Tj +2.28 0 Td +(about )Tj +2.892 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.78 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.891 0 Td +(system )Tj +3.335 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(doing.)Tj +/TT2 1 Tf +12 0 0 12 57 578.8 Tm +(Sending MetaData with REST or KISS in Second Iter)Tj +22.549 0 Td +(ation)Tj +/TT0 1 Tf +10 0 0 10 75 556.4 Tm +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +1.521 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +2.021 0 Td +(iter)Tj +1.377 0 Td +(ation )Tj +2.633 0 Td +(of )Tj +1.299 0 Td +(the )Tj +1.799 0 Td +(client )Tj +2.855 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.354 0 Td +(simplistic )Tj +4.522 0 Td +(and )Tj +2.077 0 Td +(successfully )Tj +5.578 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.521 0 Td +(in )Tj +1.299 0 Td +(production )Tj +5.19 0 Td +(for )Tj +-41.033 -1.44 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.15 0 Td +(weeks. )Tj +3.317 0 Td +(It )Tj +0.928 0 Td +(w)Tj +0.766 0 Td +(orked )Tj +2.817 0 Td +(perfectly )Tj +4.095 0 Td +(until )Tj +2.318 0 Td +(a )Tj +0.872 0 Td +(cr)Tj +0.821 0 Td +(a)Tj +0.482 0 Td +(wling )Tj +2.762 0 Td +(bot )Tj +1.762 0 Td +(found )Tj +2.874 0 Td +(some )Tj +2.65 0 Td +(str)Tj +0.988 0 Td +(ange )Tj +2.428 0 Td +(posts )Tj +2.54 0 Td +(interesting )Tj +4.818 0 Td +(and)Tj +( )Tj +-40.588 -1.44 Td +(begun )Tj +2.971 0 Td +(to )Tj +1.137 0 Td +(poll )Tj +1.971 0 Td +(these. )Tj +2.767 0 Td +(After )Tj +2.359 0 Td +(a )Tj +0.803 0 Td +(few )Tj +1.859 0 Td +(da)Tj +1.026 0 Td +(ys)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.442 0 Td +(these )Tj +2.526 0 Td +(three )Tj +2.47 0 Td +(posts )Tj +2.471 0 Td +(became )Tj +3.692 0 Td +(the )Tj +1.637 0 Td +(top )Tj +1.693 0 Td +(three )Tj +2.47 0 Td +(and )Tj +1.915 0 Td +(were, )Tj +2.692 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.803 0 Td +(far)Tj +1.037 0 Td +(, )Tj +0.581 0 Td +(the )Tj +-40.866 -1.44 Td +(most popular ones)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.413 0 Td +(robot )Tj +2.636 0 Td +(itself )Tj +2.358 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.246 0 Td +(easily )Tj +/C2_0 1 Tf +2.802 0 Td +<0041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(able. )Tj +5.397 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.413 0 Td +(user )Tj +2.135 0 Td +(agent )Tj +2.691 0 Td +(\()Tj +/TT3 1 Tf +(tversity )Tj +5.758 0 Td +(mediabot)Tj +/TT0 1 Tf +(\) )Tj +5.436 0 Td +(in )Tj +1.191 0 Td +(the )Tj +1.691 0 Td +(HTTP )Tj +-39.754 -1.44 Td +(header )Tj +3.289 0 Td +(rev)Tj +1.321 0 Td +(ealed )Tj +2.678 0 Td +(his )Tj +1.567 0 Td +(non-human )Tj +5.346 0 Td +(nature. )Tj +3.271 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.4 0 Td +(remed)Tj +2.698 0 Td +(y )Tj +0.844 0 Td +(is )Tj +1.011 0 Td +(simple: )Tj +3.419 0 Td +(All )Tj +1.567 0 Td +(requests )Tj +3.845 0 Td +(containing )Tj +4.902 0 Td +(the )Tj +1.678 0 Td +(robot\222)Tj +2.465 0 Td +(s )Tj +-41.811 -1.44 Td +(user )Tj +2.096 0 Td +(agent )Tj +2.652 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.264 0 Td +(be )Tj +1.374 0 Td +(monitored )Tj +4.764 0 Td +(but )Tj +1.708 0 Td +(ignored )Tj +3.597 0 Td +(in )Tj +1.152 0 Td +(the )Tj +1.652 0 Td +(statistics. )Tj +4.116 0 Td +(A )Tj +/C2_0 1 Tf +0.985 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.263 0 Td +(implementation, )Tj +7.376 0 Td +(for )Tj +1.485 0 Td +(example, )Tj +-38.255 -1.44 Td +(a )Tj +0.809 0 Td +(single )Tj +2.81 0 Td +(method )Tj +/TT3 1 Tf +3.588 0 Td +(boolean )Tj +4.831 0 Td +(accept\(String )Tj +8.432 0 Td +(uri\))Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.959 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.255 0 Td +(easily )Tj +2.754 0 Td +(solv)Tj +1.711 0 Td +(e )Tj +0.809 0 Td +(the )Tj +1.643 0 Td +(problem. )Tj +4.125 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.365 0 Td +(easiest )Tj +-39.366 -1.44 Td +(possible )Tj +3.87 0 Td +(solution )Tj +3.815 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.314 0 Td +(be )Tj +1.424 0 Td +(the )Tj +1.702 0 Td +(implementation )Tj +7.148 0 Td +(of )Tj +1.202 0 Td +(the )Tj +/C2_0 1 Tf +1.702 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.313 0 Td +(logic )Tj +2.48 0 Td +(directly )Tj +3.591 0 Td +(in )Tj +1.202 0 Td +(the )Tj +1.702 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.868 0 Td +(probe. )Tj +3.147 0 Td +(No )Tj +-40.866 -1.44 Td +(c)Tj +0.482 0 Td +(hanges )Tj +3.307 0 Td +(in )Tj +1.14 0 Td +(the )Tj +1.64 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.418 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.252 0 Td +(be )Tj +1.362 0 Td +(required )Tj +3.918 0 Td +(in )Tj +1.14 0 Td +(that )Tj +1.918 0 Td +(case. )Tj +2.436 0 Td +(Although )Tj +4.253 0 Td +(this )Tj +1.807 0 Td +(solution )Tj +3.753 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.252 0 Td +(w)Tj +0.766 0 Td +(ork, )Tj +1.973 0 Td +(it )Tj +0.862 0 Td +(has )Tj +/C2_0 1 Tf +-40.755 -1.44 Td +<004B00470045003D0001004B0041003F00460041005D>Tj +/TT0 1 Tf +(cant dr)Tj +8.102 0 Td +(a)Tj +0.482 0 Td +(wbac)Tj +2.316 0 Td +(ks:)Tj +/C2_0 1 Tf +-9.8 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(P)Tj +0.511 0 Td +(otential )Tj +3.838 0 Td +(performance )Tj +6.059 0 Td +(problems )Tj +4.615 0 Td +(could )Tj +3.06 0 Td +(directly )Tj +3.837 0 Td +(affect )Tj +2.948 0 Td +(the )Tj +1.948 0 Td +(application. )Tj +5.691 0 Td +(Async)Tj +2.594 0 Td +(hronous )Tj +-35.098 -1.44 Td +(processing in the plain )Tj +9.968 0 Td +(W)Tj +0.963 0 Td +(eb container is harder to ac)Tj +11.764 0 Td +(hiev)Tj +1.822 0 Td +(e.)Tj +/C2_0 1 Tf +-27.017 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.394 0 Td +(distribution )Tj +5.23 0 Td +(of )Tj +1.172 0 Td +(business )Tj +3.951 0 Td +(logic )Tj +2.45 0 Td +(is )Tj +1.005 0 Td +(harder )Tj +3.116 0 Td +(to )Tj +1.172 0 Td +(maintain. )Tj +4.321 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.394 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.838 0 Td +(probe )Tj +2.839 0 Td +(should )Tj +3.229 0 Td +(remain )Tj +3.338 0 Td +(a )Tj +-38.1 -1.44 Td +(simple proxy)Tj +/TT1 1 Tf +(.)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(Robot acti)Tj +4.373 0 Td +(vity couldn\222)Tj +5.077 0 Td +(t be monitored; it w)Tj +8.492 0 Td +(ould be in)Tj +4.38 0 Td +(visible at the serv)Tj +7.435 0 Td +(er side)Tj +/TT1 1 Tf +(.)Tj +/C2_0 1 Tf +-32.257 -2.24 Td +<0055>Tj +/TT0 1 Tf +2.5 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.22 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.664 0 Td +(additional )Tj +4.667 0 Td +(aspect )Tj +3.054 0 Td +(or )Tj +1.22 0 Td +(bug )Tj +/C2_0 1 Tf +1.943 0 Td +<005D>Tj +/TT0 1 Tf +(x, )Tj +1.665 0 Td +(the )Tj +1.665 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.831 0 Td +(probe )Tj +2.832 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.277 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.831 0 Td +(to )Tj +1.165 0 Td +(be )Tj +1.387 0 Td +(recompiled )Tj +5.221 0 Td +(and )Tj +-36.988 -1.44 Td +(the application \(Roller blog\) w)Tj +13.05 0 Td +(ould need to be restarted)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +-14.85 -2.24 Td +(A )Tj +1.047 0 Td +(bac)Tj +1.538 0 Td +(k)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(end )Tj +/C2_0 1 Tf +2.825 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.325 0 Td +(implementation )Tj +7.16 0 Td +(isn\222)Tj +1.464 0 Td +(t )Tj +0.658 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.88 0 Td +(harder)Tj +2.704 0 Td +(, )Tj +0.658 0 Td +(but )Tj +1.77 0 Td +(the )Tj +1.714 0 Td +(user )Tj +2.158 0 Td +(agent )Tj +2.714 0 Td +(has )Tj +1.825 0 Td +(to )Tj +1.214 0 Td +(be )Tj +1.436 0 Td +(passed )Tj +3.27 0 Td +(from )Tj +-40.2 -1.44 Td +(the )Tj +(client )Tj +4.281 0 Td +(to )Tj +(the )Tj +2.725 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +(for )Tj +2.557 0 Td +(that )Tj +(purpose. )Tj +5.819 0 Td +(T)Tj +0.456 0 Td +(o )Tj +(meet )Tj +3.224 0 Td +(this )Tj +(requirement)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +7.531 0 Td +(the )Tj +(URI )Tj +3.558 0 Td +(and )Tj +(referer )Tj +(encoding )Tj +9.227 0 Td +(on )Tj +-41.088 -1.44 Td +(the )Tj +1.901 0 Td +(x)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.067 0 Td +(probe )Tj +3.068 0 Td +(and )Tj +2.179 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.4 0 Td +(will )Tj +2.179 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.067 0 Td +(to )Tj +1.401 0 Td +(be )Tj +1.623 0 Td +(enhanced )Tj +4.791 0 Td +(to )Tj +1.401 0 Td +(support )Tj +3.791 0 Td +(the )Tj +1.901 0 Td +(additional )Tj +4.903 0 Td +(user )Tj +2.345 0 Td +(agent )Tj +-39.866 -1.44 Td +(par)Tj +1.377 0 Td +(ameter)Tj +2.87 0 Td +(. )Tj +0.482 0 Td +(T)Tj +/C2_0 1 Tf +0.511 0 Td +<0040003D0001003B004D004A004A003D0046004C0001003D0046003B0047003C00410046003F00010041004B000100460047004C0001005E>Tj +/TT0 1 Tf +(exible enough. See the follo)Tj +24.111 0 Td +(wing excerpt from Listing 22:)Tj +/TT3 1 Tf +-27.551 -1.79 Td +( String createName\(final String uri, final String referer\) {)Tj +0 -1.79 TD +( return uri + "|" + referer;)Tj +T* +( })Tj +/TT0 1 Tf +0 -2.24 TD +(Ac)Tj +1.149 0 Td +(hieving )Tj +3.823 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(side )Tj +/C2_0 1 Tf +3.544 0 Td +<005D>Tj +/TT0 1 Tf +(ltering )Tj +3.934 0 Td +(turned )Tj +3.434 0 Td +(out )Tj +2.045 0 Td +(to )Tj +1.489 0 Td +(be )Tj +1.711 0 Td +(major )Tj +3.155 0 Td +(rew)Tj +1.599 0 Td +(ork. )Tj +2.322 0 Td +(Encoding )Tj +4.657 0 Td +(of )Tj +1.489 0 Td +(additional )Tj +-37.864 -1.44 Td +(key-v)Tj +2.309 0 Td +(alue )Tj +2.253 0 Td +(pairs )Tj +2.475 0 Td +(in )Tj +1.253 0 Td +(the )Tj +1.753 0 Td +(HTTP )Tj +2.865 0 Td +(bod)Tj +1.644 0 Td +(y )Tj +0.919 0 Td +(w)Tj +0.76 0 Td +(as )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 232.3573 115.5001 Tm +(completely )Tj +5.198 0 Td +(remo)Tj +2.21 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.475 0 Td +(and )Tj +2.031 0 Td +(they )Tj +2.253 0 Td +(were )Tj +2.53 0 Td +(passed )Tj +3.309 0 Td +(in )Tj +1.253 0 Td +(an )Tj +1.475 0 Td +(HTTP )Tj +-39.754 -1.44 Td +(header )Tj +3.376 0 Td +(instead. )Tj +3.766 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.32 0 Td +(this )Tj +1.932 0 Td +(purpose)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.127 0 Td +(the )Tj +1.765 0 Td +(client )Tj +2.821 0 Td +(implementation )Tj +7.211 0 Td +(had )Tj +2.043 0 Td +(to )Tj +1.265 0 Td +(be )Tj +1.487 0 Td +(extended )Tj +4.377 0 Td +(to )Tj +1.265 0 Td +(support )Tj +3.655 0 Td +(the )Tj +-40.866 -1.44 Td +(key)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(v)Tj +2.576 0 Td +(alue pairs passed in HTTP header \(see Listing 24\):)Tj +ET + +endstream +endobj +125 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 126 0 R>>endobj +126 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(50)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +(public static final String )Tj +/TT2 1 Tf +(HEADER_NAME_PREFIX)Tj +/TT1 1 Tf +( = "xray_";)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +(public void put\(String content, Map headers\) {)Tj +0 -1.79 TD +( try {)Tj +T* +( Socket socket = new Socket\(inetAddress, port\);)Tj +T* +( socket.setSoTimeout\(TIMEOUT\);)Tj +T* +( BufferedWriter wr = new BufferedWriter\(new )Tj +0 -0.99 TD +(OutputStreamWriter\(socket.getOutputStream\(\), "UTF8"\)\);)Tj +0 -1.79 TD +( wr.write\(\223PUT " + path + " HTTP/1.0\\r\\n"\);)Tj +T* +( wr.write\(getFormattedHeader\("Content-Length","" + )Tj +0 -0.99 TD +(content.length\(\)\)\);)Tj +0 -1.79 TD +( wr.write\(getFormattedHeader\("Content-Type", "text/)Tj +0 -0.99 TD +(plain"\)\);)Tj +/TT2 1 Tf +0 -1.79 TD +( for \(Map.Entry header : headers.entrySet)Tj +0 -0.99 TD +(\(\)\) {)Tj +0 -1.79 TD +( wr.write\(getFormattedHeader\(HEADER_NAME_PREFIX + )Tj +0 -0.99 TD +(header.getKey\(\),header.getValue\(\)\)\);)Tj +0 -1.79 TD +( })Tj +/TT1 1 Tf +T* +( //bookkeeping skipped)Tj +T* +( })Tj +T* +( String getFormattedHeader\(String key,String value\){)Tj +T* +( return key + ": " + value + "\\r\\n";)Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 24: P)Tj +5.189 0 Td +(assing )Tj +2.853 0 Td +(Additional K)Tj +5.368 0 Td +(ey )Tj +1.186 0 Td +(V)Tj +0.612 0 Td +(alues in a Header)Tj +-13.408 -2.24 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.496 0 Td +(the )Tj +1.718 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.108 0 Td +(of )Tj +1.218 0 Td +(key-v)Tj +2.309 0 Td +(alue )Tj +2.218 0 Td +(pairs, )Tj +2.718 0 Td +(metadata )Tj +4.329 0 Td +(processing )Tj +4.941 0 Td +(and )Tj +1.996 0 Td +(tr)Tj +0.599 0 Td +(ansport )Tj +3.552 0 Td +(become )Tj +3.829 0 Td +(generic. )Tj +-38.755 -1.44 Td +(T)Tj +0.511 0 Td +(he HTTP headers are con)Tj +10.881 0 Td +(v)Tj +0.488 0 Td +(erted into a)Tj +/TT1 1 Tf +( Map)Tj +/TT0 1 Tf +( \(see Listing 25\):)Tj +/TT1 1 Tf +-11.88 -1.79 Td +( Map extractHeaders\(HttpServletRequest )Tj +0 -0.99 TD +(httpServletRequest\){)Tj +0 -1.79 TD +( Map headers = new HashMap\(\);)Tj +T* +( Enumeration headerNames = )Tj +0 -0.99 TD +(httpServletRequest.getHeaderNames\(\);)Tj +0 -1.79 TD +( if\(headerNames == null\){)Tj +T* +( return headers;)Tj +T* +( })Tj +T* +( while \(headerNames.hasMoreElements\(\)\){)Tj +T* +( String name = headerNames.nextElement\(\);)Tj +ET + +endstream +endobj +127 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 129 0 R>>endobj +128 0 obj<>endobj +129 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(51)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( String header = httpServletRequest.getHeader\(name\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( headers.put\(name,header\);)Tj +0 -1.79 TD +( })Tj +T* +( return headers;)Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 25: HTTP Header to )Tj +/TT1 1 Tf +(java.util.Map)Tj +/TT0 1 Tf +( Con)Tj +21.852 0 Td +(v)Tj +0.488 0 Td +(ersion)Tj +-20.54 -2.24 Td +(Sending )Tj +3.799 0 Td +(the )Tj +1.687 0 Td +(original )Tj +3.632 0 Td +(headers )Tj +3.687 0 Td +(directly )Tj +3.576 0 Td +(via )Tj +1.631 0 Td +(HTTP )Tj +2.799 0 Td +(PUT )Tj +2.243 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.299 0 Td +(break )Tj +2.742 0 Td +(the )Tj +1.687 0 Td +(HTTP )Tj +2.799 0 Td +(communication. )Tj +-35.142 -1.44 Td +(Essential )Tj +4.136 0 Td +(headers)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.052 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.024 0 Td +(as )Tj +/TT1 1 Tf +1.357 0 Td +(Content-Length)Tj +/TT0 1 Tf +(, )Tj +9.147 0 Td +(or )Tj +/TT1 1 Tf +1.357 0 Td +(Content-Type)Tj +/TT0 1 Tf +(, )Tj +7.947 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.414 0 Td +(be )Tj +1.524 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erridden. )Tj +4.284 0 Td +(T)Tj +0.511 0 Td +(his )Tj +-40.977 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.262 0 Td +(cause )Tj +2.761 0 Td +(errors )Tj +2.76 0 Td +(and )Tj +1.928 0 Td +(lead )Tj +2.15 0 Td +(to )Tj +/C2_0 1 Tf +1.15 0 Td +<004D0046003C003D005D>Tj +/TT0 1 Tf +(ned )Tj +4.652 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(. )Tj +0.52 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.872 0 Td +(resolv)Tj +2.544 0 Td +(e )Tj +0.816 0 Td +(the )Tj +1.65 0 Td +(collisions, )Tj +4.652 0 Td +(the )Tj +1.65 0 Td +(constant )Tj +/TT1 1 Tf +3.929 0 Td +(xray_)Tj +/TT0 1 Tf +( )Tj +-39.2 -1.44 Td +(is )Tj +1.23 0 Td +(prepended )Tj +5.176 0 Td +(to )Tj +1.397 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +1.119 0 Td +(header )Tj +3.509 0 Td +(name. )Tj +3.231 0 Td +(Sending )Tj +4.009 0 Td +(original )Tj +3.842 0 Td +(headers )Tj +3.898 0 Td +(with )Tj +2.454 0 Td +(encoded )Tj +4.287 0 Td +(names )Tj +3.342 0 Td +(ensures )Tj +-38.977 -1.44 Td +(uniqueness )Tj +5.247 0 Td +(and )Tj +2.023 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.578 0 Td +(the )Tj +1.745 0 Td +(attac)Tj +2.038 0 Td +(hment )Tj +3.134 0 Td +(of )Tj +1.245 0 Td +(arbitr)Tj +2.266 0 Td +(ary )Tj +1.744 0 Td +(amounts )Tj +4.079 0 Td +(of )Tj +1.245 0 Td +(additional )Tj +4.747 0 Td +(metadata )Tj +4.356 0 Td +(to )Tj +1.245 0 Td +(an )Tj +1.467 0 Td +(HTTP )Tj +-39.754 -1.44 Td +(request. )Tj +3.609 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.349 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.126 0 Td +(has )Tj +1.738 0 Td +(access )Tj +3.071 0 Td +(to )Tj +1.127 0 Td +(the )Tj +1.627 0 Td +(entire )Tj +2.738 0 Td +(metadata )Tj +4.238 0 Td +(and )Tj +1.905 0 Td +(can )Tj +1.849 0 Td +(perform )Tj +3.682 0 Td +(arbitr)Tj +2.266 0 Td +(ary )Tj +/C2_0 1 Tf +1.626 0 Td +<005D>Tj +/TT0 1 Tf +(ltering. )Tj +3.776 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.349 0 Td +(client )Tj +-39.81 -1.44 Td +(remains responsible for metadata extr)Tj +16.103 0 Td +(action and communication only)Tj +13.692 0 Td +(.)Tj +/TT3 1 Tf +12 0 0 12 57 398.5001 Tm +(Don't )Tj +2.705 0 Td +(T)Tj +0.456 0 Td +(est Ev)Tj +2.488 0 Td +(erything )Tj +/TT0 1 Tf +10 0 0 10 75 376.1001 Tm +(Unit )Tj +2.185 0 Td +(tests )Tj +2.129 0 Td +(are )Tj +1.628 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.628 0 Td +(capable )Tj +3.685 0 Td +(of )Tj +/C2_0 1 Tf +1.129 0 Td +<005D>Tj +/TT0 1 Tf +(nding )Tj +3.297 0 Td +(tri)Tj +0.871 0 Td +(vial )Tj +1.851 0 Td +(bugs )Tj +2.296 0 Td +(and )Tj +1.907 0 Td +(misconceptions )Tj +7.02 0 Td +(quic)Tj +1.872 0 Td +(kly)Tj +1.186 0 Td +(. )Tj +0.536 0 Td +(At )Tj +1.24 0 Td +(conferences, )Tj +-36.754 -1.44 Td +(in )Tj +1.259 0 Td +(blogs, )Tj +2.982 0 Td +(in )Tj +1.259 0 Td +(articles)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.731 0 Td +(and )Tj +2.037 0 Td +(in )Tj +1.259 0 Td +(Iv)Tj +0.76 0 Td +(ory )Tj +1.74 0 Td +(T)Tj +0.456 0 Td +(o)Tj +0.544 0 Td +(wers)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.675 0 Td +(80+% )Tj +3.032 0 Td +(code )Tj +2.537 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.925 0 Td +(seems )Tj +3.036 0 Td +(to )Tj +1.259 0 Td +(be )Tj +1.481 0 Td +(a )Tj +0.925 0 Td +(well-established)Tj +( )Tj +-35.253 -1.44 Td +(standard. )Tj +1.8 -2.24 Td +(Using )Tj +3.022 0 Td +(code )Tj +2.633 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +2.021 0 Td +(as )Tj +1.41 0 Td +(a )Tj +1.021 0 Td +(metric )Tj +3.243 0 Td +(is )Tj +1.188 0 Td +(fun )Tj +1.911 0 Td +(in )Tj +1.355 0 Td +(m)Tj +0.821 0 Td +(y )Tj +1.021 0 Td +(case )Tj +2.41 0 Td +(\(I\222m )Tj +2.188 0 Td +(also )Tj +2.244 0 Td +(in )Tj +1.355 0 Td +(the )Tj +1.855 0 Td +(role )Tj +2.188 0 Td +(of )Tj +1.355 0 Td +(the )Tj +1.855 0 Td +(quality )Tj +-39.254 -1.44 Td +(assur)Tj +2.155 0 Td +(ance )Tj +2.337 0 Td +(department )Tj +5.171 0 Td +(:-\)\), )Tj +1.726 0 Td +(but )Tj +1.671 0 Td +(it )Tj +0.837 0 Td +(can )Tj +1.837 0 Td +(be )Tj +1.337 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.614 0 Td +(destructi)Tj +3.65 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.781 0 Td +(in )Tj +1.115 0 Td +(bigger )Tj +2.948 0 Td +(corpor)Tj +2.822 0 Td +(ations. )Tj +3.116 0 Td +(F)Tj +0.455 0 Td +(or)Tj +0.877 0 Td +(cing )Tj +2.115 0 Td +(dev)Tj +1.544 0 Td +(elopers )Tj +-39.088 -1.44 Td +(to )Tj +1.215 0 Td +(conform )Tj +3.993 0 Td +(to )Tj +1.215 0 Td +(a )Tj +0.881 0 Td +(code )Tj +2.493 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.881 0 Td +(statistic )Tj +3.549 0 Td +(causes )Tj +3.215 0 Td +(extensi)Tj +2.983 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.881 0 Td +(testing )Tj +3.16 0 Td +(of )Tj +1.215 0 Td +(tri)Tj +0.871 0 Td +(vial )Tj +1.937 0 Td +(stuff )Tj +/C2_0 1 Tf +2.16 0 Td +<005D>Tj +/TT0 1 Tf +(rst. )Tj +2.215 0 Td +(Especially )Tj +4.66 0 Td +(in )Tj +-41.366 -1.44 Td +(J2EE )Tj +2.176 0 Td +(projects)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.982 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.453 0 Td +(could )Tj +2.788 0 Td +(ac)Tj +0.982 0 Td +(hiev)Tj +1.822 0 Td +(e )Tj +0.841 0 Td +(remarkable )Tj +5.174 0 Td +(code )Tj +2.454 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.841 0 Td +(with )Tj +2.232 0 Td +(testing )Tj +3.12 0 Td +(of )Tj +1.175 0 Td +(indirections, )Tj +5.677 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(ering)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-39.783 -1.44 Td +(and dumb data tr)Tj +7.38 0 Td +(ansfer objects \(DT)Tj +7.744 0 Td +(Os\), without ev)Tj +6.602 0 Td +(en touc)Tj +3.206 0 Td +(hing the actual business logic. )Tj +-23.132 -2.24 Td +(F)Tj +0.455 0 Td +(or )Tj +1.222 0 Td +(x)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.083 0 Td +(I )Tj +0.611 0 Td +(wrote )Tj +2.778 0 Td +(tests )Tj +2.167 0 Td +(only )Tj +2.223 0 Td +(for )Tj +1.5 0 Td +(methods )Tj +4.001 0 Td +(that )Tj +1.945 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.833 0 Td +(a )Tj +/C2_0 1 Tf +0.833 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cant )Tj +4.724 0 Td +(amount )Tj +3.612 0 Td +(of )Tj +1.167 0 Td +(business )Tj +3.946 0 Td +(logic. )Tj +2.723 0 Td +(But )Tj +-40.755 -1.44 Td +(should )Tj +3.432 0 Td +(we )Tj +/C2_0 1 Tf +1.819 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(ne )Tj +/C2_0 1 Tf +3.209 0 Td +<005A004B0041003F00460041005D>Tj +/TT0 1 Tf +(cant\224? )Tj +6.117 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.653 0 Td +(can )Tj +/C2_0 1 Tf +2.097 0 Td +<005D>Tj +/TT0 1 Tf +(nd )Tj +2.209 0 Td +(a )Tj +1.041 0 Td +(good )Tj +/C2_0 1 Tf +2.709 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(nition )Tj +4.655 0 Td +(for )Tj +1.708 0 Td +(\223a )Tj +/C2_0 1 Tf +1.485 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cant )Tj +4.932 0 Td +(amount )Tj +3.82 0 Td +(of )Tj +-41.366 -1.44 Td +(business logic\224 in )Tj +7.8 0 Td +(W)Tj +0.982 0 Td +(ikipedia under \223c)Tj +7.423 0 Td +(yclomatic complexity\224 )Tj +-16.205 -1.44 Td +(\()Tj +0.29 0 Td +(h)Tj +0.568 0 Td +(t)Tj +0.29 0 Td +(t)Tj +0.29 0 Td +(p)Tj +0.568 0 Td +(:)Tj +0.29 0 Td +(/)Tj +0.29 0 Td +(/)Tj +0.29 0 Td +(e)Tj +0.512 0 Td +(n)Tj +0.568 0 Td +(.)Tj +0.29 0 Td +(w)Tj +0.79 0 Td +(i)Tj +0.29 0 Td +(k)Tj +0.512 0 Td +(i)Tj +0.29 0 Td +(p)Tj +0.568 0 Td +(e)Tj +0.512 0 Td +(d)Tj +0.568 0 Td +(i)Tj +0.29 0 Td +(a)Tj +0.512 0 Td +(.)Tj +0.29 0 Td +(o)Tj +0.568 0 Td +(r)Tj +0.345 0 Td +(g)Tj +0.512 0 Td +(/)Tj +0.29 0 Td +(w)Tj +0.79 0 Td +(i)Tj +0.29 0 Td +(k)Tj +0.512 0 Td +(i)Tj +0.29 0 Td +(/)Tj +0.29 0 Td +(C)Tj +0.679 0 Td +(y)Tj +0.512 0 Td +(c)Tj +0.512 0 Td +(l)Tj +0.29 0 Td +(o)Tj +0.568 0 Td +(m)Tj +0.845 0 Td +(a)Tj +0.512 0 Td +(t)Tj +0.29 0 Td +(i)Tj +0.29 0 Td +(c)Tj +0.512 0 Td +(_)Tj +0.512 0 Td +(c)Tj +0.512 0 Td +(o)Tj +0.568 0 Td +(m)Tj +0.845 0 Td +(p)Tj +0.568 0 Td +(l)Tj +0.29 0 Td +(e)Tj +0.512 0 Td +(x)Tj +0.512 0 Td +(i)Tj +0.29 0 Td +(t)Tj +0.29 0 Td +(y)Tj +0.512 0 Td +(\))Tj +0.29 0 Td +(. )Tj +1.062 0 Td +(C)Tj +0.679 0 Td +(y)Tj +0.512 0 Td +(c)Tj +0.512 0 Td +(l)Tj +0.29 0 Td +(o)Tj +0.568 0 Td +(m)Tj +0.845 0 Td +(a)Tj +0.512 0 Td +(t)Tj +0.29 0 Td +(i)Tj +0.29 0 Td +(c )Tj +1.284 0 Td +(c)Tj +0.512 0 Td +(o)Tj +0.568 0 Td +(m)Tj +0.845 0 Td +(p)Tj +0.568 0 Td +(l)Tj +0.29 0 Td +(e)Tj +0.512 0 Td +(x)Tj +0.512 0 Td +(i)Tj +0.29 0 Td +(t)Tj +0.29 0 Td +(y )Tj +1.284 0 Td +(m)Tj +0.845 0 Td +(e)Tj +0.512 0 Td +(a)Tj +0.512 0 Td +(s)Tj +0.401 0 Td +(u)Tj +0.568 0 Td +(r)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 448.5732 201.7001 Tm +(e)Tj +0.512 0 Td +(s )Tj +1.173 0 Td +(t)Tj +0.29 0 Td +(h)Tj +0.568 0 Td +(e)Tj +( )Tj +-41.7 -1.44 Td +(number )Tj +3.676 0 Td +(of )Tj +1.176 0 Td +(independent )Tj +5.734 0 Td +(execution )Tj +4.566 0 Td +(paths )Tj +2.621 0 Td +(in )Tj +1.176 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.787 0 Td +(methods )Tj +4.01 0 Td +(and )Tj +1.954 0 Td +(classes )Tj +3.287 0 Td +(and )Tj +1.954 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.398 0 Td +(in )Tj +1.176 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.787 0 Td +(modules.)Tj +( )Tj +-38.254 -1.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.666 0 Td +(higher )Tj +3.333 0 Td +(the )Tj +1.944 0 Td +(number)Tj +3.26 0 Td +(, )Tj +0.888 0 Td +(the )Tj +1.944 0 Td +(higher )Tj +3.333 0 Td +(the )Tj +1.944 0 Td +(complexity)Tj +4.687 0 Td +(. )Tj +0.851 0 Td +(An )Tj +/TT1 1 Tf +1.833 0 Td +(if-else)Tj +/TT0 1 Tf +( )Tj +4.811 0 Td +(bloc)Tj +1.872 0 Td +(k )Tj +1.11 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.556 0 Td +(result )Tj +2.944 0 Td +(in )Tj +1.444 0 Td +(a )Tj +-41.7 -1.44 Td +(c)Tj +0.476 0 Td +(yclomatic )Tj +4.556 0 Td +(complexity )Tj +5.112 0 Td +(of )Tj +1.167 0 Td +(2. )Tj +/TT1 1 Tf +1.167 0 Td +(For)Tj +/TT0 1 Tf +( )Tj +2.134 0 Td +(loops, )Tj +/TT1 1 Tf +2.946 0 Td +(while)Tj +/TT0 1 Tf +(, )Tj +3.612 0 Td +(and )Tj +/TT1 1 Tf +1.945 0 Td +(try-catch)Tj +/TT0 1 Tf +( )Tj +5.734 0 Td +(bloc)Tj +1.872 0 Td +(ks )Tj +1.222 0 Td +(increase )Tj +3.889 0 Td +(the )Tj +1.667 0 Td +(c)Tj +0.476 0 Td +(yclomatic )Tj +-37.977 -1.44 Td +(complexity )Tj +5.285 0 Td +(as )Tj +1.395 0 Td +(well. )Tj +2.581 0 Td +(A )Tj +1.173 0 Td +(good )Tj +2.674 0 Td +(rule )Tj +2.173 0 Td +(of )Tj +1.34 0 Td +(thumb )Tj +3.285 0 Td +(is )Tj +1.173 0 Td +(to )Tj +1.34 0 Td +(write )Tj +2.673 0 Td +(tests )Tj +2.34 0 Td +(for )Tj +1.673 0 Td +(ev)Tj +0.988 0 Td +(erything )Tj +4.007 0 Td +(with )Tj +2.396 0 Td +(a )Tj +1.006 0 Td +(c)Tj +0.476 0 Td +(yclomatic )Tj +-37.977 -1.44 Td +(complexity higher than 3. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(herefore)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.229 0 Td +(I )Tj +0.701 0 Td +(decided )Tj +3.869 0 Td +(to )Tj +1.257 0 Td +(test )Tj +1.868 0 Td +(only )Tj +2.313 0 Td +(methods )Tj +4.091 0 Td +(with )Tj +2.313 0 Td +(at )Tj +1.201 0 Td +(least )Tj +2.368 0 Td +(a )Tj +0.923 0 Td +(single )Tj +/TT1 1 Tf +2.924 0 Td +(if-else)Tj +/TT0 1 Tf +( )Tj +4.623 0 Td +(bloc)Tj +1.872 0 Td +(k. )Tj +1.127 0 Td +(T)Tj +0.456 0 Td +(esting )Tj +2.924 0 Td +(of )Tj +-41.366 -1.44 Td +(getters )Tj +3.465 0 Td +(and )Tj +2.299 0 Td +(setters )Tj +3.354 0 Td +(is )Tj +1.354 0 Td +(not )Tj +2.077 0 Td +(only )Tj +2.577 0 Td +(unnecessary)Tj +5.187 0 Td +(, )Tj +0.965 0 Td +(but )Tj +2.077 0 Td +(from )Tj +2.687 0 Td +(a )Tj +1.187 0 Td +(maintainability )Tj +7.134 0 Td +(perspecti)Tj +3.872 0 Td +(v)Tj +0.488 0 Td +(e)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.437 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +-41.144 -1.44 Td +(counter)Tj +3.224 0 Td +(-producti)Tj +3.928 0 Td +(v)Tj +0.488 0 Td +(e. )Tj +ET + +endstream +endobj +130 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 132 0 R>>endobj +131 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 266/Filter/FlateDecode/Width 941/Length 76914/Type/XObject/BitsPerComponent 8>>stream +HOSYժՊZZ*`+bM1vuj +jAlĩLl|Y1f7d7ln5LLF~?="+<={{1Y0.e!B!d-1uB!R v:Bg%B!T]Y !B!ha#tVB!BH%0uB!R v:Bg%B!T]Y !B!ha#tVB!BH%0uB!R v:Bg%B!T]Y !B!ha#tVB!BH%0uB!R v:Bg%B!띯 +͸pnܸׯ#addDF:LuJ!B3A;wd21_H>#.{x|0;҃gOFqqq]G|vpJ!B3---͛qFJ2>܋iLMLcV̦8 }^aPZ"U{t_Bg%B!O(|>n݊-[lڴfY<7i>ݶy['sâ4;>GC*\lG ڻY鬄BLf(WEX N;vlX,",ضmXz4ףnexκM>9 uszf G%^:Ӓ}/d8+k__3B:V[}T6;ڂSŵ/g^gJg%BȺ#w"5$!(8SqI"=X + BepS|?osNvjCW鰹mǝc~4?>)] +b}]_4a0|KbϩYt7!;.=w/{F=9~m/CS=DZ=$vci9~jw)KcblgӞmoÃ.}WJ!)]-l6@Bs^LZս0U\EYꬕ<,&L +665#κ̷\k6l͆k׮n1uax9G'JEϩ]x-gҝUmBdT}!{F\3zG#u9iK Wy9`56~[[}댭a݅me}V\ ?[n6wǵϞٌr{WhEK.[,+E^9+MJJADjcnA'o'B\l>K x`t:,DӲ}3n5k*3ZPAsqgutCzDJF*>3>.eeвn᝶Z7;fՉV8kgg':t&Ih4ؚ}7vc/:nOF +}/`f}UW~z477Da>xz36zŜ?qF?p37A|K5?Hmv<CM}ؿƉĝ?ۛqi᧱ap|ɘٟocr}?bc31NGXWUu r#찑L3ump>‚pVj!g% "PsjțY ΰg={,VՃJ?;zs0<0g4DlE#s]g^..`͝)5_[m_@{ixXF8]ks̵xMtY}/Cx?tZ)e{Ǎu_#EF~@{E ?xՄ:![I}:'Y1gH!g% "PZNMGxp{ߠ# ~;.s1_r+yV,*[*KӪ= ag:[ +S]r]Y놁p>XWI:Vz}h}P( ߉սO+[%_EY[ZZ`Xr_ʊFo{Fnl<F. 6XcCVn^ИsEx;ψo5xq?ҝ:i]s.S;"P#AA$' +T*TuՆ]Sr(xO1_z~}~qu7;D S5 j5233EK5l6Øj<;'9&nq}lYg9ّ[#Ƴۍ5Γ$a[nסGY  2NYSl={͛lػw/J% +222D$[[A(Bߥ{}sj:9+AA޽׮]CKK &"9u(rV  "U~'OwlP*])GnסGY  Tё#G066qJDnסGY  Tg׮]P*χ'(I]!g%  $ܮCIlުBԔ;t:)넿+f( +L&~ AAe!P#ܽ*FFE\IIp;F̴ y+AAėf$/Sæݕv2U%Оwܮ|z +킩f8x˝LAAėæܭڋE9/#UjU"/H,'dw|l,)Ou֚rf/S-qJKKhdʝ 'AA就aD0:,X` uҎ,9ZgI|:N/U.r;HAAėF.RUccZZ*nh`z~Q]\ðFW躾~x1~HW*5ׯ115Z +vǭ9:Ѿ.>߀+y 8_%Y[R,/&CY  tf#q59Z+y#:Nc>:"j/=6|'qcpJjO߂=s80:/KNqx5U{]W@V,aQ_m16ܖfފZ;M_aT2[}1yb=tc89sk/pFWu=m +3BY~J}73!<8[;n:4)Ϟ=~?-8~ٽqw_1q̘&|Jll69cmQwTXxTˮ=BJ Marn s!lBAJ{Y3LMwӸ}ֻֻވ7ۜyT<$rV  +"s+u;I=;iN n; >W1w>y>jay y' 7ps=O8foD^l-mcycu/JA䚫 +z% IvcmR&YDCmϩi/!os!s{# kmwBg]J: a%d2ljqmD;| 9#),rV  ⫝̸"G`fkmfjcX{yKXjdžOΫ;ukκm P\?lfCX퓺Yo^sak8//^tY)%[_:;Y֕y7s\7.s@ntֈvΏQY `<[#>?WsS[ ,ok3i:4-'{v:ͱ7,Bd KCY-QfZ ʕ*Yuq">e^w -}vbIeT,} ^B?-jB{8`WTHFJAA#in^6ռ8{qO>9YO_' -kohp,ff~ m՜8%x3ێ'<}> "鶳"APcmի(u7CFd|qC4n~/d"Oȅο<6S;'@!^Nξo"B^8 +$og*'׸OV5܆!!_׬}k(lalBQY}E]B2C,]6Y+kljwBK_rV  y|$Ͼ: #35e1t!{󱶎z~w<V3f_xc/Lrg +vΞ`g&I ;ŋn;Q;SZΧ{$㠝[Aw̸۽=B&+8:mU/CY;2$'H7;gT 4mۉ*s40g%&<wU6U) HIT3qpQX[ 8ϗym-,Im;eWg*9+AA|N"ӗCcܿ,5bwu3t?}b74,ܓ3+f6{7κw'*ި'Of9sW(鶳nEs0|h|Ֆ=5we>D:NN) r9CeOȩZfMlXhuVZUIIn(,wfܘ;死irV  ^5gYO0Y(! +p +}70.>wbȨ5;zwjtײ^lehwߥsg׮ H3QU܆\cRK_kY +vj|GbQoGJAAu(#?YkɅPtOqlԏVCfmYmNY&H% sZXoIԌAAW^rw=ZeBJAAP.G?)!AAW^r; 9+AAբ׮C!g%g%g%  A]r9BJJJAAt^rSgռBP( +BPJ[1xRw`kg|~ʮ85ēZ'@<xf'FCI@ep"BS`:F^T!w "9&nȮ~3#]}{},wN[/<8aZ[o2 +lC%L;+sMݟfJuAAA"&̮'L.u$O^|o뵽)(#!H +lމ}VOgIU?^5 g%  88E̽7]6e%z~k^#ݿ0v{Z%g]1S.sck1JiAAq#<֘_/z3blmg)]]^Rtdrѐ=FL%8sd{]$bx`UsJ j` ]>sL6?4Ԧy{j#C-ҜkY  (m +`d*ViMn4m3.:#ٷ\! #قHTr#}+ΣwC𷚊/y[=혼#St Lwr]v,oJ.jSTjZӆutNVw@z.̈a(%΀sVFIވ ڸjTAA680?bq~66`KT1T<Nx-b?uՎc*:PgؖzW56U!lxm]r{t]xSk\Y;{Oߏ.w1 MW璿4z&g- ʭhXB/?IMtk  Jœ ̑vѷu{l0ZO? Me8ksb謜;"' )\Y0:k#0)y$gWj>uǎ`]9ylN'_;`4a6P:5}_U'T$.)wmDë'AADQ ̍V1{k!ߩll.`h2Y~=<cog*qԚ 6YgZ6]\%f<7 9u$8뾗]O¸נ\G0ԞIjK1ߏ*fXz]+'S{#"sg)  (Kgœ/,z3eڸXނ`hAodEW[Ÿzф7َz講os>.΂ɹ}c\v3/;Ř8?jߏ0us +.6OJ8'g-Qp|]7C['+_Nr[xz$ (9 f;M.8*ݕJ< ✶>U1;Og|4rXtW\_t=.ykj.|^ұ{2 umZkiÎv.ΝQ1fmT]gr֏ g5cϺzYuf# vqDep ]%MxpQ8}a\nVG0VZW°7j`us5h`rMm0u8:3d$ѽU0F]#.'Y~*T}ݴ?IcV2װ\mP{ FyX>EU9>|ICA<1VMx88#ntf-|;ydN7hRDVf*Yfb 󠚛9u!c>>ߠNYZ7X4ظ6}Ĺ,8TGC>I%giƝs39Ijx ެ b(=Oae!c2X0u6_8 +'46X~kl[3ϽFƱ\nl1*rWJۋIeXH߂Uf %aR1k=b/ اގQ,*rs'YfUbb`uVɟZE ~:vsK[I bV"_R)%0#a$y3cx=LQ s9ϿE,qzapQXɿ9P,OW;؊mVz8?~Phsx!q "S=r7X,\kn.n-rM_S b= XG=y6J*iW1 qIfycO"YA6_QQNiQb=HnF~,HvpNf8qʽu V gVŮQ*>Yi>4|J0aνFƅ\f^9|غ$FlĎ[qGI&fg{^epO{ 9 +a_ 4xfzVŬصrޯ14?.XmI4kY%XK6diգa&H8?[)rOAqL,ǴBƶ;#hRQzsky%ֺ2R7>K| r\d( ,}4*fԚˣvcbׄ{V50k w8V,g>ίa\L18lO9A^\u_7Q8/_7ws=X =qO7Vm%5E1+Nco۟*÷5n/|O4Bt; d}aGuyZ_~P2N5UFSfWulpaf0بKjGa0 [Z6z ܣ1}0aν&?Ux) * ?0l5-Ya DlKWJOc҇YI/f=̹g2oދe7o4(R;2WnQ%ǡ2+6Η"TR>XZqԘk'QUW^Nbb&* +2άS"30 `[ÎaYEZQ ^!3ˢUF}e9OK^Ӄ:i~Z1k91ӓ( ~ɮ|`0(]ߍ8 ٢PE1kqk.32K`QŽރ^1M={М{ f/o mԃ2[ToأTm#--xJVB9XG3ðde,XGf_#;18 41X Åa/fwl^?0&sT +эMy}{Tee>Z~hǟ*wc"r^ߞY)d,H_̓ҙXY.Mf0T\XH%wc(օN":م ^N/^:P U1Uj[eJ1WeVc9,%S6Z)Z !ԃicX] h~4zl؍ב*=}YAͅShX۟AC_??'7^&{?O?^ƣggf6`9gp4ߍ1 E;c+}0֙'$#UKȂ\Zk#k+Z]~qA9Gbb ~Q9qeeWOq@׊| [T+ū#OɾS ,w R}A4R\yͿ+q }38tTFa-uwrK1VHsW0>@}b̪/;aԤ8.BӞ2efS{tixټg33ϧ(Oz{-Yy_fO}{Hate#n nƬ-iuFKPP0+`@xk:zܘ u|{c (|/d8;Xc^eyi8 :bì̺3*Lk.x wx#jRGDY//6ɬw;FZ4Ϊ]Gs.1/iB}`q@ӳǬO0|75]S\zS8>Ub: +6,uID4 hMl,!#i2ehp/NS-RaS,?5p&P#ceش&ձ'p%Nlv,^=<=U.ԄYg0bABFt~cfc4QйYUSR}ԧp KPf{Ԗ`ɱ{tl P.ر>[&ɍjm0+̂w)TA̚1m6SyՔǸvǏdTŎcl^u$Y`V`rMÓL1b\lMFz3*nG#T  ̪o +td0k=ܷ: .6;͹Fr޻}5g!tB?tε#Z +_"Y(w^e[%fE9F6D8ͰUUi_~<`˱f(Kن&5l[਺dN5Oi痬2<oR;45 gēvrʭf9P\jR:E='@M}>;i>3TB})e2׆Oʲ5{^jh\at QY3nL2}Q<:.oL3<ͪFC)$GJP +`b!XzO{aů¥+χUReXN.z)uē[BJ46g-PJG־̙;;pBVT|+ Xl{Tfk* NG:{MY[p~eѨ_F3kao_N@խ:>AbXWaO8Ojį|cA>ܐ'ܖ[l90R9s_:}p#UQi3qbt}Ҹ+lY9ou"kg5M{r&?'=qtތi +5 'sTEy=h>9{^gZy!v=2k*Ȯ,|T׍ \6$E)sjvhou:v.4oEwg o*sM9kuؙTL0+uv4м 44Ĭ[9"km\SSp̤Ƹk,CL=>"I>1-׼4ތ w"Ijlw ?Ef 0bzZ W,F\_ӻa䥵e5ev2rx5> ڢig1P2+X1(q&—uVwzesiXOZf3f ~8AabP'\Qt8ؕJ@sIn/>=`n2s}#ܖ!5PAKBIN<$~[:r>]Hó>e*~idZêLqhk6`)@L-~=ވK4nNef {D4~oF|R(tC#=4)d>{Q1  ;F(xrv'c: "M Ֆ!؛{7'Է1ƣnwxe$5)gct~eѤN_t0K'T)fMq䊰5fKlobn.εҷuvr3b?c/m,CY}2hgtظ|/y/F%tfynHϮuݎz'09DR1ߊT̑FwYFhGVTDzi<T\{*6i=XUB_| VmՀ:ݕ܉R [s!XsKK&:f `7kCw3n".5j,R"ɁpNë2L0^1[EX,xLU%w/)5n3>YOk2'"!7 n#-x{]*ɜ?yƋǬȎ1Nk/bU5a+z{%¬UfmЌ74իjIqUctbN/D_S]VUmxAsK>tV?h{aTDzّshWzo*q[qơ|=wPЇG9wmW>dn_hm&\/9/%\󃢽Eugα\Yi؂   ~0hI\õ¼\k^_.ٗ9}AJAAD?P GAA:AAAAp9+AAA`ЮC1AJA|{ؐ^[R{)l;LNgϞe)hdylmd:mAL5(( vǓ{5ޮwܓ>FS6HTy棉AʠbcX.Dj"Ig=o|\#9*S`8 +}rY?<8ݹ78/W9X[Ad&_Spe, g)ޤqΰA^0Z3Z(c-=A6Ǫ̏5R2FW5 FA;p)8NkwҘ猻z؊W/s)Mi rT\s+id,xuBBZϪC>w paՊw̡tc4fFm.I|/ ĪkeM QeЎC1\a +֍NȎ=x#Zwִ{G˼\CtǮ⬶8SVge<~j ΤsvI+ޱF +IE[eW>#v}rVAP WBgesM)G(Rܛ3ǝN5?' c-: VtO hgt(TY84B lʷcn[ 87۝U39 pPo|S kGhaJQŰ1$Yg$nj}e] bE^k]R%/?"p!U_\2̸1=ƃea + UFPHbqKre#™Kkt}zL!+{gXv]c}u֮~W +#v}rV?1l?~=sgFnAѯ)lbH6U VtZG'7U}6$1t!{'F8qn? ŅBH +՚WO(_Ya ƜNwϢxȷus[@&U<8eK վKqZ_eqv-l`9H2,koRHS҂sഎ#éid9+7#6'|UI}?sYA_+r W*(³^׾.^o?E؁^^ ZoSʄ;vqr5: pNw 7QE[Y1 +)CZ[vZ&v'JNB}ՍN^Ӳ>K+D7nDEkWSwQSSnEݘG$în5 HwT\\S~Hw%E7< ljfRu< M0X֎P*z>Y6~+{x)lDn]ݷ~\'3u[ƃA>)I^汃 CzZ]a~g=ۉ"u"8nSEw@s|IUdaRysrĀ[-ַoOIs/1d򉦵khGkK+J+rmN_/NvfU]hmeLG~.K5꿟oA|U9ȣ;i*K7l-IiAj[ʏn +-malaɪ͐AeqYØUNBX61d0c_XD߬}=߷.*}'s<R_'aQ;ÔðI=☯gyfGYf bv~:6$^LD=8s<{l]+Q;} +"\'VˌGdTم+ -+JZK=UZ('y )-`Mgn z|?["n1V R +WG9%d&kpNռpBQ0y7S602VyU֞Y&¬)ɑ3~׊d_0ke0!mx[(XoQ@fune=r5e*' \ϘeˁdRGl;MrwT?ћ8&JV'@\kͬGVr`3nM^|Ǵ "](glf_A%Vcw0|'u¬OQN|D>0`ֈ!bB >=gJx'R]2Ox6N m#Y >O6fLF< ʾD_ܺeI98配¡d"aC riv`>S]VYÇ𸇱Xf baf0Ǭ~Zyf]؏L$_bfkfZH&'O"Yצ}.|] (9sa#.#\=zNs; Qe&Z2kK굙¥Ra3,)C̪yN +I7)F Z;"ɄfD?DQv2!lW ʄ*٫d ?~3`1+b]¬b_14#eWQe0t= 3 5%bᳩ(VRx2oHSb$v-8F_͸l~9ށD>"֎+lc*֒ +֥.Lp˄4G:a<0I_sz9$Lztoqv!6if8Qr":~v80"e7Ե̶ߵ"GIo`4`Bib}rcT6/2. +s Em;Ў MF'֫S#||Xr.ũ)VE v9ɸMsRw/ w06ُҚ _]Af˧wHߴB~GVܴ j5֨1/x!/OץL eVe)kݏ;;Ɠ'iV:&FM1kх׋տiq+cЦx1Yu ?ߏ"Bƛ۰EoJ,/M0KؕB֪˅zE$0ak1T-’[\In%6DŊ:|y@, &4[,L"o-$n]D1u86dG̼Yf=Ym8P4gsYȬ o밗w4K|L(˩:=.=wHvœMVb7!Aמ'ޞcJĬeIc&3MG͟KŕL=`EZ9)ͽ儢`4jAHah:!q&ܤm1k-P(37h5^E=)Шх\>oXيc{pim%ڂYN<"Osʉkǩ/bXפ$@6*eVqa֫AzIń"#pCw;_!w4诲 Ǭ +hPЃ6{E^&SzɌ\@ +ρmfig7d!sB@s/翽^Bߢ +GF֯D kG}TRz.5,9d1v 0f?]5Nb4\ñ].]4\ű;B?f\s]'I{z:H4aN}Tx|ўs?sV+>a֪xColO3ژ=q#|aC||ϪՋ0'-zU _&@7#Z9*WVZElzl([k^1k-P<._o]f"MBvHC5?&aQȯ"fJ 2oo? +`nAh sw2nT%˦20lJ;1 4⳯ie5b|hirqkOw8> ݀T KI9p> +:K{ps)f%9\9*C+KwnW(acO=/ߟ4Cnb)JPdǵS/襴P An.nC܄f/̄ .oL6iWH&ݿ`**'y(sCϧQ* ?ڳ +}FpO[gq"=Kw l.l^%pfF%'WPj^ɯԜ3Ep2Yqq 눯a8*Ƈ3ƔLb(|JYY/Xjs=a/>PL*(j!=.8/k-崺ز:s.jf? mAO !DW'UO4ڧeuτY?7Ş ex/$VͭcG?<OF޵:z.w *Fs j8WJr(bu3^*ş?|;j Ǭ۫bųxmj;3Q>{Xk.E᭡>=U~}8&p;?nF=؁Y̬!k8fM;f ^cj,V 4Hc:Ppv¬`z<\V2 + J]7'doێ2;N`DVz9_x'=n +H^u->=QOƬ, HH\*z0}GbrM&*יY 2A'60I=;ai{ؚ#CӠŖ/-S̩EUxE,x_6.+Z9*s;twW9LXcV&8o+*da*l,"pޫSs f/ʢge0IT%fi1u+`2&ͣ8†of=3J 9fLZ[C,,@&YU/1d^,wDķshNr.,$,BNKpYmvȬoiҿ7<5bJkoZ5RU#O<ԟkG:V\~c> ^րRT[׸aƬ5j;+},}//GgmWv]UZ{G^R~%1mxFcn.f+oz_#P<fm7tUfevdttʙQ-y?/OEʟqY2 +RY<گ wIa'6AӪ c5]ppS=2oJy$Ff[!Vf{bǐikE·Oʳ +IB́&KF ]-sfU}3R ŢEc23KXm6fV8ucZʻ[f4-1:ču +HCb9Nb\."vy_,ʚC Zɚ\3d\Nk VN[Yddi*Li4& U0,2_԰ԧjnV}}Ql ~$z+!BW9-orĜ|B9G1x܊[6X[rD)ϖij*lɹ98ȺsHnRg3m8iY]Y?=*umME'H?5@ݠeܝxE7Ds|S/ΓTn_Rs R]'cs{8Cϧ#m1eN7p>:fݡV{ѧ'DڛMwVRS jYpkP{S;1O!uAϬ.%fݘFAkmf]`Vzܑ]99Y&hL0\2ʬiaEɤSavNeas0:Qt_EUL1kXaVReYŴK#)ҹU_68a},"9+5S@h&'[LIMMg"XDiEyn{T:=c1JږIi $큓ψZw0ϩ4ڧeuCfܐޅ=EС;FS3'[ܸ(]نc^aN;=oD[ϴ]|gz;qAOgG ن#Qоkԋ;_N LL?un"Q$?qjbγT vvvi =$E/w ^}Fi<\qXk; +Dxl_&֠g70k֠7ײ}Wnڀa| ǣŴa|j`PYfZb\S86qbnLfIQj0$mBnIb3$q*ye|8 ,Jlv T1xEqW""&D/LDz1Qz;5p_?3gig'yf9yΙ3e> u>bq|&CgcΚf*ѻ};h +Pǁ Dg !.dγ\~m Zg_엝ؼyCg' +YìFf*~-^Yiu)"6CFk uJ<<Yr8.IY3c3)(y.׍du Zc#Y'HUqVM{'I1g?@MTZ~_g,s)^:>';((վM/ʢ[4G95йz.)[myh{S[8'Iܓ3ޕ7onkc {3]甓o/쿰¾Ҡ(lE;vNYY3dջ14nX޹Z,l*xG#[c!8Fκ'Y1TSonۍ#)9Y7o-ɝ6CQ%]t&Dv8o87 _v7;v.^?{a6D#W0uַY~eN6w3ϯgE-vI"_양$^lIVUh9&ng;~[Ԟx1--hH0wVxK}COy9_UWW+nM*qǪqϣxdDr9T>/wVn謙~<lwįvխYͶLN^Dz~QIfV_m^KcXpWWWWgF{ҳ*`!ųr; E4򻷿AĚd>/;ө>/cuX[iz8S!oO7 49x{)?~[;q-僈FAJAAQ2y(z䯩akoUC@])~zfl̓6It~ґ8?G E/QնU^Sfht-k5wM~  P:oG:g-GB]o;$}E [*hwAc*+9cK\9@h5b8 #5r'R4i5|?b9KKKb_pPV7^+;\l͌\AW> xPшV{UQDZ%~PWnBu QT:oGu69Wr&y& +ΪG@6]Cy:60MOFR}Hsx֍FDWN8^gjʯRҭ L!0 +G2tYT97COSox2΍JyMwcm]oZ=xEksUՊw^AVf}6æ`/9. ͡R5b! 713/v+;r-xxYY71Y=Nrt&&Q={ 0{5V|2ێNSL[kğz5b=6Z|ޝD7C 8Y)s|<ۊcZc=s7b8H9'լaѱ[¯h*Xǒxmz <~x=0&˙.<41ωPYI!X9bl#UӒ3÷:m!Yˑhw6{fkRxŦs&* X[G ]t<[f{[s!?SJa]eVZ,h^cb*^w}ppjrīý/߷cónp- !y|/rj}0zO8Zޛ@]b:kN$lMNzs4Vr,VBK%?[i;~˦#ʋ%Oـ[9l:6ȧjxf %uN0>6مC9wfv :_^* kO_u{4H-ԨUf.1oG},:`dWl+;V|QcnʿR7e':2xj߰s +}7>lof=GFe}hk7n}Y0)sEA)NSV_ %` WWҽ@E#YnCU'zl0g9<M9#G2;'=kNO+}˓NC7Y/ӟwjqCU +z,謗?sK8ǬeJe_Į`VGkXF x@N_6,ub[B}B'MUR .Ƌh܃nL,0Ma:WS'YFCQ44 >ۊaI'&"i|Rsb,L(Xe7o`/>7s~YrxR˘5ԖUж >1fuoe[T{)K >'C|{Y/ͬeR#0>9j;|v->,Yfu:ռ Yg9u 1_Z~6fX}ʋ-Sj ۅDV=ǫsgk{s k)o 툝3k8D.F%i[Sfh+7y8X5J_6֮jzܑɿ%Y% 1ӋԈʁ/{gS^?1M`oCUn +RQ$܊Y(gZww\Ic{ҹӟ0Ta]㘌Kc2[3G阎Y-s`뭸f3#7a]g;?c{,{֠Ro1'&nx.VS.ca}Fi] +))bes_xe'Gd}އϬ1t4ģeHҟw=ͬf8F)voo@RԷ)SwKJm slq ңχgrQ_|BxMQDg-sx8ߏYsZnac_3~26}}#-H%YmFj\e.Ƭe^7ﴡoHeY) ?lHeC@Gd g\FӼqOVj:T[: +鰙4ij #VDz[st䎭$LGt{\]|MyxI<c&Cր/ŀb}Oތρ~E1CZ3qʘ f$3m/j~d!uնuC#cЅQ`R#cB@qaׂ~*H׽0%u>_hXʺ*?6ͬ.]C LUu`|,҄%bK_ߪgj>V2gȌy/1<<7{D=y3>$O f9ӶFl?tr=<]wcx-`M'Z=V%k7qpԧ_qq̣~zMa2@jpmճg[cĒgxxGK4%/m%U~<'ޥj9EL.# s=+gغb2.u,㿗kV*G8 o\ìL{5n |A{gֺ.qFǔrxu)}$f7tGŃ~V!w'P'> QߵR5'po Oɭacb"3R4Z]yTxq3SbZa6?2UD6f abŮW\DS{bVEe 5v5-t"n02'4w=5Jw3k©vxVݏUpn|g̐# ,Ɉ =Ug+Ek*J4pc:rjuHaw(GJa'nsJ򮡝'E9esRg&C 2Q,{`59unQ`[a'B6H&];=o+lI 䂭?m@D0杵}!HcN,j#TeHR!?ov!ݢ筅0oڎq7m֏[PW5nŬ==Y)9cֈ| r.>O<篠{2UY$|te˗&_-,c<ʕ^dnuxøg5naYqI~Ǭ,)zQ0ӧdbģv?gœYhby_I*CJ|*Qs ci!D8$n$_cV +Tf5ů$ԹVg|y8KVmdv&9W +&x 'a[8I>+qb]άt]@7 >+rN3[66!J~w!QMSۼ>FFPHp#.ꚡZfyAH,OMƬKHUcs=٧He2Ȕ_K̬ +A@Y;?SOnR[+B>ά팥] CPD(qVxtEwY|yoC"3UׯueVk2KMj-DI՛6*F?>p_uu,* +&FS(;d{']65ci(NpG(" Ψ +\T/[V]̚=n.9ٛ`Z3Y'z-"Xخqp1IY+_g}23|K8&ylVMKaۯ1quBm̪ įe|]9i8YOyFs4WmecV)o u[/iq]̦PVx}\#am=Z5"Z8/,]ޱgł̚$}41œѹ !ٸ78E.!q R:mjyaܑS5?F3&c@!+szߛJM#S6_joEw:cpCypk g;fɕ31>tK`=GؘL16_ +9~ZB^aqυĥ.LCo>E'C"Xu̬@F3ŤjX~P:5tUgz846p6*ts)Fok3 + ~yu-׈3Y7p'cZ>vsu[1XFa&:XxyZMsv!.p#sY\|NT^Q?a>]rU彘}n3keF189,Ƭ ʬ >*IbH?j?ied& 0f-@WĊ3oVz fĦK4roovf}a:5t.~C"  +oo (zeFeV^t:w8|(MӳtyU!gfUַy-O|/aCyĘkSM)&~?XAi{՚PWg;Cl!BΓqF!2}0i*G-b)Ʀ +i6VEv +B"ĪѲAffl(uxU4YҺ?ru-4Op#<V{'y$GPy3v lΉ* Uxn=vxMF;uTd>:/ǿ?4ގv5#Ƈˬ*lәIgNVw0d:1wJİ%֜*ZGM㫘ۜêit:k潊=vRrDKΘ.|-Zس1X$o!t}L>fw_pæCqu?cj]|Q=;)\ܿ;ȉ|DOEadn"3c2 y/~$("s\C+l]OYZ( + K7v3H@#۾;* (EDыA8fbF! D{xWpsNuwUuuhjH U>D^_6~f-7g 6}- +0='x)ߊYc,3>\YZ΁>FX Mn?z4۪9 ^{؈3Wx>tΊY:f5d(ޒ跫1B M^)j9gQΘ`(' O̾^ˣ\p-NZ拭k\\cU6-ExJc0b[RXCpƶwZ-ȟlݹg t t:f]4 ZmsИ$Θ ^1m J%1r̹g=ZVJ*l;9R +Xϟ/"U?b ?̹ Yv!Ȅ̓>Dw멑=,^6h1;+ b +|2/(v_yb|h[흘`YLcc`%AЫ㵋{:Jk`Cm| ߅Wc?<عp-+[ ~c &V$1T >ΣsgѐΕOO|Bk8Ftk:ϿFȸk}ft-ObmED%Ʈɛ+řXIǬww=7a=j3|yů}7&8e5}6w$[W<#/֊b0mgOf崾& ć]-5LsXʺ6K.왒Y%g"CCu{-cH]?ʽL81oC*"7ӌI̾g-nb.K~8S֢~ά5fGּ4EϟY{[IԬ=zgo:fe<_yJ6,%SĬ3YG=DOݏHbtZcV:;sqo?u\RzN7#Z|FZt=-ʱ݈Rb}|̓41ȅ=Y58Cӹ̘V>_ř?6xS|X# & Mzsݼ><)5e| Ǵ]XEy^&fݧi7͚R`Wg _r_Ř~[Lo@{ +c[>ƣ[ 6Ek1&[~kP:X}pՀ4 vpfg:=;zO͟/L8ϚL|^xn%뵡ȑ['v,8%~g:X)ƬA+٥̉Ks] χ4 El.I+O$_? f;KsUǬ+|]ϊV&%No.1~_ߖE7uq˵a[2śAilџN2?`iAY{βqS1h-u؃}BŘu6$ŗmfZe%VR˕* +K +yS\)SPRۥK.N%*S[i{q%bzR(W.Yr1^D*+Ne1f)!QbmMc,qy50ƾtsH,ql)c$-?oYr:Q|1{r-Qv@^2X-jf ݟwL%9c:=o9Y%= )|R))W~3<8S.bq"z.z}(YM9ˉ.Z]%>pʴU}$6g)|Dw(KXQT?T:LiuKwKZ%]x0bH#C7=D6ىuL)/Ėh1k_qPv˵} ̚UVzɛ7an;݆sd~Z&\N$JZ9+AAA?:|gκqPAAAve{٫9 EiAJAAAPmס g%   PFAAqTu(j#Y U:ba<ݽ q +9yqm*Gh]j6Z;z^Q2>t; RPFQSjg}E!kpTӎjU !)OflXL43ïXY嘄FJ6Smס g%V9n]\Z\"WO@@0|zU~`qsϝ3w>~ʸ--W[ݾΆ "/\=oD@ZQ{"Gmׯqg?#8_YR֨QrV jYxݞCVu"׊3 Zs֖jG7a~;? lk )@0t9xv+s#!0&XmWv%Ki뗻F#UcbIJƓgtVϝٙ(СCsw@}& }LV*yE*Ӝ~afS}<0 eajT琟[TQ̬ +_Wf4iV>I3 of&[MrDno _D y&>':V +{YjLr机.8;Q̯>{}yg5//7u}oe1'~ + %VgM; "8{k>V 8(_iڷ=+}+@=Fh=K-4Y;]Khۏx︦pLOcB[Xb w☍ɸsa<2^b5Fs^Kc5~@(=…{x |83Y!/Q/+2^s/Ýq>?1"\+`)떔[y Ǚ#?%a%֨ě\?[y5=s8bB?eToR0i(P) iFRF-ٴ:*RɊ F3q&f&f]m&7*yڿɄ3={omoˣ;&{s9J>fli"6UƓĥ~Gz_ijsAnuJ,7vQccm՚Y̩{4f ca&ʬ4 %_.c;m3>ƴn3C'oZ5@xvƫM%}3(鋝I!SL)l2K.fU{oz6FN`Nu嘣WwϬ+ѿ ;ΊEb/o@{a7*ݥܭ{fV=ʾy'kL3bcD[jQ|F- #,_kJpFYD-l)ҞYw̬F/(Y}9e2$fUV_+\vxnItWh?|%q!gΒqeL%d. +Em:&(U;*qR Łdi8 s?f!kPɘ5`y:'~T +̺Jڢ#N~bBə('#ߪM!=Als'%G`^y; +NvY-]x@YpPaE {=YߝCˆo\0)gV1b;ZǙl!2ɡY2-)_f}1[j˜La=y0g9{O(c{YSrg.U_j=|5t|l,v'fQ}ue#[GM}a *{qdj4 +ԄҘMsc;y'V`Ƭ$bVȬѠz6`|37qX]]"ż\16 Ge2 gdŇ5m6{ ^F`2L~OU °>fmrz&!³Hj-E/ +arz(U((ds(٣s!b$R@B6$f?˙;dB Nll|EOg1:ηTc٧rZd_)t)w9 ĎA|fc^r!0lA/2떲d?'nXOPv(ug̚3Qz0ۏ z;\~{#ziZ<lcq"G%lJ8/ $LBKL  zMcp4#2 K JyX5[STͮR[yI'kWح=1<ּJnw9}3. +s evte*b728c]Fn#!=oٜ\c2hLjA݉,$Qd5ε&#Ũ/~ދ᯦\Ҽ>v<1|·E2k6bkK©N `JNy ω3zz>#^zX*BA,z g<ԍpց]Trg ^68tk)QF܃|^v\| Qmef%*Tf'n7K,aSfV چp5ZA)g$.~ +! Bk#q*cVgVOa!X$d慴'=,oN6V+GniߴqࡾD+| +WOIp+(cnF!?q*sy͡3y7DfzȎbrazkKclĵdY|Ĕw;&Ɨҝ5͙՟N㧭>t[8o09Ei|WX!U93sNCs 'A_Q$.3k\"ZqS4$SY?Rs 3_XMJDeXc?۩]LT֑A u1;찎,qgqFE&96߰=gc-Ú|Jas̴E.fJ]]0ݰ!ƥP|XLēęŻ}No1O <(%Pg,֔ryVB6e1[!oskgm+2F6fG"|otsҚ•uzCqXmۡ\qIHɉ_I}E5inu?N\_4MeFT푩gSxelv-Ϭѹr䴇 +j5:G\K01FH$跧Jby3Yʤɭəѻ؛~J^f9{XM2.Z4>F= "'>Us"Vdצ`*]]}xQfNr )5CyƔa G׾U9ǵO1.}}hWAYb=5.URe +C15o +X=eb.:ӛ[ӷyelػ1N& +mA653uhdٔmWz&7ICdEh]|c|^~VbY޷j,Zht+D_ ww l.Gr%Y4^aowiPbRȶĺENQu(x+I$#Hdgjadx0h44TH\TQ~6ٷ~;-{Gi+Ƭ +f&)a<$.^<攘if}X4sgLj'"ܮYéZgCO;U? &4}OEK̇Pm-j8(0֊r73D̚q Ż,>xk.a|xl|Lد3a |0ӆ3i7PYeدxU6F#fqGG뱂(8;8=iN0kdirjQef~fvR>݅dtm0Y[ӏh6RR ƎY]~WO1 +eV郻LA%EBє:|e͏oLq)zY[3 VCodVe-~^6>;/991+Cm_^B^m}l%fAnmӜ6Grm,~%}iPOxm-1߳t.-eĬ<dv16N9ޛ߲fx=F5̺MwsGEQ'1E2'Ź **\Z` +foi\Xx4v +O[zyL`|7VgZĽ,Z/">s]5oU׸nZq]E>p=!0ũ4=cN~& z~!w)X{XT33樤oy="~e?OTXk{ٹREL?sSMw$jGUo}]L?sgBߵ0 ::oZ`QUWey|kBʤsxF,%=<{_=/TvӜP19f3a_Ll쳕@+vjܓ%b_L۳^jfkdԭ cQ|^_5owo:be1_>0^r)mӓ/rn$Gw 9 Wwnb ?C2ڎ tԻ`IJ'N6F7|W9 [rCP~̪]e|ʵ1,1](y3;^fߑYsf]jNKEԸLn|ZW΢͑ Cz+άBdi^>o|do1c̕[0+`"aٺI(1]QQY۹bsm#iͥ0k{wd1^:>;'' COچrM\Z1#J*01Ry(0b.wYn241"^,]0?]A1د/Y\~~ǥ*X\3d˜Iw.e;jY ;I m>nY6^Q1B\ [w%wUg럷5b.51׭TebkwiӨy-jpzf*lKKƄFedu="OiNvУHqʥڷ*zYUkMD_vD TM&;܈H8 +{lJOLv1.~mK()WۜC_J{SՋM&uEb;LrTTFzR(AuT1AuKYEs^ܴPrU*u*+ AzJlО٪h"5fx=ƟYlKŃ$nESnxFlrY͊֘nd=F/9eLYf5[sCYx[HjV3uj-;p \?孝kkV~먙~qݍqJμv?;gj&?/eFvWac&uLq] :k\qiV^JIXUMc fUL|){J۪x{geGzfsf̃A֮CiAڡOJZy\%AjvJ{ h ]lgrO_W! zA񃠵P#AAA]!g%  h:9+AAA@kסGY  hZ=BJAhA ]Kt:KGK+AjvJ{ 2]fnvd`qccޓڬƗu/a56ߗ%ŵB;)5:% A7s󸟿V^Nmp]ۆ߮q݂]Wevhy -u(rV -R9]Do΢r|nD^hhݾ>ڍpFZp,󖷷!tOji u(LZ4DŽ b?)h:X<%˞3췞rvֈ z9HvDfc/xF ,گE;ky@/+<5[;]q6`:_!4=凯zwB%&/s 1o{ZFdo#$h\}mw3wnӕ@:Z䬕wgΪͅ˲LF?[zpu5qbȣ)ID.o~ݙo)QxF\pߢK:.yitYɊ5Ayvo)X{g0L,"'r̩tm涱|jV3ۈ޶-h6s)D"s X|Y#*WJgUq8= ,9#f>a^9m̰ob6{=x.y} ww8:W= NA`zsz:}!뜥FkE3Ͽo+K9l} NӶڎEN|㮸fMFV|L=S#uD53z^<'沓Ø +Ь="NF +acŖx)=KMW(:Qq>.wV]誓x^IfeH7tYv}VtTqve?u霳Ľ%܅#飒e_*~s0=/']/ -xK#V/_U;1=h,wV;`s1%o*CTqM0J~%Xɿ=8'/VSvv*c@__ƳW{Irgo}M;_BV +ZY/XCWxgջegjV)ZvCՄ$g-&f(Pٯ6+cg;b/0 N' am>jvԮfQ²j(}"< +E*Z$k*YR}Iܙ=flɖꑮl{ι{U^' +B Z`=o\uh >[J?V6lmOctYk]0OeNij /B-+g~A -"Sxkzd?L^4~4Cﶟ1}r[ ~uᘘkYGUڛQs1s(Z߈`~:i:C1@XS-П`s[z ϶|?b,Y_OY6#>j sO75.OH~xn}n&\!ݭzD`xwi|R67!vG\.vjq+ +#-uG<ЃP< bfS^p,w3~|5+0=7?VnpON8ka. p8p헵e-jEd3%Jg[ +UV^xc=YNK=cX~=Zm?~Y?~̳*$< / AMbd[r>m zl +R ADLNzPx1K^}4u^Ma 11'(f/z)ԏ KގjGܢ~5Qm Ac +ÎhJ91#Rq"G98p5l]}p >x^\qy9,-w,FSmb7j' +K38k5[.,}($*OYIP/XktkXoh^s`f7e7𽷮2WOXm8_=Bth 9]4.K̊pxcUh c?iLb=mIW$ᆍiVs6~[1+eʕ͙[1$W }DD:[ w9*\ة~ۆϫ$zN"mV8ҢX L}4Kyիd^K*Ã52W'60zն%5VgFlG9K0F3 +ӏ˝pzA|e$+D(̎lN:uDpn\ ^>OgY[ h7yN=gta$JBzMO$)#HS"|i$g&v5}`ѬDTaYјhg7RRثCpV#eZǎz.p޸YFFJ֤NJVa}{( +TbIdN,3ך=Cvu8  xmkPmFqPg[YO>N`Cņ֞TvGVI'(]~^j]c6։~`@U%žfͳwU5C?4Ui&4sY ]]᳥In[g0^@ʬ[/k)UEʳ-V_f՜;0+1}ѻ<]4l5ͽ~̪he#iC J V)>pP].u1~x2LOdVr.JAʠcil-5kEz)Vf謍/Ӻ͘9d&unÀىDi }AzP+}q$6b(E«-Gr5R`s_ӿ tyShVϝ`q$0[,g5_dDQtf5j36YoȔ0ynK ArHն\+mi5^)oUe({t~3 ËO:}99[ 0M˳~<okiK +cP +3l$=l?8,01 ʳ +('DA|=7블S?uaxHۊV/K0Ʒ/+}Ȼfm܉HjJ 'Y)K~:ڇE kj!1C̞N֎_#buڏ!ϩû`V}ϗ[0k$5RS(o 0iM23k3=#K87fku'y%_ճ=#+n11k{XI3DCܯH'{gsO(&9A$6fE¤؞^^/6^p~r~4n=bek߆ =_B~sɤkE^ݝ>F~:{,] 23+{ :iY_^g#IFp>ςշ-D"nkYv&fu"j [–6A\n@r/"ZeϏ`W9B!ш,ƊOkb>~Bflߜ\Cŕ^7CG^yG(͂-ҷϓ +كÓli#w7??=G81VϬ6:~l_YW(VZɉjZ =E5kK+5mM}~߳U8N y1F\^"!~$A̩R=Yد}=Zk倄_Mk-bm/؆Yxx,0y?Rk $x">\җ]0u4yqΤ)~wO9oWspfyutV/VT7rڬO½2.q//'};"vHዸ_&u3Dv!? gV>ߒ'Z7]i%>}t+z77ӂͰ39Fh.wv-Eîd:oކvmnT>ݍ!ԆB dCJNqzնib<+raqݓ3U۴^a*Ȭ>Ɍ\&^UY_qNqOƙ ?ҿB# NdVƦΚD3k;]T'&NcDcQ,ì8!fx"FN!%xC>8½9/ bb4c2xVˏbv.)ڝGc;n֎p#<5şםQNmmzL2k/;k%q` ܳЮxw#(ڭ848( +f52YqvV~TyY[jǮv ]fNӁ{ncxAtB]g~"L? -n/,;X[\}9,;y5PdYté8(4yumM5sXumڱo=^2^L>ftZZwF9]5cùo{gΊX6/Eبek\!2%2'gcE&5#Jřeϲ^_ogQ>>]a, +fռnE;pZ2^mZjr{d+avsz~49w+kXCƢVR\[5'suwbUj֙cLvg'8+9uG6L3x9:CJ:Ւ+-W0ƹXcZ#]T]xǏ7ה|)H2/cԧHN]Cx?'XnH$D"ͨR|4·Z<%=8]+Tm{pq2]%3bVC {iO/l#H$D*5G*NK˫Y^w-Nm"Tj܀Si6%#1+D"H$D پ5x7U]^D|\;wҒD"H$D"ͅJbdpzNo檒D"H$D"ͅJad-atk vU?J#f%H$D"HsR, + vPdD"H$D"ͅJ:J{9ގcvġxsv{216/^1w,8-+< /GFajgx$'1ٟヌ-|yq#}]UL~)9z^\:ǽÇku~ꥋk߁~rqjw$@f!PXLX L|D EpP$4Z⊆(U\)J+ҵv\YVAAtuuܙqO?wP.56u:Oh +&zڥCc_ŝTيH*w ATf5${owww +BP4|99i#vߺ9yT9 +Ӧ9-'9=ݖ:FsÝWW,y?^ǚ|jasv3+dqy{ܸqmuۇp_4Qc\6W"ŇQ'JPhB&!#?xqaoιt֧ϟར\"or1W']!w$Zk+{K5^Hti\#|^*gzrˊ@l)uV +2%h8/,V{ +}wx_8BP(Kab~d!NwhaCshiIu?,ݹuBx2ơ@AB*Hwޜ|b(o6_Y +?5"uxs^u&;̓pVf5rtX5 ]AԳ9kk;t=^c-rk伣)e9I^gC>LLhia=bHyw_zlĆ$dٟ0]7;s=-D|zckg}}3<{8;Ұ<Κ G]V$JgFNg X4p(By:rK(q+qcGyBfsc{9E,C=q:"i"JQ{P̟E;թA+¼} +p]Ra+2v}}'Pj*2UXw| (~uΩmuaQ3D,vqF=1̳Dl&UfOj7BYuV%Ew:+%:^ 8t̳z؞J[k-ܜw4` g] +c#ygpTۜc݈ +4u0XZs +㱿:μaG9QKD AIhKb +*aWYteVu;J35;\ڟce?t;t[NNr"3$y=y?=R,#ykȪ(AqUC==tr-i#8֛Խd+,kɬ,rr冈5L04Lw:9iMgǍC8ͥʋMʘc2&dWpOS@_~$g?3~oZqe f]Y:3hIǬ|<ɃFl]ig4$\ ^L[8WbiZl ӹYvᄀc~Ƅ{j=~MsXW1Lė_AIS>bvyĎ +"6gJv.IɶMHz>gGjf=/Ļk ydBS"=O<0JӊtDV2U!{V.y Dزx~y^$]5*=׽8cFx"64iHuu97bN 3֔!o-7c'߉#%fF0,?yy j 1ZD3.}"QgNb2tIkF6JYl)N +68}V$ue%| 3k=aQ&DZ#*5~{<vs&OWvYo vX6 9,H"@T0 ?7res>G8%ʍy2b{.`Io*bj!5n'&y/.sׂMjŹF%-wցor:9jc:bL9;]AcsNyA\\_ĬܙEi]#:bs:Z9n)@cTfʸQ\?#˹zf+7_;5g ĬT{hAk(3I"43ٰ.[6*[2sДӕm CD-ZК@$6gxS'yfזٚ2;8ƛA Q{Om?p:ԝ)x̪1m,E.~.%]jmB4-1eYWWoucړ;,Y70{^ 7liEUd?URlL'ϓUm ?kC2!'26bN5foftX3m9dL >#{y8_Fa^Y! Ɇ8LXu$DQۖ?а3:f1IXfDmn>9dg)!Id.{o\4wgF :EɾB\clUw$! /NܦJfe9VTIt+6_ ޳t4dlvB=ϤGwK|QBO»ǔeJ]8\x߷ԗt;_ǰ|{i)ET<昔[GX2Kt<.kJkdα(u $.G9jYp@їcVLzvͱ,j~_cm`PGqZQ]+wWA#P~/4UoXN93Edu5ƇϡDEYQdVV}A9:rW|Wl?}Y8|p.SV>S \TƬϖ}d{ZŬ4ww uFP%0Cgjt&0M% ])g؂N t-yj09CRX6Jg=D87Ci34^KޕC&ޗشwp$ћ03`pv]TW#h$Ȑ˅575B j3pEGO{r#+8LƬY|\` Zb|Pj("MUˆ2R -m#w,y*p}z8pVr]jϠ.SOdtu>fS|-Dp9gqK2Ccm ~}DgWlN!u0YTo;k N]sc׿?=aO(NlZ_NνA5g2nxܤ/pv3/^͵ e:&e(WϬ^-W¬*rLOQ'oj~cXR;'*{, 좋 +좋<ɢV\,GMNE)jk\4ƴ\Iښ\\=Ӌ^Bv3>wM'i>3y܋Zwnć~Zb&)f:>MGh'}PS[ ߔa8L凶\i,&e|7ȑ\nF=y+nM(dL[E9cKUM/gRqpO0Qц}Rv]~pj3GK)R~~losL_㷿5x^~7<-<N'{|Ϩ;ܚ2ag?%ޣ7-Ɍ )2 +z܏ٟ~W/‹_8N4{xp捻+]B|g[!޺mjyFwqu_ U*O,7?EoqmNxr6zxDFu"?UɫaobOzH]Zgwlur@kq^D >Fj4ĮxӊuPdI$)2swˈ t]Kj]Ik2aΥl2vʼn 2 +1y <_=c +I;Q:OJ8:DS!QѮ0+Ϟϩ\*1+<᫥^[|$[NT#}Jgow؉%)5?rGʳS.X¬[3l~,| $2GX'GuJ0-BU@NA OGޕʄS3ku*sYEwlR>>K$۔3mos]亖|E[aUdѷ"Lwh_ʚPlCÃfV{Vy n{G t}ΌCɝ5@ij)0}V!C rZrl!X1c7}ksUǦ(sxHìzym30^lg\ C.n,9l 3asfmԶ<\|'pc?ux3f10B4T EGޫY:y[6Y04"A|`mS +nߧ08цӤBhvoTu0^ GYڣ2k* +jl2@W"82e֪F,{GA|Ɯc̐#^t`D##@ysvt0NG[d)jZO!˱:rWIwCfEќP"rtQ>12+̪q%-yKl/ff1Y0ڈݓ:fewZ63"|q΀.laVlM~H̩yy{qXza`Vmc{0YgOHH~xiYG0\%= +fp0.ؑk1mTd/GsqrqX59RMiK  *k _?/MʬPG0Ҁ&4G*j&Ȭ5g{D/mfAhKv.drbA]QvtYŖYpu&1?@Bc[1ay :-*}d8p/۽i5?3eg5\VGݬڳJ1d¬vKq<v#*}6Zt!niOp8ۃL~lFGG7ǬZȠs~4 ;V]|H[-Z +u+( Vκ"%{t{G&.xr.dI697l,~fyS:Nu\|~}`dAR ÓXΘk{7$|;u[Y-Ao 뮰tRqt5WegMoZg t;hY誂'k YMlfsٜЬ? fz +I;8W%dpk_kZH +pj 40`fo)wN^gp$i5:%xЩ \ښHO3Vl.ulREWhQ$c=W鬙7M?EY +d׻Ղ-~<+;:kNpVE?ΰvmYV/& +.|`S;]:Y)Prl0]a mE_=%~`zg +;ݣdg԰rXu)߾pfgImYd \@g]-$`n|fuBYMnxwkt'-:S/bf6& +n(TOߞeoa X +S4vì/>ABY'm$$S.ykgǼG.cp7"ֹHY_^,NHpg!"\8]Ίi+p&C5Ui9/N6@ m{Kl j?~? ^T5 כ>d0&-eι4D{=p&vN':kcIoZgUC_DgE}h-d-бdo)89bM¾sK=l|lJחg~XiŽ~>ޫJakŽ>UǾ=&\١X`$f8Y szmE_XoŤ0YRAV}1-浽hr4j<3̿t)/Љy\Zƃ{7 +\~=8gs}/:>3kC'}t3R?Z6Xv7 R&C-;ȇq!uK/r0'ԱAdKU'{0{\ۺWzشȬ/3;0{!8O"\<0ZG ۝_%/,޵1g8ov^1+pONY[PfmfKQuVg>y%7=SNĞYiCG;iyy~U}艷Yqi y-9wϑxPYU^h.ۺoiI'HkhwVbNZlW]kxxW] eºgqLL2M +gqkaa1"{XwD49e»bBKYyO;{;O^r/6p .':띢#IΚ*bUH/\$]iT7:aqbޢ$sʎCqSs^pKt䱨G&SY?Ŀ +g}6*_/ Sea 0/΍Hbn"WIJh?˿v&f7Ěa٭n(/Op !9kV5s.죯ɣ.ǒJ͂k9/ S<-dH<fpLJR4cs p:,`嫮py;X2ьƖa_)bk`-W\}sxs^f{WVv, r`3@ML֋G:H E q 5"e'`m!`p!8\ +N°i_<y*ψ|zߍ[Tx i;e?9t__wB ]"^s=N8\lXwV x8wCO}>k'!On `pv1ac!ϜCd[FJ]"誳Io   \`P g%  ":#Y  FrV   rѮC;   \`P g%  ":#Y  FrVX~XGC, ͵3 ;aWzc GǜAA':#Y s +7֢QCNzfsMzsQǞAA8FrVL(qêBq? [>t;:_czH0jfC㵑W8 CcLXGD Ix4H p r s偫Ȑ["- iD@0KꕎOzt۩GnGQ 坞 YάVI/\_Z2|~cJ)ٵ͎l@MԔ/AZ.7ˋd*FР_RVRk==וY2H!rKTѥSdD/Ԕ8l'[IcUK=,`)eݻ\X^xS?OySZr;gDJIӸ?Orv%_\+id&nԬ*0kxGpO6G8i缽c]#u]û;!ڇs^MF^"zhC>(nx!^k/%oͮ{Y.l̬ u;ڊCT|>swu|U3:ZCw;ьɇggŹ\\\\\FXˈIϙյAgȣxE{8b[EƩ*eu3ʪ/H^&}[>>a|jy|%#nf ^VuϪ%z]^BDt7>#_,x5ZqU&\^`U9fuhAG~-Y`Gu{shsתS0#xu3q| &@alKYP3[1DC~3At0kaq\ "*>djb#cac87Uy+[3+90eȜ>gfRiV3[-&,7VTIfTxKIs_̚ڠ$6'KĜ{Uqx\82@xMS"M#m1S:2?J4ʓY;Cn-9hQAYu>杝iWqbmnR-{ޜp!$s& +Ns▱D94tf%jq2\*ӁTs CY/uo ?jf߯ج=>Sq,Kdԏv [x,'`hF5=s);K063z>ꇛK =qmeI>vuɷ)|8짾W\\\\\\\jĬ"Y-5r)L/(^Fզ pF̮z[u,/=nA&kjCob V:?^Cn.az~S-ڛh@ֈ˪.EV&Nb#R>V?*t$w|xKv %k{.RfN{ l2OZIx}q\^VrfR]\#8R>o֬#M/5w;̺PŬu^~ImRџߧ4l埱[oț}t]Lܛ/VYU^;E%+kJ cdЅ.Wh?S^+Io(J57O= đU+_?vm`8ӖSV?Ei]]Y5&ok #Pf3fU PڠŅ纭Uc5׍Ĉ@ !a'4c \z;RB@.?謁"6˹ zrrvK~-£~}X=78)MKݿ ZcmmƮmƣIi6/c^h=ΫC.[0H8ruI5ùm)d nvmi7Z6Kȓt _9/!B;/ ?d̉ *(&cWa>~01Y}]UYl{/x5՚5!̍B}sڈ!R.'跔bĔIcI [˛85HAcd}*ogRo:Zn7`m]y~sW\qW\ħ{X{3 $sA` rBwhnDe/@3Ug.5H hNTof;w:01AK#喝,z:CNn@XibVKPo8Zj"Ib>^: ЧTXZž^zq=̤A?҅ϺDHa.ٜ *^ +H!XQlDT8|0/zi,TDQCӗ(fa%͡sxQ?mw6>)f,N}M<˻oh߾|7X3YAiؽaYTώ'C ޜ}ZG7JrU5!I5fe'1<,A/8%O' @cUcL3>Z̘K/%X՘)b6A]jϭ*Mf /Gx xaۯRPy'%CiJ-m%C*z3+qUކ5[J- +Y[|>leVW\qW\?!M6яW8$S(p,5\WˆڭHt`ys`&a-rB4rDDΩl+wmeVZш|j";CF[ڳ<=yjȏ'RSq/C=z+-P! )eg  BJ!s5?p[_c]FyG!3.PO"/gֻeZY1`s_; b2jKy3)ހ_::'yBJy>KdgZoeV'?W/C9}bdVNF{ľ*C?: g5Jlt+ܛɴ=_@k1>q&}o3'?GLs! ꬚졬q&] ̊B4>`.?(dd6ġ] -p'EdOB5Y@{JkIYBVyM ̬<cC5-*Y Ffg-q +zM6LMM6Slh̚S&bDj1n ޽YY˃}ƬqQe H;_sW\qWw喉Jb ~Qf&7ˬ<Μq `e˜Y)wV\EHvl5L,hoC]Y4,XygG[>Kfe}_9)ԊV:]>9ګ6BYg#:]߲?@WYқYag= >u?>SQ<XXS~P$3lf@L*;2+cQFsO{S! @ed_$kau[XS-{&=uI"b#'f#3$^"eu̒^̓Qkᄱ᫰jCdöƆQigVSY^nuDP&fb*X,"jntSEp+n.[{Sx4X}p&s9NJ@_g֖Yx1~=="v,bswo YQDmϋ*d#?]ߝn{cbge}7Z3m^*hT Aܔ{o/ǍQ?w(t>&;V:~U[z>nҸ⼬a9Cg4rre3n1*{WV׾,gq&,_Yoǹ])YW*zۉkњU}k⿼G*riLJݟ0l[5c{d1u֖SH_q #>1qb%.\8v;^}|YO;h]SoJ,էttn{\…v1sA/oGs)13\,jEaٿ|>j9ƭƴJox^#d,O;~>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(52)Tj +0 Tc 0 Tw -18.632 57.06 Td +(T)Tj +0.53 0 Td +(h)Tj +0.575 0 Td +(e )Tj +1.287 0 Td +(f)Tj +0.297 0 Td +(r)Tj +0.352 0 Td +(e)Tj +0.519 0 Td +(e )Tj +1.287 0 Td +(M)Tj +0.908 0 Td +(a)Tj +0.489 0 Td +(v)Tj +0.507 0 Td +(e)Tj +0.519 0 Td +(n )Tj +1.343 0 Td +(p)Tj +0.575 0 Td +(l)Tj +0.297 0 Td +(u)Tj +0.575 0 Td +(g)Tj +0.519 0 Td +(-)Tj +0.352 0 Td +(i)Tj +0.297 0 Td +(n )Tj +1.343 0 Td +(S)Tj +0.519 0 Td +(o)Tj +0.575 0 Td +(n)Tj +0.575 0 Td +(a)Tj +0.519 0 Td +(r )Tj +1.12 0 Td +(\()Tj +0.297 0 Td +(h)Tj +0.575 0 Td +(t)Tj +0.297 0 Td +(t)Tj +0.297 0 Td +(p)Tj +0.575 0 Td +(:)Tj +0.297 0 Td +(/)Tj +0.297 0 Td +(/)Tj +0.297 0 Td +(w)Tj +0.797 0 Td +(w)Tj +0.797 0 Td +(w)Tj +0.723 0 Td +(.)Tj +0.297 0 Td +(s)Tj +0.408 0 Td +(o)Tj +0.575 0 Td +(n)Tj +0.575 0 Td +(a)Tj +0.519 0 Td +(r)Tj +0.352 0 Td +(s)Tj +0.408 0 Td +(o)Tj +0.575 0 Td +(u)Tj +0.575 0 Td +(r)Tj +0.34 0 Td +(c)Tj +0.519 0 Td +(e)Tj +0.519 0 Td +(.)Tj +0.297 0 Td +(c)Tj +0.519 0 Td +(o)Tj +0.575 0 Td +(m)Tj +0.852 0 Td +(\) )Tj +1.065 0 Td +(c)Tj +0.519 0 Td +(o)Tj +0.575 0 Td +(m)Tj +0.852 0 Td +(e)Tj +0.519 0 Td +(s )Tj +1.176 0 Td +(w)Tj +0.797 0 Td +(i)Tj +0.297 0 Td +(t)Tj +0.297 0 Td +(h )Tj +1.343 0 Td +(a )Tj +1.287 0 Td +(u)Tj +0.575 0 Td +(s)Tj +0.408 0 Td +(e)Tj +0.519 0 Td +(f)Tj +0.297 0 Td +(u)Tj +0.575 0 Td +(l )Tj +-41.922 -1.44 Td +(visualization )Tj +5.799 0 Td +(of )Tj +1.186 0 Td +(c)Tj +0.476 0 Td +(yclomatic )Tj +4.575 0 Td +(complexity )Tj +5.131 0 Td +(combined )Tj +4.687 0 Td +(with )Tj +2.242 0 Td +(code )Tj +2.464 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.852 0 Td +(\(see )Tj +2.019 0 Td +(F)Tj +0.482 0 Td +(igure )Tj +2.519 0 Td +(2\). )Tj +1.464 0 Td +(Complexity )Tj +-37.254 -1.44 Td +(increases )Tj +4.24 0 Td +(the )Tj +1.629 0 Td +(font )Tj +1.963 0 Td +(size )Tj +1.962 0 Td +(and )Tj +1.907 0 Td +(code )Tj +2.407 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +/C2_0 1 Tf +1.795 0 Td +<00410046005E>Tj +/TT0 1 Tf +(uences )Tj +4.686 0 Td +(the )Tj +1.629 0 Td +(font )Tj +1.963 0 Td +(color)Tj +2.149 0 Td +(. )Tj +0.573 0 Td +(Complex, )Tj +4.463 0 Td +(untested )Tj +3.908 0 Td +(classes )Tj +3.24 0 Td +(are)Tj +-40.867 -1.44 Td +(sho)Tj +1.489 0 Td +(wn with big, red letters. )Tj +0.311 -2.24 Td +(Some )Tj +2.861 0 Td +(of )Tj +1.306 0 Td +(the )Tj +1.806 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.971 0 Td +(classes )Tj +3.417 0 Td +(displa)Tj +2.527 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.528 0 Td +(in )Tj +1.306 0 Td +(F)Tj +0.482 0 Td +(igure )Tj +2.639 0 Td +(2 )Tj +1.028 0 Td +(appear )Tj +3.417 0 Td +(in )Tj +1.306 0 Td +(red, )Tj +2.138 0 Td +(and )Tj +2.084 0 Td +(they )Tj +2.306 0 Td +(were )Tj +2.583 0 Td +(tested. )Tj +3.251 0 Td +(F)Tj +0.455 0 Td +(or )Tj +-41.311 -1.44 Td +(example, )Tj +/TT1 1 Tf +4.251 0 Td +(Configuration)Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +8.385 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +(, )Tj +8.985 0 Td +(and )Tj +/TT1 1 Tf +1.918 0 Td +(DelegatingLogger)Tj +/TT0 1 Tf +( )Tj +9.907 0 Td +(were )Tj +2.417 0 Td +(tested )Tj +2.807 0 Td +(with )Tj +2.196 0 Td +(the )Tj +-40.866 -1.44 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.466 0 Td +(F)Tj +0.445 0 Td +(ailsafe )Tj +3.133 0 Td +(plug-in )Tj +3.467 0 Td +(\()Tj +(http://ma)Tj +4.083 0 Td +(v)Tj +0.488 0 Td +(en.apac)Tj +3.372 0 Td +(he.org/plugins/ma)Tj +7.695 0 Td +(v)Tj +0.488 0 Td +(en-failsafe-plugin/)Tj +(\)outside )Tj +11.526 0 Td +(the )Tj +1.744 0 Td +(Sonar )Tj +-39.755 -1.44 Td +(instrumentation. )Tj +7.363 0 Td +(Sonar )Tj +2.805 0 Td +(can )Tj +1.916 0 Td +(also )Tj +2.083 0 Td +(be )Tj +1.416 0 Td +(extended )Tj +4.306 0 Td +(to )Tj +1.194 0 Td +(measure )Tj +3.971 0 Td +(code )Tj +2.472 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.86 0 Td +(for )Tj +1.527 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.528 0 Td +(tests. )Tj +2.38 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +-41.088 -1.44 Td +(will ha)Tj +2.916 0 Td +(v)Tj +0.488 0 Td +(e to install an additional agent in this case )Tj +-3.404 -1.44 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.sonarsour)Tj +4.434 0 Td +(ce.org/measure-code-co)Tj +10.378 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age-b)Tj +2.371 0 Td +(y-integr)Tj +3.266 0 Td +(ation-tests-with-sonar/)Tj +(\).)Tj +ET +q +484 436.8 -409 -115 re +W n +q +409.905304 0 0 115.8712158 74.5643921 321.3642883 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +10 0 0 10 75 302.3999 Tm +(F)Tj +0.482 0 Td +(igure 2: Sonar -> Clouds -> )Tj +11.92 0 Td +(T)Tj +0.456 0 Td +(op Risks )Tj +3.743 0 Td +(V)Tj +0.63 0 Td +(iew)Tj +-17.231 -2.24 Td +(T)Tj +0.511 0 Td +(his )Tj +1.616 0 Td +(combination )Tj +5.84 0 Td +(of )Tj +1.227 0 Td +(code )Tj +2.505 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.893 0 Td +(and )Tj +2.005 0 Td +(c)Tj +0.476 0 Td +(yclomatic )Tj +4.616 0 Td +(complexity )Tj +5.172 0 Td +(is )Tj +1.06 0 Td +(particularly )Tj +5.283 0 Td +(useful )Tj +2.95 0 Td +(for )Tj +1.56 0 Td +(the )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<0041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(cation )Tj +6.01 0 Td +(of )Tj +1.174 0 Td +(critical )Tj +3.285 0 Td +(classes. )Tj +3.489 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.396 0 Td +(higher )Tj +3.063 0 Td +(the )Tj +1.674 0 Td +(complexity )Tj +5.119 0 Td +(of )Tj +1.174 0 Td +(a )Tj +0.84 0 Td +(method, )Tj +3.897 0 Td +(the )Tj +1.674 0 Td +(harder )Tj +3.118 0 Td +(it )Tj +0.896 0 Td +(is )Tj +1.007 0 Td +(to )Tj +1.174 0 Td +(test. )Tj +2.026 0 Td +(A )Tj +-41.533 -1.44 Td +(single )Tj +3.013 0 Td +(method )Tj +3.791 0 Td +(with )Tj +2.402 0 Td +(man)Tj +1.871 0 Td +(y )Tj +1.012 0 Td +(internal )Tj +3.791 0 Td +(decisions )Tj +4.514 0 Td +(and )Tj +2.124 0 Td +(loops )Tj +2.847 0 Td +(is )Tj +1.179 0 Td +(harder )Tj +3.29 0 Td +(to )Tj +1.346 0 Td +(test )Tj +1.957 0 Td +(than )Tj +2.402 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.29 0 Td +(simpler )Tj +-39.033 -1.44 Td +(methods. )Tj +4.255 0 Td +(It )Tj +0.865 0 Td +(is )Tj +0.976 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.365 0 Td +(more )Tj +2.531 0 Td +(likely )Tj +2.643 0 Td +(that )Tj +1.921 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.421 0 Td +(will )Tj +1.921 0 Td +(not )Tj +1.699 0 Td +(be )Tj +1.365 0 Td +(able )Tj +2.143 0 Td +(to )Tj +1.143 0 Td +(test )Tj +1.754 0 Td +(a )Tj +0.809 0 Td +(complex )Tj +4.032 0 Td +(method )Tj +3.588 0 Td +(just )Tj +1.81 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.809 0 Td +(v)Tj +0.476 0 Td +(arying )Tj +-39.533 -1.44 Td +(the object state and input par)Tj +12.55 0 Td +(ameters. )Tj +-10.75 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.686 0 Td +(testability )Tj +4.743 0 Td +(can )Tj +2.186 0 Td +(be )Tj +1.686 0 Td +(increased )Tj +4.742 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.13 0 Td +(extr)Tj +1.599 0 Td +(acting )Tj +3.242 0 Td +(the )Tj +1.964 0 Td +(bloc)Tj +1.872 0 Td +(ks )Tj +1.519 0 Td +(into )Tj +2.298 0 Td +(additional, )Tj +5.244 0 Td +(easier)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(to-test )Tj +-36.755 -1.44 Td +(methods. )Tj +4.547 0 Td +(Writing )Tj +3.861 0 Td +(tests )Tj +2.472 0 Td +(for )Tj +1.805 0 Td +(the )Tj +1.972 0 Td +(factored-out )Tj +5.862 0 Td +(methods )Tj +4.306 0 Td +(increases )Tj +4.583 0 Td +(the )Tj +1.972 0 Td +(code )Tj +2.75 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +2.138 0 Td +(and )Tj +2.25 0 Td +(the )Tj +-40.866 -1.44 Td +(refactoring )Tj +4.986 0 Td +(decreases )Tj +4.541 0 Td +(the )Tj +1.708 0 Td +(complexity)Tj +4.687 0 Td +(. )Tj +0.615 0 Td +(After )Tj +2.43 0 Td +(only )Tj +2.264 0 Td +(a )Tj +0.874 0 Td +(few )Tj +1.93 0 Td +(refactorings, )Tj +5.653 0 Td +(the )Tj +1.708 0 Td +(tests )Tj +2.208 0 Td +(usually )Tj +/C2_0 1 Tf +3.431 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly )Tj +-37.031 -1.44 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.913 0 Td +(the )Tj +1.747 0 Td +(code )Tj +2.525 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.913 0 Td +(and )Tj +2.025 0 Td +(decrease )Tj +4.191 0 Td +(the )Tj +1.747 0 Td +(complexity)Tj +4.687 0 Td +(. )Tj +0.617 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.469 0 Td +(recomputation )Tj +6.693 0 Td +(of )Tj +1.247 0 Td +(the )Tj +1.747 0 Td +(complexity )Tj +-37.421 -1.44 Td +(statistics )Tj +3.998 0 Td +(happens )Tj +4.054 0 Td +(automatically )Tj +6.276 0 Td +(on )Tj +1.553 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.774 0 Td +(Mer)Tj +1.71 0 Td +(curial )Tj +2.886 0 Td +(hg )Tj +1.497 0 Td +(push )Tj +2.498 0 Td +(or )Tj +1.33 0 Td +(Sub)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(ersion )Tj +3.053 0 Td +(\(SVN\) )Tj +2.942 0 Td +(commit\227we)Tj +-36.644 -1.44 Td +(will co)Tj +2.934 0 Td +(v)Tj +0.488 0 Td +(er that later in the Continuous Integr)Tj +15.551 0 Td +(ation process.)Tj +ET + +endstream +endobj +133 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 134 0 R>>endobj +134 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(53)Tj +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 593.1999 Tm +(T)Tj +0.456 0 Td +(esting the X-r)Tj +5.822 0 Td +(a)Tj +0.47 0 Td +(y Probe)Tj +/TT0 1 Tf +10 0 0 10 75 570.7999 Tm +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.837 0 Td +(is )Tj +1.004 0 Td +(a )Tj +0.837 0 Td +(pet )Tj +1.671 0 Td +(project )Tj +3.338 0 Td +(and )Tj +1.949 0 Td +(its )Tj +1.282 0 Td +(primary )Tj +3.67 0 Td +(purpose )Tj +3.783 0 Td +(is )Tj +1.004 0 Td +(to )Tj +1.171 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.837 0 Td +(some )Tj +2.615 0 Td +(fun. )Tj +2.005 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.226 0 Td +(test )Tj +1.782 0 Td +(purposes, )Tj +4.45 0 Td +(we )Tj +1.615 0 Td +(will)Tj +( )Tj +-40.588 -1.44 Td +(use )Tj +1.878 0 Td +(ScalaT)Tj +2.734 0 Td +(est )Tj +1.6 0 Td +(\()Tj +(http://scalatest.org/)Tj +(\) )Tj +9.048 0 Td +(with )Tj +2.323 0 Td +(Moc)Tj +1.927 0 Td +(kito )Tj +2.045 0 Td +(\()Tj +(http://moc)Tj +4.651 0 Td +(kito.org/)Tj +(\) )Tj +4.268 0 Td +(instead )Tj +3.49 0 Td +(of )Tj +1.267 0 Td +(the )Tj +1.767 0 Td +(well )Tj +2.267 0 Td +(kno)Tj +1.6 0 Td +(wn )Tj +-40.866 -1.44 Td +(JUnit )Tj +2.701 0 Td +(4 )Tj +1.089 0 Td +(\()Tj +(http://junit.org/)Tj +(\). )Tj +7.76 0 Td +(ScalaT)Tj +2.734 0 Td +(est )Tj +1.7 0 Td +(can )Tj +2.089 0 Td +(be )Tj +1.589 0 Td +(easily )Tj +2.978 0 Td +(combined )Tj +4.868 0 Td +(with )Tj +2.423 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.589 0 Td +(and )Tj +2.145 0 Td +(integr)Tj +2.433 0 Td +(ated )Tj +2.367 0 Td +(with)Tj +( )Tj +-40.31 -1.44 Td +(Hudson \()Tj +(http://ja)Tj +7.197 0 Td +(v)Tj +0.476 0 Td +(a.net/projects/hudson/)Tj +(\). )Tj +-5.873 -2.24 Td +(In )Tj +1.19 0 Td +(the )Tj +1.69 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.856 0 Td +(setup)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.885 0 Td +(JUnit )Tj +2.524 0 Td +(is )Tj +1.023 0 Td +(still )Tj +1.857 0 Td +(used )Tj +2.357 0 Td +(to )Tj +1.19 0 Td +(run )Tj +1.801 0 Td +(the )Tj +1.69 0 Td +(test )Tj +1.801 0 Td +(and )Tj +1.968 0 Td +(integr)Tj +2.433 0 Td +(ate )Tj +1.634 0 Td +(with )Tj +2.246 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en. )Tj +1.69 0 Td +(ScalaT)Tj +2.734 0 Td +(est )Tj +1.523 0 Td +(uses)Tj +( )Tj +-40.366 -1.44 Td +(the JUnit runner to execute the tests. See Listing 26.)Tj +/TT3 1 Tf +0 -1.79 TD +(package com.abien.xray.probe.http)Tj +T* +(import org.scalatest.junit.JUnitSuite)Tj +T* +(import org.scalatest.junit.ShouldMatchersForJUnit)Tj +T* +(import org.mockito.Mockito._)Tj +T* +(import org.scalatest.mock.MockitoSugar)Tj +T* +(import org.junit._)Tj +T* +(import Assert._)Tj +T* +(import javax.servlet.FilterConfig)Tj +0 -3.58 TD +(class HTTPRequestRESTInterceptorTest extends JUnitSuite with )Tj +0 -0.99 TD +(MockitoSugar with ShouldMatchersForJUnit{)Tj +0 -1.79 TD +( var cut:HTTPRequestRESTInterceptor = _)Tj +T* +( @Before)Tj +T* +( def setUp: Unit = {)Tj +0 -1.79 TD +( cut = new HTTPRequestRESTInterceptor\(\))Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( @Test)Tj +0 -1.79 TD +( def createMessageWithoutReferer = {)Tj +0 -1.79 TD +( val uri = "/hello/world")Tj +0 -1.79 TD +( val referer = null)Tj +0 -1.79 TD +( val message = cut.createMessage\(uri,referer\))Tj +0 -1.79 TD +( message should be \(uri\))Tj +0 -1.79 TD +( })Tj +ET + +endstream +endobj +135 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 136 0 R>>endobj +136 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(54)Tj +/TT1 1 Tf +0 Tc 0 Tw -20.432 55.72 Td +( @Test)Tj +0 -1.79 TD +( def createMessageWithReferer = {)Tj +T* +( val uri = "/hello/world")Tj +T* +( val referer = "adam-bien.com")Tj +T* +( val message = cut.createMessage\(uri,referer\))Tj +T* +( message should be \(uri+HTTPRequestRESTInterceptor.DELIMITER)Tj +0 -0.99 TD +(+referer\))Tj +0 -1.79 TD +( })Tj +T* +( )Tj +T* +( @Test)Tj +T* +( def initWithServiceURL = {)Tj +T* +( var filterConfig = mock[FilterConfig])Tj +T* +( def expected:String = "http://localhost:8080")Tj +T* +( when\(filterConfig.getInitParameter)Tj +0 -0.99 TD +(\(HTTPRequestRESTInterceptor.SERVICE_URL_KEY\)\).thenReturn\(expected\))Tj +0 -1.79 TD +( cut.init\(filterConfig\))Tj +0 -1.79 TD +( cut.url.toExternalForm should equal \(expected\))Tj +0 -1.79 TD +( cut.client should not be \(null\))Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( @Test)Tj +0 -1.79 TD +( def initWithOutServiceURL = {)Tj +T* +( var filterConfig = mock[FilterConfig])Tj +T* +( cut.init\(filterConfig\))Tj +T* +( cut.url should be \(null\))Tj +T* +( cut.client should be \(null\) //malformed URL)Tj +T* +( })Tj +T* +( )Tj +T* +( @Test)Tj +T* +( def getInstrumentedRunnable = {)Tj +0 -1.79 TD +( def uri = "/hello")Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 77.2999 Tm +( def referer = "/hugo")Tj +ET +Q + +endstream +endobj +137 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 138 0 R>>endobj +138 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(55)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( cut.getInstrumentedRunnable\(uri, referer\) should not be \(null\))Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.1999 Tm +( })Tj +0 -1.79 TD +( )Tj +T* +( @Test)Tj +T* +( def sendAsync = {)Tj +T* +( val uri = "http://hugo.com")Tj +T* +( val ref = "localhost")Tj +T* +( cut.client = mock[RESTClient])Tj +T* +( cut.sendAsync\(uri, ref\))Tj +T* +( verify\(cut.client,times\(1\)\).put\(cut.createMessage\(uri, ref\)\)\ ;)Tj +T* +( HTTPRequestRESTInterceptor.getNrOfRejectedJobs should be \(0\))Tj +T* +( })Tj +T* +( )Tj +/TT2 1 Tf +T* +( @Test\(timeout=500\))Tj +/TT1 1 Tf +0 -1.79 TD +( def sendAsyncAndOverload = {)Tj +0 -1.79 TD +( val uri = "http://hugo.com")Tj +T* +( val ref = "localhost")Tj +T* +( cut.client = new RESTClient\(\){)Tj +T* +( override def put\(content:String\) {)Tj +T* +( Thread.sleep\(200\);)Tj +T* +( })Tj +T* +( };)Tj +T* +( val overload:Int = 10;)Tj +T* +( for\(i <- 0 until \(HTTPRequestRESTInterceptor.QUEUE_CAPACITY + )Tj +0 -0.99 TD +(HTTPRequestRESTInterceptor.NR_OF_THREADS +overload\)\){)Tj +0 -1.79 TD +( cut.sendAsync\(uri + i, ref + i\))Tj +T* +( })Tj +T* +( HTTPRequestRESTInterceptor.getNrOfRejectedJobs should be )Tj +0 -0.99 TD +(\(overload\))Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 26: HTTPRequestRESTInter)Tj +14.661 0 Td +(ceptorT)Tj +3.179 0 Td +(est\227T)Tj +2.623 0 Td +(esting the Hard Stuff)Tj +ET + +endstream +endobj +139 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 141 0 R>>endobj +140 0 obj<>endobj +141 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(56)Tj +0 Tc 0 Tw -18.632 57.06 Td +(T)Tj +0.511 0 Td +(he )Tj +1.667 0 Td +(method )Tj +/TT1 1 Tf +3.89 0 Td +(initWithServiceURL)Tj +/TT0 1 Tf +( )Tj +11.412 0 Td +(is )Tj +1.278 0 Td +(the )Tj +1.945 0 Td +(easiest )Tj +3.445 0 Td +(to )Tj +1.445 0 Td +(start )Tj +2.389 0 Td +(with. )Tj +2.705 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.667 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +/TT1 1 Tf +3.835 0 Td +(mock)Tj +-39.8 -1.44 Td +([FilterConfig])Tj +/TT0 1 Tf +( )Tj +9.13 0 Td +(creates )Tj +3.728 0 Td +(a )Tj +1.228 0 Td +(moc)Tj +1.871 0 Td +(k )Tj +1.228 0 Td +(implementation )Tj +7.508 0 Td +(on )Tj +1.84 0 Td +(the )Tj +/C2_0 1 Tf +2.062 0 Td +<005E>Tj +/TT0 1 Tf +(y )Tj +1.784 0 Td +(and )Tj +2.34 0 Td +(is )Tj +1.395 0 Td +(equi)Tj +1.872 0 Td +(v)Tj +0.476 0 Td +(alent )Tj +2.84 0 Td +(to )Tj +1.562 0 Td +(the)Tj +( )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(org.mockito.Mockito.mock\(FilterConfig.class\))Tj +/TT0 1 Tf +( )Tj +26.889 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation. )Tj +3.913 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.541 0 Td +(return )Tj +3.041 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.319 0 Td +(is )Tj +1.152 0 Td +(an )Tj +-41.144 -1.44 Td +(alread)Tj +2.643 0 Td +(y )Tj +1.102 0 Td +(usable )Tj +3.381 0 Td +(dumm)Tj +2.766 0 Td +(y )Tj +1.102 0 Td +(implementation )Tj +7.382 0 Td +(without )Tj +3.882 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.102 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(. )Tj +0.806 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.658 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.269 0 Td +(is )Tj +1.269 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(eniently )Tj +-38.754 -1.44 Td +(recorded with the follo)Tj +9.826 0 Td +(wing in)Tj +3.212 0 Td +(v)Tj +0.482 0 Td +(ocation:)Tj +/TT1 1 Tf +-13.52 -1.79 Td +( when\(filterConfig.getInitParameter)Tj +0 -0.99 TD +(\(HTTPRequestRESTInterceptor.SERVICE_URL_KEY\)\).thenReturn\(expected\))Tj +/TT0 1 Tf +1.8 -2.24 Td +(Whenev)Tj +3.6 0 Td +(er )Tj +1.143 0 Td +(the )Tj +1.644 0 Td +(method )Tj +/TT1 1 Tf +3.589 0 Td +(getInitParameter)Tj +/TT0 1 Tf +( )Tj +9.911 0 Td +(is )Tj +0.977 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked, )Tj +2.7 0 Td +(the )Tj +/TT1 1 Tf +1.644 0 Td +(String)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +3.91 0 Td +(expected)Tj +/TT0 1 Tf +( )Tj +5.111 0 Td +(is )Tj +0.977 0 Td +(returned. )Tj +-38.31 -1.44 Td +(A )Tj +/C2_0 1 Tf +1.064 0 Td +<0048004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +/TT1 1 Tf +6.399 0 Td +(FilterConfig)Tj +/TT0 1 Tf +( )Tj +7.598 0 Td +(moc)Tj +1.871 0 Td +(kup )Tj +2.009 0 Td +(is )Tj +1.064 0 Td +(passed )Tj +3.287 0 Td +(to )Tj +1.231 0 Td +(the )Tj +1.731 0 Td +(method )Tj +/TT1 1 Tf +3.676 0 Td +(init)Tj +/TT0 1 Tf +(. )Tj +3.001 0 Td +(T)Tj +0.511 0 Td +(hen )Tj +2.009 0 Td +(it )Tj +0.953 0 Td +(is )Tj +1.064 0 Td +(possible )Tj +3.899 0 Td +(to )Tj +-41.366 -1.44 Td +(test the actual initialization functionality)Tj +17.195 0 Td +(.)Tj +-15.395 -2.24 Td +(M)Tj +1.01 0 Td +(o)Tj +0.677 0 Td +(r)Tj +0.454 0 Td +(e )Tj +1.339 0 Td +(i)Tj +0.399 0 Td +(n)Tj +0.677 0 Td +(t)Tj +0.399 0 Td +(e)Tj +0.621 0 Td +(r)Tj +0.454 0 Td +(e)Tj +0.621 0 Td +(s)Tj +0.51 0 Td +(t)Tj +0.399 0 Td +(i)Tj +0.399 0 Td +(n)Tj +0.677 0 Td +(g )Tj +1.339 0 Td +(f)Tj +0.399 0 Td +(u)Tj +0.677 0 Td +(n)Tj +0.677 0 Td +(c)Tj +0.621 0 Td +(t)Tj +0.399 0 Td +(i)Tj +0.399 0 Td +(o)Tj +0.677 0 Td +(n)Tj +0.677 0 Td +(a)Tj +0.621 0 Td +(l)Tj +0.399 0 Td +(i)Tj +0.399 0 Td +(t)Tj +0.399 0 Td +(y )Tj +1.339 0 Td +(t)Tj +0.399 0 Td +(o )Tj +1.395 0 Td +(t)Tj +0.399 0 Td +(e)Tj +0.621 0 Td +(s)Tj +0.51 0 Td +(t )Tj +1.117 0 Td +(i)Tj +0.399 0 Td +(s )Tj +1.228 0 Td +(t)Tj +0.399 0 Td +(h)Tj +0.677 0 Td +(e )Tj +1.339 0 Td +(o)Tj +0.665 0 Td +(v)Tj +0.609 0 Td +(e)Tj +0.621 0 Td +(r)Tj +0.454 0 Td +(l)Tj +0.399 0 Td +(o)Tj +0.677 0 Td +(a)Tj +0.621 0 Td +(d )Tj +1.395 0 Td +(b)Tj +0.677 0 Td +(e)Tj +0.621 0 Td +(h)Tj +0.677 0 Td +(a)Tj +0.591 0 Td +(v)Tj +0.621 0 Td +(i)Tj +0.399 0 Td +(o)Tj +0.677 0 Td +(r )Tj +1.172 0 Td +(o)Tj +0.677 0 Td +(f )Tj +1.117 0 Td +(t)Tj +0.399 0 Td +(h)Tj +0.677 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(H)Tj +0.793 0 Td +(T)Tj +0.793 0 Td +(T)Tj +0.793 0 Td +(P)Tj +0.793 0 Td +(R)Tj +0.793 0 Td +(e)Tj +0.793 0 Td +(q)Tj +0.793 0 Td +(u)Tj +0.793 0 Td +(e)Tj +0.793 0 Td +(s)Tj +0.793 0 Td +(t)Tj +0.793 0 Td +(R)Tj +0.793 0 Td +(E)Tj +0.793 0 Td +(S)Tj +0.793 0 Td +(T)Tj +0.793 0 Td +(I)Tj +0.793 0 Td +(n)Tj +0.793 0 Td +(t)Tj +0.793 0 Td +(e)Tj +0.793 0 Td +(r)Tj +0.793 0 Td +(c)Tj +0.793 0 Td +(e)Tj +0.793 0 Td +(p)Tj +0.793 0 Td +(t)Tj +0.793 0 Td +(o)Tj +0.793 0 Td +(r)Tj +/TT0 1 Tf +0.793 0 Td +(. )Tj +1.116 0 Td +(W)Tj +1.156 0 Td +(e )Tj +1.375 0 Td +(w)Tj +0.971 0 Td +(i)Tj +0.471 0 Td +(l)Tj +0.471 0 Td +(l )Tj +1.153 0 Td +(a)Tj +0.693 0 Td +(t)Tj +0.471 0 Td +(t)Tj +0.471 0 Td +(e)Tj +0.693 0 Td +(m)Tj +1.026 0 Td +(p)Tj +0.749 0 Td +(t )Tj +1.153 0 Td +(t)Tj +0.471 0 Td +(o )Tj +1.431 0 Td +(o)Tj +0.737 0 Td +(v)Tj +0.681 0 Td +(e)Tj +0.693 0 Td +(r)Tj +0.526 0 Td +(l)Tj +0.471 0 Td +(o)Tj +0.749 0 Td +(a)Tj +0.693 0 Td +(d )Tj +1.431 0 Td +(t)Tj +0.471 0 Td +(h)Tj +0.749 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(HTTPRequestRESTInterceptor)Tj +/TT0 1 Tf +( )Tj +16.164 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.062 0 Td +(passing )Tj +3.73 0 Td +(more )Tj +2.784 0 Td +(bloc)Tj +1.872 0 Td +(king )Tj +/TT1 1 Tf +2.396 0 Td +(Runnable)Tj +/TT0 1 Tf +( )Tj +5.362 0 Td +(instances )Tj +4.508 0 Td +(than )Tj +2.452 0 Td +(the )Tj +-40.866 -1.44 Td +(queue )Tj +3.202 0 Td +(depth )Tj +2.98 0 Td +(and )Tj +2.146 0 Td +(amount )Tj +3.813 0 Td +(of )Tj +1.368 0 Td +(w)Tj +0.766 0 Td +(orking )Tj +3.257 0 Td +(threads )Tj +3.646 0 Td +(can )Tj +2.09 0 Td +(handle. )Tj +3.758 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.423 0 Td +(this )Tj +2.035 0 Td +(purpose)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.23 0 Td +(a )Tj +/TT1 1 Tf +1.034 0 Td +(RESTClient)Tj +/TT0 1 Tf +( )Tj +-36.199 -1.44 Td +(instance )Tj +3.925 0 Td +(with )Tj +2.258 0 Td +(an )Tj +1.424 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erridden )Tj +3.98 0 Td +(method )Tj +/TT1 1 Tf +3.647 0 Td +(put)Tj +/TT0 1 Tf +( )Tj +2.169 0 Td +(is )Tj +1.035 0 Td +(created )Tj +3.535 0 Td +(\(see )Tj +2.035 0 Td +(Listing )Tj +3.147 0 Td +(27\). )Tj +1.962 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.424 0 Td +(method )Tj +/TT1 1 Tf +3.647 0 Td +(put)Tj +/TT0 1 Tf +( )Tj +2.169 0 Td +(bloc)Tj +1.872 0 Td +(ks )Tj +1.257 0 Td +(for)Tj +( )Tj +-41.033 -1.44 Td +(200ms )Tj +3.235 0 Td +(just )Tj +1.846 0 Td +(to )Tj +1.179 0 Td +(simulate )Tj +3.957 0 Td +(an )Tj +1.401 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erloaded )Tj +4.124 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.845 0 Td +(bac)Tj +1.538 0 Td +(kend. )Tj +2.698 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.845 0 Td +(are )Tj +1.678 0 Td +(computing )Tj +4.958 0 Td +(the )Tj +1.679 0 Td +(number )Tj +3.679 0 Td +(of )Tj +1.179 0 Td +(jobs )Tj +2.124 0 Td +(that )Tj +-40.588 -1.44 Td +(can )Tj +2.183 0 Td +(be )Tj +1.683 0 Td +(handled )Tj +4.129 0 Td +(and )Tj +2.239 0 Td +(adding )Tj +3.573 0 Td +(an )Tj +1.683 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erload )Tj +3.35 0 Td +(factor)Tj +2.371 0 Td +(. )Tj +0.868 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.739 0 Td +(the )Tj +1.961 0 Td +(computed )Tj +4.962 0 Td +(number)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.211 0 Td +(the )Tj +1.961 0 Td +(method )Tj +/TT1 1 Tf +-38.921 -1.44 Td +(sendAsync)Tj +/TT0 1 Tf +( gets in)Tj +8.446 0 Td +(v)Tj +0.482 0 Td +(oked. )Tj +2.594 0 Td +(T)Tj +0.511 0 Td +(he expected v)Tj +5.978 0 Td +(alue is the o)Tj +5.213 0 Td +(v)Tj +0.488 0 Td +(erload factor:)Tj +/TT3 1 Tf +-23.712 -1.79 Td +( @Test\(timeout=500\))Tj +/TT1 1 Tf +0 -1.79 TD +( def sendAsyncAndOverload = {)Tj +T* +( val uri = "http://hugo.com")Tj +T* +( val ref = "localhost")Tj +T* +( cut.client = new RESTClient\(\){)Tj +T* +( override def put\(content:String\) {)Tj +T* +( Thread.sleep\(200\);)Tj +T* +( })Tj +T* +( })Tj +T* +( val overload:Int = 10)Tj +0 -1.79 TD +( for\(i <- 0 until \(HTTPRequestRESTInterceptor.QUEUE_CAPACITY + )Tj +0 -0.99 TD +(HTTPRequestRESTInterceptor.NR_OF_THREADS +overload\)\){)Tj +0 -1.79 TD +( cut.sendAsync\(uri + i, ref + i\))Tj +T* +( })Tj +0 -1.79 TD +( )Tj +/TT3 1 Tf +( HTTPRequestRESTInterceptor.getNrOfRejectedJobs should be \(overload\))Tj +/TT1 1 Tf +0 -1.79 TD +( })Tj +ET + +endstream +endobj +142 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 143 0 R>>endobj +143 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(57)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +(})Tj +ET +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 615.2999 Tm +(Listing 27: Ov)Tj +6.046 0 Td +(erriding put Method for Ov)Tj +11.659 0 Td +(erload)Tj +-15.905 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.412 0 Td +(correct )Tj +3.356 0 Td +(computation )Tj +5.803 0 Td +(of )Tj +1.19 0 Td +(the )Tj +1.69 0 Td +(number )Tj +3.69 0 Td +(of )Tj +1.19 0 Td +(rejected )Tj +3.801 0 Td +(jobs )Tj +2.135 0 Td +(is )Tj +1.023 0 Td +(interesting. )Tj +5.08 0 Td +(More )Tj +2.634 0 Td +(important )Tj +4.524 0 Td +(is )Tj +1.023 0 Td +(the )Tj +-40.866 -1.44 Td +(ability )Tj +3.176 0 Td +(to )Tj +1.342 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erload )Tj +3.231 0 Td +(the )Tj +1.842 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.008 0 Td +(probe )Tj +3.009 0 Td +(without )Tj +3.788 0 Td +(bloc)Tj +1.872 0 Td +(king. )Tj +2.546 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.564 0 Td +(attribute )Tj +4.065 0 Td +(timeout )Tj +3.787 0 Td +(in )Tj +1.342 0 Td +(the )Tj +1.842 0 Td +(annotation )Tj +/TT1 1 Tf +-37.586 -1.44 Td +(@Test)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +3.333 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(es )Tj +4 0 Td +(the )Tj +1.666 0 Td +(maximum )Tj +4.665 0 Td +(number )Tj +3.666 0 Td +(of )Tj +1.166 0 Td +(milliseconds )Tj +5.723 0 Td +(within )Tj +3.056 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.888 0 Td +(the )Tj +1.666 0 Td +(test )Tj +1.777 0 Td +(must )Tj +2.388 0 Td +(pass. )Tj +2.407 0 Td +(A )Tj +0.999 0 Td +(longer )Tj +-39.477 -1.44 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.719 0 Td +(causes )Tj +3.329 0 Td +(the )Tj +1.829 0 Td +(test )Tj +1.94 0 Td +(to )Tj +1.329 0 Td +(fail. )Tj +2.033 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.551 0 Td +(timeout )Tj +3.774 0 Td +(constr)Tj +2.6 0 Td +(aint )Tj +2.107 0 Td +(prev)Tj +1.877 0 Td +(ents )Tj +2.218 0 Td +(the )Tj +1.829 0 Td +(test )Tj +1.94 0 Td +(from )Tj +2.495 0 Td +(bloc)Tj +1.872 0 Td +(king )Tj +2.329 0 Td +(and )Tj +-40.588 -1.44 Td +(causes a failure instead)Tj +/TT2 1 Tf +(.)Tj +ET + +endstream +endobj +144 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 145 0 R>>endobj +145 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(58)Tj +ET + +endstream +endobj +146 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 147 0 R>>endobj +147 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(59)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 623.9999 Tm +(X-r)Tj +1.321 0 Td +(a)Tj +0.47 0 Td +(y REST Services)Tj +64 0 0 64 443.416 539.7999 Tm +(4)Tj +/TT0 1 Tf +10 0 0 10 75 461.3999 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.343 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y-services )Tj +4.509 0 Td +(module )Tj +3.566 0 Td +(pro)Tj +1.433 0 Td +(vides )Tj +2.51 0 Td +(the )Tj +1.621 0 Td +(actual )Tj +2.899 0 Td +(business )Tj +3.9 0 Td +(logic. )Tj +2.603 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.343 0 Td +(business )Tj +3.9 0 Td +(logic )Tj +2.399 0 Td +(processes )Tj +4.399 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(URIs )Tj +2.38 0 Td +(with )Tj +2.214 0 Td +(corresponding )Tj +6.493 0 Td +(metadata, )Tj +4.547 0 Td +(and )Tj +1.936 0 Td +(it )Tj +0.88 0 Td +(also )Tj +2.047 0 Td +(offers )Tj +2.658 0 Td +(basic )Tj +2.547 0 Td +(statistic )Tj +3.492 0 Td +(services )Tj +3.713 0 Td +(at )Tj +1.102 0 Td +(the )Tj +1.658 0 Td +(same )Tj +2.546 0 Td +(time. )Tj +2.417 0 Td +(T)Tj +0.511 0 Td +(he)Tj +( )Tj +-41.144 -1.44 Td +(need )Tj +2.425 0 Td +(to )Tj +1.147 0 Td +(pro)Tj +1.433 0 Td +(vide )Tj +2.147 0 Td +(the )Tj +1.647 0 Td +(business )Tj +3.926 0 Td +(logic )Tj +2.425 0 Td +(in )Tj +1.147 0 Td +(a )Tj +0.813 0 Td +(dedicated )Tj +4.537 0 Td +(application )Tj +5.149 0 Td +(and )Tj +1.925 0 Td +(an )Tj +1.369 0 Td +(isolated )Tj +3.648 0 Td +(JVM )Tj +2.147 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.202 0 Td +(caused )Tj +3.314 0 Td +(b)Tj +0.538 0 Td +(y )Tj +-41.7 -1.44 Td +(the )Tj +2.075 0 Td +(incompatibilities )Tj +7.911 0 Td +(with )Tj +2.631 0 Td +(the )Tj +2.075 0 Td +(Roller )Tj +3.297 0 Td +(4 )Tj +1.297 0 Td +(application, )Tj +5.855 0 Td +(not )Tj +2.131 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.241 0 Td +(scalability )Tj +5.076 0 Td +(or )Tj +1.63 0 Td +(maintainability )Tj +-35.753 -1.44 Td +(consider)Tj +3.656 0 Td +(ations. )Tj +3.194 0 Td +(Running )Tj +3.972 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.859 0 Td +(inside )Tj +2.916 0 Td +(the )Tj +1.693 0 Td +(same )Tj +2.581 0 Td +(process )Tj +3.582 0 Td +(as )Tj +1.248 0 Td +(Roller )Tj +2.915 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.305 0 Td +(be )Tj +1.415 0 Td +(the )Tj +1.693 0 Td +(easiest )Tj +3.193 0 Td +(and )Tj +1.971 0 Td +(fastest )Tj +-39.588 -1.44 Td +(possible )Tj +3.906 0 Td +(c)Tj +0.482 0 Td +(hoice, )Tj +3.072 0 Td +(but )Tj +1.794 0 Td +(it )Tj +0.96 0 Td +(w)Tj +0.766 0 Td +(on\222)Tj +1.353 0 Td +(t )Tj +/C2_0 1 Tf +0.682 0 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(ce )Tj +3.183 0 Td +(in )Tj +1.238 0 Td +(this )Tj +1.905 0 Td +(case. )Tj +2.571 0 Td +(\223Don\222)Tj +2.575 0 Td +(t )Tj +0.682 0 Td +(distribute\224 )Tj +4.85 0 Td +(should )Tj +3.295 0 Td +(be )Tj +1.46 0 Td +(considered )Tj +5.128 0 Td +(to )Tj +1.238 0 Td +(be )Tj +-41.144 -1.44 Td +(gener)Tj +2.377 0 Td +(al ad)Tj +2.088 0 Td +(vice)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( not an absolute best pr)Tj +12.077 0 Td +(actice.)Tj +/TT1 1 Tf +12 0 0 12 57 338.6 Tm +(Gi)Tj +1.038 0 Td +(v)Tj +0.488 0 Td +(e Me Some REST)Tj +/TT0 1 Tf +10 0 0 10 75 316.2 Tm +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.787 0 Td +(runs )Tj +2.122 0 Td +(on )Tj +1.399 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.787 0 Td +(EE )Tj +1.288 0 Td +(6 )Tj +0.843 0 Td +(and )Tj +1.9 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.787 0 Td +(EE )Tj +1.288 0 Td +(6 )Tj +0.843 0 Td +(comes )Tj +3.066 0 Td +(with )Tj +2.178 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.009 0 Td +(\(JSR-311\) )Tj +4.233 0 Td +(\()Tj +(http://jcp.org/en/jsr/detail?)Tj +-30.75 -1.44 Td +(id=311)Tj +(\). )Tj +4.396 0 Td +(\223J)Tj +0.704 0 Td +(AX-RS\224 )Tj +3.898 0 Td +(stands )Tj +3.4 0 Td +(for )Tj +1.899 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.195 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hitecture )Tj +4.511 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.621 0 Td +(XML )Tj +2.732 0 Td +(RESTful )Tj +4.011 0 Td +(Services. )Tj +4.51 0 Td +(It )Tj +/C2_0 1 Tf +1.288 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(es )Tj +4.4 0 Td +(a )Tj +-41.7 -1.44 Td +(v)Tj +0.488 0 Td +(endor)Tj +2.446 0 Td +(-neutr)Tj +2.544 0 Td +(al )Tj +1.019 0 Td +(API for serv)Tj +4.934 0 Td +(er)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(side implementation of RESTful services. )Tj +-9.631 -2.24 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +1.672 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.839 0 Td +(EE )Tj +1.339 0 Td +(6)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(capable )Tj +4.618 0 Td +(application )Tj +5.175 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.172 0 Td +(has )Tj +1.784 0 Td +(to )Tj +1.173 0 Td +(pro)Tj +1.433 0 Td +(vide )Tj +2.173 0 Td +(a )Tj +0.839 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.061 0 Td +(implementation. )Tj +7.397 0 Td +(Because )Tj +-38.644 -1.44 Td +(a )Tj +0.883 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.105 0 Td +(implementation )Tj +7.163 0 Td +(has )Tj +1.828 0 Td +(to )Tj +1.217 0 Td +(come )Tj +2.772 0 Td +(with )Tj +2.273 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.716 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.883 0 Td +(EE )Tj +1.383 0 Td +(6)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(compliant )Tj +5.607 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.661 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.495 0 Td +(don\222)Tj +1.909 0 Td +(t )Tj +0.661 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.883 0 Td +(to )Tj +-41.366 -1.44 Td +(deplo)Tj +2.434 0 Td +(y )Tj +0.782 0 Td +(a )Tj +0.782 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.004 0 Td +(runtime )Tj +3.616 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.672 0 Td +(with )Tj +2.172 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.727 0 Td +(application. )Tj +5.396 0 Td +(On )Tj +1.671 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.782 0 Td +(EE )Tj +1.282 0 Td +(serv)Tj +1.71 0 Td +(ers )Tj +1.504 0 Td +(prior )Tj +2.338 0 Td +(to )Tj +1.116 0 Td +(v)Tj +0.488 0 Td +(ersion )Tj +2.894 0 Td +(6, )Tj +-41.366 -1.44 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.444 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.832 0 Td +(to )Tj +1.166 0 Td +(pro)Tj +1.433 0 Td +(vide )Tj +2.166 0 Td +(a )Tj +0.832 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.054 0 Td +(implementation )Tj +7.112 0 Td +(with )Tj +2.222 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.777 0 Td +(application )Tj +5.168 0 Td +(and )Tj +1.944 0 Td +(a )Tj +0.832 0 Td +(customized )Tj +/TT3 1 Tf +5.278 0 Td +(web.xml)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +-37.999 -1.44 Td +<004F0041004C0040000100390001003B00470046005D>Tj +/TT0 1 Tf +(gured REST servlet.)Tj +1.8 -2.24 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.341 0 Td +(is )Tj +1.286 0 Td +(an )Tj +1.675 0 Td +(annotation-based )Tj +8.03 0 Td +(API. )Tj +2.324 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.675 0 Td +(annotation )Tj +5.233 0 Td +(ja)Tj +0.748 0 Td +(v)Tj +0.476 0 Td +(ax.ws.rs.P)Tj +4.187 0 Td +(ath )Tj +1.953 0 Td +(binds )Tj +2.954 0 Td +(a )Tj +1.119 0 Td +(class )Tj +2.675 0 Td +(to )Tj +1.453 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(particular )Tj +4.681 0 Td +(URL )Tj +2.458 0 Td +(segment )Tj +4.125 0 Td +(after )Tj +2.458 0 Td +(a )Tj +/C2_0 1 Tf +1.069 0 Td +<0048004A003D003C003D005D>Tj +/TT0 1 Tf +(ned )Tj +/C2_0 1 Tf +5.182 0 Td +<0048004A003D005D>Tj +/TT0 1 Tf +(x. )Tj +3.218 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +1.625 0 Td +<0048004A003D005D>Tj +/TT0 1 Tf +(x )Tj +3.014 0 Td +(comprises )Tj +4.903 0 Td +(the )Tj +1.866 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +1.847 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.903 0 Td +(name )Tj +-39.811 -1.44 Td +(follo)Tj +1.934 0 Td +(wed b)Tj +2.65 0 Td +(y the v)Tj +2.866 0 Td +(alue of the annotation )Tj +9.691 0 Td +(ApplicationP)Tj +5.467 0 Td +(ath \(see Listing 28\).)Tj +/TT3 1 Tf +-22.608 -2.99 Td +(@javax.ws.rs.ApplicationPath\("resources"\))Tj +0 -1.79 TD +(public class ApplicationConfig extends javax.ws.rs.core.Application {})Tj +/C2_0 1 Tf +0 -1.88 TD +<00280041004B004C00410046003F0001000F001500170001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +8.437 0 Td +(ation of the REST URL)Tj +ET + +endstream +endobj +148 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 149 0 R>>endobj +149 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(60)Tj +0 Tc 0 Tw -18.632 55.18 Td +(T)Tj +0.511 0 Td +(he )Tj +1.749 0 Td +(class )Tj +/TT1 1 Tf +2.749 0 Td +(HitsResource)Tj +/TT0 1 Tf +( )Tj +7.894 0 Td +(listens )Tj +3.361 0 Td +(to )Tj +1.527 0 Td +(the )Tj +2.027 0 Td +(URL )Tj +/TT1 1 Tf +2.582 0 Td +(http://[localhost:8080]/x-ray/)Tj +-24.197 -1.44 Td +(resources/hits)Tj +/TT0 1 Tf +(. )Tj +9 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +1.45 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.95 0 Td +(part, )Tj +2.339 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.95 0 Td +(is )Tj +1.061 0 Td +(inside )Tj +2.951 0 Td +(the )Tj +1.728 0 Td +(square )Tj +3.228 0 Td +(br)Tj +0.877 0 Td +(ac)Tj +0.982 0 Td +(kets, )Tj +2.339 0 Td +(is )Tj +1.061 0 Td +(the )Tj +1.728 0 Td +(serv)Tj +1.71 0 Td +(er\222)Tj +1.019 0 Td +(s )Tj +0.783 0 Td +(IP )Tj +1.228 0 Td +(address )Tj +-38.977 -1.44 Td +(and )Tj +1.898 0 Td +(port. )Tj +2.287 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.786 0 Td +(is )Tj +0.953 0 Td +(the )Tj +1.62 0 Td +(name )Tj +2.675 0 Td +(of )Tj +1.12 0 Td +(the )Tj +1.583 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +1.564 0 Td +<005D>Tj +/TT0 1 Tf +(le. )Tj +1.824 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.342 0 Td +(context )Tj +3.454 0 Td +(path )Tj +2.176 0 Td +(can )Tj +1.842 0 Td +(be )Tj +/C2_0 1 Tf +1.342 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +4.899 0 Td +(only )Tj +2.176 0 Td +(in )Tj +1.12 0 Td +(a )Tj +0.786 0 Td +(standard )Tj +-38.532 -1.44 Td +(w)Tj +0.76 0 Td +(a)Tj +/C2_0 1 Tf +0.47 0 Td +<00510001004F0041004C004000010039004600010021001D002E0001005D>Tj +/TT0 1 Tf +(le only \(see Listing 29\). )Tj +/TT1 1 Tf +0.57 -2.12 Td +()Tj +1.8 -2.12 Td +( x-ray)Tj +0 -2.12 TD +( )Tj +0 -2.12 TD +( )Tj +0 -2.12 TD +( x-ray-war.war)Tj +T* +( )Tj +/TT2 1 Tf +( x-ray-war)Tj +/TT1 1 Tf +0 -2.12 TD +( )Tj +0 -2.12 TD +( )Tj +T* +( )Tj +T* +( x-ray-ejb.jar)Tj +T* +( )Tj +T* +()Tj +/C2_0 1 Tf +-1.8 -2.24 Td +<00280041004B004C00410046003F0001000F001600170001001F00470046004C003D0050004C00010031002E00280001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +14.217 0 Td +(ation in an EAR F)Tj +7.43 0 Td +(ile)Tj +-19.847 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.356 0 Td +(application )Tj +5.136 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.133 0 Td +(usually )Tj +3.357 0 Td +(deri)Tj +1.649 0 Td +(v)Tj +0.488 0 Td +(es )Tj +1.189 0 Td +(the )Tj +1.634 0 Td +(context )Tj +3.468 0 Td +(URL )Tj +2.189 0 Td +(from )Tj +2.3 0 Td +(the )Tj +1.597 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +1.578 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.634 0 Td +(name. )Tj +2.967 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.189 0 Td +(a )Tj +0.8 0 Td +(custom )Tj +/C2_0 1 Tf +-39.088 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.804 0 Td +(of )Tj +1.469 0 Td +(the )Tj +1.969 0 Td +(context )Tj +3.804 0 Td +(URI )Tj +2.303 0 Td +(in )Tj +1.469 0 Td +(a )Tj +1.135 0 Td +(standalone )Tj +5.267 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +1.913 0 Td +<005D>Tj +/TT0 1 Tf +(le, )Tj +2.248 0 Td +(an )Tj +1.691 0 Td +(application )Tj +5.471 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +/TT3 1 Tf +(-)Tj +/C2_0 1 Tf +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +-37.755 -1.44 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.025 0 Td +(descriptor )Tj +4.637 0 Td +(or )Tj +/C2_0 1 Tf +1.247 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.526 0 Td +(is )Tj +1.025 0 Td +(needed. )Tj +3.804 0 Td +(It )Tj +0.914 0 Td +(is )Tj +1.025 0 Td +(impossible )Tj +4.971 0 Td +(to )Tj +1.192 0 Td +(customize )Tj +4.748 0 Td +(the )Tj +1.692 0 Td +(context )Tj +3.526 0 Td +(URL )Tj +-40.311 -1.44 Td +(with a plain )Tj +5.355 0 Td +(W)Tj +/C2_0 1 Tf +0.955 0 Td +<001D002E0001005D>Tj +/TT0 1 Tf +(le in a serv)Tj +6.768 0 Td +(er)Tj +0.778 0 Td +(-independent w)Tj +6.763 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(.)Tj +/TT2 1 Tf +-21.497 -1.79 Td +(@Path\("hits"\))Tj +/TT1 1 Tf +0 -1.79 TD +(@Stateless)Tj +T* +(@Interceptors\(PerformanceAuditor.class\))Tj +T* +(public class HitsResource {)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 78.1998 Tm +( @Inject)Tj +ET +Q + +endstream +endobj +150 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 152 0 R>>endobj +151 0 obj<>endobj +152 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(61)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( URLPathExtractor extractor;)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( @EJB)Tj +0 -1.79 TD +( Hits hits;)Tj +0 -3.58 TD +( @PUT)Tj +0 -1.79 TD +( @Consumes\({MediaType.TEXT_PLAIN}\))Tj +0 -1.79 TD +( public Response updateStatistics\(@Context HttpHeaders httpHeaders, \ )Tj +0 -0.99 TD +(String url\) {)Tj +0 -1.79 TD +( if \(!isEmpty\(url\)\) {)Tj +0 -1.79 TD +( MultivaluedMap headers = )Tj +0 -0.99 TD +(httpHeaders.getRequestHeaders\(\);)Tj +0 -1.79 TD +( Map headerMap = new HashMap\(\);)Tj +0 -1.79 TD +( for \(Map.Entry> headerEntries : )Tj +0 -0.99 TD +(headers.entrySet\(\)\) {)Tj +0 -1.79 TD +( String headerName = headerEntries.getKey\(\);)Tj +0 -1.79 TD +( List headerValuesList = headerEntries.getValue)Tj +0 -0.99 TD +(\(\);)Tj +0 -1.79 TD +( if \(headerValuesList != null && !headerValuesList.isEmpty\(\)\) {)Tj +0 -1.79 TD +( String headerValue = headerValuesList.get\(0\);)Tj +T* +( headerMap.put\(headerName, headerValue\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( processURL\(url, headerMap\);)Tj +0 -1.79 TD +( })Tj +T* +( return Response.noContent\(\).build\(\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( void processURL\(String url, Map headerMap\) {)Tj +0 -1.79 TD +( String uniqueAction = extractor.extractPathSegmentFromURL)Tj +0 -0.99 TD +(\(url\);)Tj +0 -1.79 TD +( String referer = extractor.extractReferer\(url\);)Tj +T* +( hits.updateStatistics\(uniqueAction, referer, headerMap\);)Tj +0 -1.79 TD +( })Tj +ET + +endstream +endobj +153 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 154 0 R>>endobj +154 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(62)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( boolean isEmpty\(String url\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( if \(url == null\) {)Tj +0 -1.79 TD +( return true;)Tj +T* +( })Tj +T* +( String trimmed = url.trim\(\);)Tj +T* +( return trimmed.isEmpty\(\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( @GET)Tj +0 -1.79 TD +( @Produces\({MediaType.TEXT_PLAIN}\))Tj +0 -1.79 TD +( public String totalHitsAsString\(\) {)Tj +T* +( return hits.totalHitsAsString\(\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 30: HitsResour)Tj +9.381 0 Td +(ce\227T)Tj +2.511 0 Td +(he Serv)Tj +3.155 0 Td +(er)Tj +0.778 0 Td +(-Side Skeleton)Tj +-14.025 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.353 0 Td +(method )Tj +/TT1 1 Tf +3.576 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +9.898 0 Td +(in )Tj +1.131 0 Td +(the )Tj +/TT1 1 Tf +1.631 0 Td +(HitsResource)Tj +/TT0 1 Tf +( )Tj +7.498 0 Td +(stateless )Tj +3.798 0 Td +(session )Tj +3.354 0 Td +(bean )Tj +2.409 0 Td +(is )Tj +0.964 0 Td +(annotated)Tj +( )Tj +-37.92 -1.44 Td +(with )Tj +2.303 0 Td +(the )Tj +/TT1 1 Tf +1.747 0 Td +(@PUT)Tj +/TT0 1 Tf +( )Tj +2.813 0 Td +(and )Tj +/TT1 1 Tf +2.025 0 Td +(@Consumes\({MediaType.TEXT_PLAIN}\))Tj +/TT0 1 Tf +( )Tj +20.216 0 Td +(annotations. )Tj +5.657 0 Td +(All )Tj +1.636 0 Td +(PUT )Tj +2.303 0 Td +(requests)Tj +( )Tj +-38.699 -1.44 Td +(will, therefore, be routed to the )Tj +/TT1 1 Tf +(updateStatistics)Tj +/TT0 1 Tf +( method. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.474 0 Td +(content )Tj +3.642 0 Td +(of )Tj +1.252 0 Td +(the )Tj +/TT1 1 Tf +1.752 0 Td +(@Consumes)Tj +/TT0 1 Tf +( )Tj +5.819 0 Td +(annotation )Tj +/C2_0 1 Tf +5.032 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(es )Tj +4.086 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.196 0 Td +(to )Tj +1.252 0 Td +(interpret )Tj +4.03 0 Td +(the )Tj +1.752 0 Td +(par)Tj +1.377 0 Td +(ameter)Tj +2.87 0 Td +(. )Tj +0.696 0 Td +(It )Tj +0.974 0 Td +(is )Tj +1.085 0 Td +(a )Tj +-41.7 -1.44 Td +(plain )Tj +2.621 0 Td +(string. )Tj +2.991 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.509 0 Td +(MediaType.TEXT_PLAIN)Tj +/TT0 1 Tf +( )Tj +12.455 0 Td +(attribute )Tj +/C2_0 1 Tf +4.01 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gures )Tj +4.899 0 Td +(a )Tj +0.953 0 Td +(pass-through )Tj +5.955 0 Td +(of )Tj +1.287 0 Td +(the )Tj +1.787 0 Td +(content )Tj +-38.976 -1.44 Td +(without )Tj +3.798 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.018 0 Td +(further )Tj +3.352 0 Td +(tr)Tj +0.599 0 Td +(ansformation )Tj +6.131 0 Td +(or )Tj +1.407 0 Td +(interpretation. )Tj +6.502 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.574 0 Td +(string )Tj +2.852 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.462 0 Td +(is )Tj +1.185 0 Td +(the )Tj +1.852 0 Td +(result )Tj +2.852 0 Td +(of )Tj +1.352 0 Td +(the )Tj +-40.866 -1.44 Td +(encoding of a URI. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he method )Tj +/TT1 1 Tf +(processURL)Tj +/TT0 1 Tf +( extr)Tj +12.769 0 Td +(acts the referer and in)Tj +9.324 0 Td +(v)Tj +0.482 0 Td +(okes the business logic. )Tj +-23.086 -2.24 Td +(Also )Tj +2.223 0 Td +(interesting )Tj +4.779 0 Td +(is )Tj +1 0 Td +(the )Tj +1.667 0 Td +(return )Tj +2.889 0 Td +(type )Tj +2.167 0 Td +(of )Tj +1.167 0 Td +(the )Tj +/TT1 1 Tf +1.667 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +9.935 0 Td +(method. )Tj +3.816 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.389 0 Td +(Response)Tj +/TT0 1 Tf +( )Tj +5.134 0 Td +(class )Tj +-40.144 -1.44 Td +(comes )Tj +3.166 0 Td +(with )Tj +2.278 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.11 0 Td +(and )Tj +/C2_0 1 Tf +2 0 Td +<004B00410045004800440041005D>Tj +/TT0 1 Tf +(es )Tj +4.445 0 Td +(the )Tj +1.722 0 Td +(creation )Tj +3.889 0 Td +(of )Tj +1.222 0 Td +(HTTP )Tj +2.834 0 Td +(codes. )Tj +/TT1 1 Tf +3.167 0 Td +(Response)Tj +/TT0 1 Tf +( )Tj +5.188 0 Td +(can )Tj +1.944 0 Td +(be )Tj +1.444 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(eniently )Tj +-38.754 -1.44 Td +(created )Tj +3.585 0 Td +(with )Tj +2.308 0 Td +(a )Tj +0.918 0 Td +(Builder )Tj +3.53 0 Td +(pattern. )Tj +3.66 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.918 0 Td +(are )Tj +1.751 0 Td +(creating )Tj +3.863 0 Td +(a )Tj +/TT1 1 Tf +0.918 0 Td +(noContent\(\))Tj +/TT0 1 Tf +( )Tj +7.019 0 Td +(response, )Tj +4.475 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.974 0 Td +(is )Tj +1.085 0 Td +(tr)Tj +0.599 0 Td +(anslated)Tj +( )Tj +-38.643 -1.44 Td +(into )Tj +(the )Tj +(HTTP )Tj +(code )Tj +(204. )Tj +10.824 0 Td +(T)Tj +0.511 0 Td +(his )Tj +(HTTP )Tj +(code )Tj +(is )Tj +(returned )Tj +(regardless )Tj +(of )Tj +(the )Tj +(actual )Tj +(process )Tj +(result)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +(ev)Tj +28.975 0 Td +(en )Tj +(if)Tj +( )Tj +-40.31 -1.44 Td +(exceptions )Tj +4.931 0 Td +(exist. )Tj +2.504 0 Td +(A )Tj +0.985 0 Td +(good )Tj +2.486 0 Td +(PUT )Tj +2.208 0 Td +(implementation )Tj +7.098 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.264 0 Td +(return )Tj +2.874 0 Td +(HTTP )Tj +2.764 0 Td +(Created )Tj +3.652 0 Td +(\(code )Tj +2.708 0 Td +(201\) )Tj +2.264 0 Td +(in )Tj +1.152 0 Td +(the )Tj +1.652 0 Td +(case )Tj +-40.311 -1.44 Td +(of )Tj +1.136 0 Td +(an )Tj +1.358 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.526 0 Td +(with )Tj +2.192 0 Td +(a )Tj +0.802 0 Td +(not)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(y)Tj +2.205 0 Td +(et)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(existing )Tj +4.692 0 Td +(URI, )Tj +2.247 0 Td +(and )Tj +1.914 0 Td +(it )Tj +0.858 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.248 0 Td +(return )Tj +2.858 0 Td +(HTTP )Tj +2.748 0 Td +(OK )Tj +1.746 0 Td +(\(code )Tj +2.692 0 Td +(200\) )Tj +2.248 0 Td +(in )Tj +1.136 0 Td +(the )Tj +1.636 0 Td +(case )Tj +-40.311 -1.44 Td +(of an update of alread)Tj +9.425 0 Td +(y)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(existing information.)Tj +-7.625 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.473 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +10.018 0 Td +(use )Tj +1.862 0 Td +(case )Tj +2.306 0 Td +(is )Tj +1.084 0 Td +(an )Tj +1.473 0 Td +(exception )Tj +4.641 0 Td +(to )Tj +1.251 0 Td +(the )Tj +1.751 0 Td +(rule )Tj +2.084 0 Td +(that )Tj +2.029 0 Td +(a )Tj +0.917 0 Td +(good )Tj +2.585 0 Td +(PUT )Tj +2.307 0 Td +(statement)Tj +( )Tj +-38.088 -1.44 Td +(should )Tj +3.2 0 Td +(return )Tj +2.865 0 Td +(code )Tj +2.421 0 Td +(201 )Tj +1.977 0 Td +(or )Tj +1.198 0 Td +(200. )Tj +2.181 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.365 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.809 0 Td +(probe )Tj +2.81 0 Td +(is )Tj +0.976 0 Td +(not )Tj +1.699 0 Td +(interested )Tj +4.477 0 Td +(in )Tj +1.143 0 Td +(a )Tj +0.809 0 Td +(feedbac)Tj +3.372 0 Td +(k, )Tj +1.087 0 Td +(status, )Tj +2.977 0 Td +(or )Tj +1.198 0 Td +(possible)Tj +( )Tj +-38.698 -1.44 Td +(errors. )Tj +3.257 0 Td +(Also )Tj +2.462 0 Td +(tr)Tj +0.599 0 Td +(ac)Tj +0.982 0 Td +(king )Tj +2.406 0 Td +(the )Tj +1.906 0 Td +(distinction )Tj +5.075 0 Td +(between )Tj +4.24 0 Td +(the )Tj +1.906 0 Td +(HTTP )Tj +3.018 0 Td +(codes )Tj +3.073 0 Td +(Created )Tj +3.906 0 Td +(and )Tj +2.184 0 Td +(OK )Tj +2.016 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.518 0 Td +(only )Tj +ET + +endstream +endobj +155 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 156 0 R>>endobj +156 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(63)Tj +0 Tc 0 Tw -20.432 57.06 Td +(introduce )Tj +4.527 0 Td +(additional )Tj +4.75 0 Td +(complexity )Tj +5.193 0 Td +(and )Tj +2.026 0 Td +(processing )Tj +4.971 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +3.359 0 Td +(without )Tj +3.694 0 Td +(adding )Tj +3.36 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.914 0 Td +(additional )Tj +4.75 0 Td +(v)Tj +0.476 0 Td +(alue. )Tj +-40.088 -1.44 Td +(Exceptions )Tj +5.093 0 Td +(and )Tj +2.092 0 Td +(errors )Tj +2.924 0 Td +(couldn\222)Tj +3.243 0 Td +(t )Tj +0.758 0 Td +(be )Tj +1.536 0 Td +(properly )Tj +4.092 0 Td +(handled )Tj +3.982 0 Td +(and )Tj +2.092 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.426 0 Td +(affect )Tj +2.814 0 Td +(the )Tj +1.814 0 Td +(performance )Tj +5.925 0 Td +(of )Tj +1.314 0 Td +(the )Tj +-40.866 -1.44 Td +(application. )Tj +5.606 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.622 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.066 0 Td +(probe )Tj +3.067 0 Td +(forw)Tj +1.927 0 Td +(ards )Tj +2.344 0 Td +(as )Tj +1.455 0 Td +(fast )Tj +2.011 0 Td +(as )Tj +1.455 0 Td +(possible )Tj +4.068 0 Td +(to )Tj +1.4 0 Td +(the )Tj +1.9 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.678 0 Td +(the )Tj +1.9 0 Td +(URI )Tj +2.233 0 Td +(with )Tj +2.456 0 Td +(the )Tj +-40.866 -1.44 Td +(corresponding metadata. Exceptions are just ignored regardless of their \ origin.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.439 0 Td +(naming )Tj +3.606 0 Td +(of )Tj +1.217 0 Td +(the )Tj +1.717 0 Td +(class )Tj +/TT1 1 Tf +2.439 0 Td +(HitsResource)Tj +/TT0 1 Tf +( )Tj +7.584 0 Td +(seems )Tj +2.994 0 Td +(str)Tj +0.988 0 Td +(ange, )Tj +2.717 0 Td +(but )Tj +1.773 0 Td +(it )Tj +/C2_0 1 Tf +0.939 0 Td +<005D>Tj +/TT0 1 Tf +(ts )Tj +1.606 0 Td +(a )Tj +0.883 0 Td +(common )Tj +4.217 0 Td +(REST )Tj +2.55 0 Td +(naming )Tj +-38.977 -1.44 Td +(sc)Tj +0.871 0 Td +(heme. )Tj +3.096 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.559 0 Td +(plur)Tj +1.711 0 Td +(al )Tj +1.281 0 Td +(\223Hits\224 )Tj +3.114 0 Td +(indicates )Tj +4.338 0 Td +(that )Tj +2.115 0 Td +(this )Tj +2.004 0 Td +(class )Tj +2.559 0 Td +(represents )Tj +4.837 0 Td +(a )Tj +1.003 0 Td +(set )Tj +1.67 0 Td +(of )Tj +1.337 0 Td +(resour)Tj +2.655 0 Td +(ces)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.142 0 Td +(not )Tj +1.893 0 Td +(a )Tj +1.003 0 Td +(single )Tj +-39.699 -1.44 Td +(resour)Tj +2.655 0 Td +(ce. )Tj +1.707 0 Td +(Classes )Tj +3.541 0 Td +(responsible )Tj +5.32 0 Td +(for )Tj +1.596 0 Td +(the )Tj +1.763 0 Td +(creation )Tj +3.93 0 Td +(and )Tj +2.041 0 Td +(remo)Tj +2.21 0 Td +(v)Tj +0.476 0 Td +(al )Tj +1.207 0 Td +(of )Tj +1.263 0 Td +(entities )Tj +3.486 0 Td +(are )Tj +1.762 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.485 0 Td +(a )Tj +0.929 0 Td +(plur)Tj +1.711 0 Td +(al )Tj +1.207 0 Td +(name. )Tj +-39.533 -1.44 Td +(Updates, )Tj +4.364 0 Td +(detailed )Tj +3.975 0 Td +(information, )Tj +5.809 0 Td +(or )Tj +1.418 0 Td +(further )Tj +3.363 0 Td +(na)Tj +1.026 0 Td +(vigation )Tj +3.975 0 Td +(are )Tj +1.862 0 Td +(handled )Tj +4.031 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.029 0 Td +(classes )Tj +3.474 0 Td +(that )Tj +2.141 0 Td +(are )Tj +1.862 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.585 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(singular )Tj +3.772 0 Td +(name. )Tj +3.012 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.882 0 Td +(do )Tj +1.494 0 Td +(not )Tj +1.772 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.882 0 Td +(a )Tj +/TT1 1 Tf +0.882 0 Td +(HitResource)Tj +/TT0 1 Tf +( )Tj +6.983 0 Td +(class)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.688 0 Td +(because )Tj +3.883 0 Td +(we )Tj +1.66 0 Td +(do )Tj +1.494 0 Td +(not )Tj +1.772 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.882 0 Td +(a )Tj +0.882 0 Td +(use )Tj +1.827 0 Td +(case )Tj +2.271 0 Td +(for )Tj +-41.033 -1.44 Td +(detailed )Tj +3.868 0 Td +(information )Tj +5.424 0 Td +(or )Tj +1.311 0 Td +(updates. )Tj +4.035 0 Td +(In )Tj +1.256 0 Td +(more )Tj +2.644 0 Td +(complex )Tj +4.145 0 Td +(scenarios)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.673 0 Td +(it )Tj +0.978 0 Td +(is )Tj +1.089 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.755 0 Td +(common )Tj +4.256 0 Td +(to )Tj +1.256 0 Td +(inter)Tj +1.933 0 Td +(c)Tj +0.482 0 Td +(hange )Tj +-39.588 -1.44 Td +(plur)Tj +1.711 0 Td +(als and singulars b)Tj +7.93 0 Td +(y introducing sub-resour)Tj +10.492 0 Td +(ces.)Tj +-18.333 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.465 0 Td +(last )Tj +1.854 0 Td +(part )Tj +2.076 0 Td +(of )Tj +1.243 0 Td +(the )Tj +1.743 0 Td +(name )Tj +2.798 0 Td +(\(\223Resour)Tj +3.655 0 Td +(ce\224\) )Tj +2.131 0 Td +(is )Tj +1.076 0 Td +(independent )Tj +5.801 0 Td +(from )Tj +2.409 0 Td +(the )Tj +/C2_0 1 Tf +1.743 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.965 0 Td +(part. )Tj +2.354 0 Td +(It )Tj +0.965 0 Td +(is )Tj +1.076 0 Td +(only )Tj +2.299 0 Td +(used )Tj +2.41 0 Td +(to )Tj +-41.366 -1.44 Td +(separ)Tj +2.266 0 Td +(ate )Tj +1.748 0 Td +(the )Tj +1.804 0 Td +(REST)Tj +2.056 0 Td +(-related )Tj +3.748 0 Td +(classes )Tj +3.415 0 Td +(from )Tj +2.47 0 Td +(the )Tj +1.804 0 Td +(actual )Tj +3.082 0 Td +(implementation )Tj +7.25 0 Td +(of )Tj +1.304 0 Td +(the )Tj +1.804 0 Td +(business )Tj +4.083 0 Td +(logic. )Tj +2.86 0 Td +(Using )Tj +-39.699 -1.44 Td +(\223Resour)Tj +3.377 0 Td +(ce\224 )Tj +1.826 0 Td +(as )Tj +1.271 0 Td +(a )Tj +/C2_0 1 Tf +0.882 0 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(x )Tj +2.661 0 Td +(is )Tj +1.049 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient, )Tj +3.328 0 Td +(because )Tj +3.883 0 Td +(it )Tj +0.938 0 Td +(prev)Tj +1.877 0 Td +(ents )Tj +2.105 0 Td +(name )Tj +2.771 0 Td +(clashes. )Tj +3.772 0 Td +(Furthermore, )Tj +5.938 0 Td +(it )Tj +0.938 0 Td +(helps )Tj +2.661 0 Td +(to )Tj +-41.366 -1.44 Td +(keep the business logic protocol implementation agnostic.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.648 0 Td +(method )Tj +/TT1 1 Tf +3.871 0 Td +(totalHitsAsString)Tj +/TT0 1 Tf +( )Tj +10.794 0 Td +(listens )Tj +3.26 0 Td +(to )Tj +1.426 0 Td +(all )Tj +1.648 0 Td +(GET )Tj +2.426 0 Td +(requests )Tj +4.093 0 Td +(and )Tj +2.204 0 Td +(returns )Tj +3.537 0 Td +(the )Tj +1.926 0 Td +(current )Tj +-39.144 -1.44 Td +(number )Tj +3.779 0 Td +(of )Tj +1.279 0 Td +(hits. )Tj +2.224 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +1.001 0 Td +(REST )Tj +2.612 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.112 0 Td +(is )Tj +1.112 0 Td +(r)Tj +0.321 0 Td +(ather )Tj +2.612 0 Td +(unusual )Tj +3.836 0 Td +(for )Tj +/TT1 1 Tf +1.612 0 Td +(HitsResource)Tj +/TT0 1 Tf +(. )Tj +7.832 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.557 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.391 0 Td +(usually )Tj +-39.143 -1.44 Td +(return )Tj +2.972 0 Td +(all )Tj +1.472 0 Td +(hits )Tj +1.917 0 Td +(as )Tj +1.305 0 Td +(JSON )Tj +2.805 0 Td +(or )Tj +1.305 0 Td +(XML )Tj +2.416 0 Td +(containing )Tj +4.974 0 Td +(the )Tj +1.75 0 Td +(URIs )Tj +2.472 0 Td +(for )Tj +1.583 0 Td +(a )Tj +0.916 0 Td +(GET )Tj +2.25 0 Td +(request. )Tj +3.806 0 Td +(In )Tj +1.25 0 Td +(subsequent )Tj +5.252 0 Td +(requests)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-38.449 -1.44 Td +(further )Tj +3.116 0 Td +(information )Tj +5.284 0 Td +(about )Tj +2.728 0 Td +(particular )Tj +4.394 0 Td +(hits )Tj +1.783 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.228 0 Td +(be )Tj +1.338 0 Td +(returned )Tj +3.894 0 Td +(using )Tj +2.561 0 Td +(the )Tj +1.616 0 Td +(previously )Tj +/C2_0 1 Tf +4.728 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.117 0 Td +(URI. )Tj +2.19 0 Td +(W)Tj +0.963 0 Td +(e )Tj +-41.7 -1.44 Td +(are returning the computed total number of all hits instead of just retu\ rning links to all kno)Tj +38.728 0 Td +(wn hits.)Tj +/TT3 1 Tf +12 0 0 12 57 295.6 Tm +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +2.927 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.377 0 Td +(ansactions)Tj +/TT0 1 Tf +10 0 0 10 75 273.2 Tm +(Do )Tj +1.785 0 Td +(we )Tj +1.729 0 Td +(really )Tj +2.84 0 Td +(need )Tj +2.563 0 Td +(tr)Tj +0.599 0 Td +(ansactions? )Tj +5.268 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.674 0 Td +(question )Tj +4.12 0 Td +(is )Tj +1.118 0 Td +(hard )Tj +2.396 0 Td +(to )Tj +1.285 0 Td +(ans)Tj +1.433 0 Td +(wer; )Tj +2.34 0 Td +(rephr)Tj +2.266 0 Td +(asing )Tj +2.674 0 Td +(it )Tj +1.007 0 Td +(to )Tj +1.285 0 Td +(\223Do )Tj +2.229 0 Td +(we )Tj +-40.922 -1.44 Td +(really )Tj +2.838 0 Td +(need )Tj +2.524 0 Td +(A)Tj +0.637 0 Td +(CID )Tj +2.172 0 Td +(\(atomicity)Tj +4.187 0 Td +(, )Tj +0.726 0 Td +(consistenc)Tj +4.478 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.726 0 Td +(isolation, )Tj +4.395 0 Td +(dur)Tj +1.433 0 Td +(ability\)?\224 )Tj +4.227 0 Td +(makes )Tj +3.17 0 Td +(ans)Tj +1.433 0 Td +(wering )Tj +3.394 0 Td +(the )Tj +1.782 0 Td +(question )Tj +-38.531 -1.44 Td +(easier)Tj +2.426 0 Td +(. )Tj +-0.626 -2.24 Td +(Ev)Tj +0.988 0 Td +(en )Tj +1.746 0 Td +(for )Tj +1.857 0 Td +(consistent )Tj +4.97 0 Td +(reading )Tj +3.913 0 Td +(from )Tj +2.69 0 Td +(the )Tj +2.024 0 Td +(database)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.719 0 Td +(tr)Tj +0.599 0 Td +(ansactions )Tj +5.192 0 Td +(are )Tj +2.023 0 Td +(necessary)Tj +4.075 0 Td +(. )Tj +0.931 0 Td +(W)Tj +0.982 0 Td +(ithout )Tj +3.192 0 Td +(a )Tj +-41.7 -1.44 Td +(tr)Tj +0.599 0 Td +(ansaction)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.723 0 Td +(there )Tj +2.527 0 Td +(are )Tj +1.693 0 Td +(also )Tj +2.083 0 Td +(no )Tj +1.472 0 Td +(isolation )Tj +4.029 0 Td +(guar)Tj +1.877 0 Td +(antees )Tj +3.083 0 Td +(\(the )Tj +1.972 0 Td +(\223I\224 )Tj +1.526 0 Td +(in )Tj +1.194 0 Td +(\223)Tj +0.389 0 Td +(A)Tj +0.637 0 Td +(CID\224\). )Tj +3.046 0 Td +(And )Tj +2.139 0 Td +(without )Tj +3.64 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.86 0 Td +(isolation )Tj +-38.531 -1.44 Td +(guar)Tj +1.877 0 Td +(antees)Tj +ET +BT +/TT2 1 Tf +10 0 0 10 103 193.2 Tm +(,)Tj +/TT0 1 Tf +( )Tj +0.725 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.587 0 Td +(could )Tj +2.921 0 Td +(read )Tj +2.364 0 Td +(uncommitted )Tj +6.199 0 Td +(c)Tj +0.482 0 Td +(hanges )Tj +3.476 0 Td +(and )Tj +2.087 0 Td +(base )Tj +2.42 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.92 0 Td +(assumptions )Tj +5.755 0 Td +(on )Tj +1.587 0 Td +(inconsistent )Tj +-37.086 -1.44 Td +(data. )Tj +1.8 -2.24 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansaction )Tj +4.399 0 Td +(bookkeeping )Tj +5.844 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.564 0 Td +(impose )Tj +3.398 0 Td +(a )Tj +0.786 0 Td +(huge )Tj +2.398 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +3.231 0 Td +(on )Tj +1.398 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(all )Tj +1.342 0 Td +(performance; )Tj +6.009 0 Td +(in )Tj +1.12 0 Td +(fact)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.092 0 Td +(the )Tj +-40.866 -1.44 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +3.416 0 Td +(is )Tj +1.138 0 Td +(hardly )Tj +3.194 0 Td +(measur)Tj +3.099 0 Td +(able. )Tj +2.546 0 Td +(An )Tj +1.694 0 Td +(empty)Tj +2.575 0 Td +(, )Tj +0.749 0 Td +(but )Tj +1.861 0 Td +(tr)Tj +0.599 0 Td +(ansactional)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.612 0 Td +(EJB )Tj +1.86 0 Td +(method )Tj +3.75 0 Td +(has )Tj +1.916 0 Td +(nearly )Tj +3.138 0 Td +(the )Tj +1.805 0 Td +(same )Tj +-39.978 -1.44 Td +(performance )Tj +5.744 0 Td +(as )Tj +1.188 0 Td +(a )Tj +0.799 0 Td +(method )Tj +3.578 0 Td +(denoted )Tj +3.801 0 Td +(with )Tj +/TT1 1 Tf +2.189 0 Td +(TransactionAttributeType.NOT_SUPPORTED)Tj +/TT0 1 Tf +(. )Tj +23.381 0 Td +(It )Tj +0.855 0 Td +(is )Tj +-41.533 -1.44 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.301 0 Td +(a )Tj +0.912 0 Td +(good )Tj +2.58 0 Td +(approac)Tj +3.483 0 Td +(h )Tj +0.968 0 Td +(to )Tj +1.246 0 Td +(access )Tj +3.19 0 Td +(a )Tj +0.912 0 Td +(tr)Tj +0.599 0 Td +(ansactional )Tj +5.303 0 Td +(data )Tj +2.246 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.412 0 Td +(in )Tj +1.246 0 Td +(an )Tj +1.468 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.912 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.525 0 Td +(context.)Tj +( )Tj +-38.754 -1.44 Td +(Premature optimization is the root of all evil\205)Tj +1.8 -2.24 Td +(Note )Tj +2.486 0 Td +(that )Tj +1.986 0 Td +(the )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 136.7996 76.4 Tm +(HitsResource)Tj +ET +Q +BT +/TT0 1 Tf +10 0 0 10 208.8113 76.4 Tm +( )Tj +0.374 0 Td +(is )Tj +1.041 0 Td +(an )Tj +1.43 0 Td +(interfaceless )Tj +5.653 0 Td +(stateless )Tj +3.875 0 Td +(session )Tj +3.431 0 Td +(bean )Tj +2.486 0 Td +(\(see )Tj +2.041 0 Td +(Listing )Tj +3.153 0 Td +(30\). )Tj +1.968 0 Td +(T)Tj +0.511 0 Td +(he)Tj +( )Tj +ET + +endstream +endobj +157 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 158 0 R>>endobj +158 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(64)Tj +0 Tc 0 Tw -20.432 57.06 Td +(lac)Tj +1.26 0 Td +(k )Tj +0.931 0 Td +(of )Tj +1.265 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.931 0 Td +(tr)Tj +0.599 0 Td +(ansaction)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(related )Tj +7.822 0 Td +(annotation )Tj +5.045 0 Td +(implies )Tj +3.543 0 Td +(the )Tj +/TT2 1 Tf +1.765 0 Td +(TransactionAttribute\(REQUIRED\))Tj +/TT0 1 Tf +( )Tj +-24.197 -1.44 Td +(s)Tj +0.404 0 Td +(e)Tj +0.515 0 Td +(t)Tj +0.293 0 Td +(t)Tj +0.293 0 Td +(i)Tj +0.293 0 Td +(n)Tj +0.571 0 Td +(g)Tj +0.515 0 Td +(. )Tj +/TT2 1 Tf +1.063 0 Td +(T)Tj +0.615 0 Td +(r)Tj +0.615 0 Td +(a)Tj +0.615 0 Td +(n)Tj +0.615 0 Td +(s)Tj +0.615 0 Td +(a)Tj +0.615 0 Td +(c)Tj +0.615 0 Td +(t)Tj +0.615 0 Td +(i)Tj +0.615 0 Td +(o)Tj +0.615 0 Td +(n)Tj +0.615 0 Td +(A)Tj +0.615 0 Td +(t)Tj +0.615 0 Td +(t)Tj +0.615 0 Td +(r)Tj +0.615 0 Td +(i)Tj +0.615 0 Td +(b)Tj +0.615 0 Td +(u)Tj +0.615 0 Td +(t)Tj +0.615 0 Td +(e)Tj +0.615 0 Td +(T)Tj +0.615 0 Td +(y)Tj +0.615 0 Td +(p)Tj +0.615 0 Td +(e)Tj +0.615 0 Td +(.)Tj +0.615 0 Td +(R)Tj +0.615 0 Td +(E)Tj +0.615 0 Td +(Q)Tj +0.615 0 Td +(U)Tj +0.615 0 Td +(I)Tj +0.615 0 Td +(R)Tj +0.615 0 Td +(E)Tj +0.615 0 Td +(D)Tj +/TT0 1 Tf +( )Tj +1.385 0 Td +(m)Tj +0.848 0 Td +(e)Tj +0.515 0 Td +(a)Tj +0.515 0 Td +(n)Tj +0.571 0 Td +(s )Tj +1.174 0 Td +(t)Tj +0.293 0 Td +(h)Tj +0.571 0 Td +(a)Tj +0.515 0 Td +(t )Tj +1.063 0 Td +(i)Tj +0.293 0 Td +(f )Tj +1.063 0 Td +(t)Tj +0.293 0 Td +(h)Tj +0.571 0 Td +(e)Tj +0.515 0 Td +(r)Tj +0.348 0 Td +(e )Tj +1.285 0 Td +(i)Tj +0.293 0 Td +(s )Tj +1.174 0 Td +(n)Tj +0.571 0 Td +(o )Tj +1.341 0 Td +(e)Tj +0.515 0 Td +(x)Tj +0.515 0 Td +(i)Tj +0.293 0 Td +(s)Tj +0.404 0 Td +(t)Tj +0.293 0 Td +(i)Tj +0.293 0 Td +(n)Tj +0.571 0 Td +(g)Tj +( )Tj +-41.7 -1.44 Td +(tr)Tj +0.599 0 Td +(ansaction)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.823 0 Td +(a )Tj +0.96 0 Td +(new )Tj +2.294 0 Td +(one )Tj +2.072 0 Td +(will )Tj +2.072 0 Td +(be )Tj +1.516 0 Td +(started. )Tj +3.572 0 Td +(Existing )Tj +3.739 0 Td +(tr)Tj +0.599 0 Td +(ansactions )Tj +4.962 0 Td +(\(w)Tj +1.038 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.016 0 Td +(are )Tj +1.793 0 Td +(impossible )Tj +5.073 0 Td +(for )Tj +1.627 0 Td +(a )Tj +0.96 0 Td +(REST )Tj +-40.033 -1.44 Td +(request\) )Tj +3.698 0 Td +(will )Tj +1.92 0 Td +(be )Tj +1.364 0 Td +(reused. )Tj +3.383 0 Td +(A )Tj +0.975 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.421 0 Td +(is )Tj +0.975 0 Td +(started )Tj +3.142 0 Td +(before )Tj +3.031 0 Td +(the )Tj +1.642 0 Td +(actual )Tj +2.92 0 Td +(method )Tj +3.587 0 Td +(and )Tj +1.92 0 Td +(committed )Tj +4.92 0 Td +(or )Tj +1.197 0 Td +(rolled )Tj +-39.699 -1.44 Td +(bac)Tj +1.538 0 Td +(k )Tj +0.79 0 Td +(after )Tj +2.179 0 Td +(that. )Tj +2.106 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.346 0 Td +(tr)Tj +0.599 0 Td +(ansactional )Tj +5.181 0 Td +(aspect )Tj +3.013 0 Td +(is )Tj +0.957 0 Td +(a )Tj +0.79 0 Td +(part )Tj +1.957 0 Td +(of )Tj +1.124 0 Td +(the )Tj +1.624 0 Td +(EJB )Tj +1.679 0 Td +(3.1 )Tj +/C2_0 1 Tf +1.68 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +5.737 0 Td +(and )Tj +1.902 0 Td +(it )Tj +0.846 0 Td +(not )Tj +1.68 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.18 0 Td +(in )Tj +-41.366 -1.44 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.954 0 Td +(EE )Tj +1.454 0 Td +(6 )Tj +1.01 0 Td +(for )Tj +1.621 0 Td +(other )Tj +2.677 0 Td +(components )Tj +5.734 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.01 0 Td +(as )Tj +1.343 0 Td +(CDI )Tj +2.177 0 Td +(beans. )Tj +3.196 0 Td +(All )Tj +/TT2 1 Tf +1.677 0 Td +(HitsResource)Tj +/TT0 1 Tf +( )Tj +7.655 0 Td +(methods )Tj +4.122 0 Td +(are )Tj +1.787 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +-41.7 -1.44 Td +(executed inside a tr)Tj +8.38 0 Td +(ansaction context, w)Tj +8.875 0 Td +(hic)Tj +1.316 0 Td +(h is propagated to all participating objects or beans.)Tj +/TT2 1 Tf +-16.771 -2.24 Td +(HitsResource)Tj +/TT0 1 Tf +( )Tj +7.708 0 Td +(is )Tj +1.173 0 Td +(the )Tj +1.84 0 Td +(boundary )Tj +4.619 0 Td +(of )Tj +1.34 0 Td +(the )Tj +1.84 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.006 0 Td +(bac)Tj +1.538 0 Td +(kend. )Tj +2.896 0 Td +(It )Tj +1.062 0 Td +(is )Tj +1.173 0 Td +(directly )Tj +3.729 0 Td +(exposed )Tj +4.063 0 Td +(to )Tj +1.34 0 Td +(external)Tj +( )Tj +-38.755 -1.44 Td +(clients. )Tj +3.33 0 Td +(Although )Tj +4.257 0 Td +(no )Tj +1.422 0 Td +(tr)Tj +0.599 0 Td +(ansactional )Tj +5.201 0 Td +(resour)Tj +2.655 0 Td +(ces )Tj +1.699 0 Td +(are )Tj +1.643 0 Td +(accessed )Tj +4.144 0 Td +(inside )Tj +/TT2 1 Tf +2.867 0 Td +(HitsResource)Tj +/TT0 1 Tf +(, )Tj +7.789 0 Td +(it )Tj +0.866 0 Td +(is )Tj +0.977 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +-39.532 -1.44 Td +(to )Tj +1.116 0 Td +(start )Tj +2.06 0 Td +(a )Tj +0.782 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.395 0 Td +(at )Tj +1.06 0 Td +(a )Tj +0.782 0 Td +(boundary)Tj +4.021 0 Td +(. )Tj +0.486 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.338 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.395 0 Td +(is )Tj +0.949 0 Td +(propagated )Tj +5.117 0 Td +(to )Tj +1.116 0 Td +(all )Tj +1.338 0 Td +(participants )Tj +5.284 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.394 0 Td +(inside )Tj +-39.643 -1.44 Td +(a method. )Tj +1.8 -2.24 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansparent )Tj +4.509 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.454 0 Td +(propagation )Tj +5.51 0 Td +(is )Tj +1.008 0 Td +(one )Tj +1.953 0 Td +(of )Tj +1.175 0 Td +(the )Tj +1.675 0 Td +(most )Tj +2.397 0 Td +(elegant )Tj +3.453 0 Td +(design )Tj +3.12 0 Td +(decisions )Tj +4.343 0 Td +(in )Tj +1.175 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.841 0 Td +(EE )Tj +1.341 0 Td +(6. )Tj +-41.366 -1.44 Td +(T)Tj +0.456 0 Td +(o )Tj +0.944 0 Td +(ac)Tj +0.982 0 Td +(hiev)Tj +1.822 0 Td +(e )Tj +0.888 0 Td +(this )Tj +1.889 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(, )Tj +0.666 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.5 0 Td +(don\222)Tj +1.909 0 Td +(t )Tj +0.666 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.888 0 Td +(to )Tj +/C2_0 1 Tf +1.222 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gure )Tj +4.445 0 Td +(an)Tj +1.038 0 Td +(ything. )Tj +3.334 0 Td +(Not )Tj +2 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.444 0 Td +(a )Tj +0.888 0 Td +(single )Tj +2.889 0 Td +(annotation )Tj +5.002 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(required )Tj +3.963 0 Td +(to )Tj +1.185 0 Td +(start )Tj +2.129 0 Td +(and )Tj +1.963 0 Td +(propagate )Tj +4.63 0 Td +(a )Tj +0.851 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.464 0 Td +(tr)Tj +0.599 0 Td +(ansparently)Tj +4.854 0 Td +(. )Tj +0.629 0 Td +(It )Tj +0.907 0 Td +(is )Tj +/C2_0 1 Tf +1.018 0 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(cient )Tj +4.242 0 Td +(to )Tj +1.185 0 Td +(introduce )Tj +4.464 0 Td +(the )Tj +1.685 0 Td +(facade )Tj +-39.366 -1.44 Td +(as )Tj +1.296 0 Td +(an )Tj +1.463 0 Td +(EJB )Tj +1.796 0 Td +(3.1 )Tj +1.797 0 Td +(bean. )Tj +2.797 0 Td +(Injected )Tj +3.853 0 Td +(EJB )Tj +1.796 0 Td +(beans, )Tj +3.186 0 Td +(resour)Tj +2.655 0 Td +(ces, )Tj +2.074 0 Td +(CDI )Tj +2.13 0 Td +(managed )Tj +4.352 0 Td +(beans)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.158 0 Td +(and )Tj +2.019 0 Td +(POJOs )Tj +3.296 0 Td +(will )Tj +2.019 0 Td +(all )Tj +1.463 0 Td +(be )Tj +-41.144 -1.44 Td +(executed in the same tr)Tj +9.991 0 Td +(ansaction context as the facade.)Tj +-8.191 -2.24 Td +(EJB )Tj +1.713 0 Td +(beans )Tj +2.825 0 Td +(also )Tj +2.047 0 Td +(allo)Tj +1.6 0 Td +(w )Tj +1.102 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.436 0 Td +(to )Tj +1.158 0 Td +(tr)Tj +0.599 0 Td +(ansparently )Tj +5.27 0 Td +(introduce )Tj +4.437 0 Td +(additional )Tj +4.66 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(ers )Tj +1.546 0 Td +(on )Tj +1.436 0 Td +(demand. )Tj +4.011 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.436 0 Td +(can )Tj +1.88 0 Td +(let )Tj +-41.144 -1.44 Td +(the )Tj +1.719 0 Td +(complexity )Tj +5.164 0 Td +(of )Tj +1.219 0 Td +(a )Tj +0.885 0 Td +(boundary )Tj +4.498 0 Td +(\(a)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +(k)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +(a)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +( )Tj +2.913 0 Td +(facade\) )Tj +3.497 0 Td +(gro)Tj +1.377 0 Td +(w )Tj +1.163 0 Td +(until )Tj +2.331 0 Td +(it )Tj +0.941 0 Td +(becomes )Tj +4.219 0 Td +(incohesi)Tj +3.595 0 Td +(v)Tj +0.488 0 Td +(e, )Tj +1.163 0 Td +(too )Tj +1.775 0 Td +(complex)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.358 0 Td +(or )Tj +-41.311 -1.44 Td +(just )Tj +1.886 0 Td +(hard )Tj +2.33 0 Td +(to )Tj +1.219 0 Td +(test. )Tj +2.034 0 Td +(T)Tj +0.511 0 Td +(hen)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.247 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.497 0 Td +(can )Tj +1.941 0 Td +(factor )Tj +2.83 0 Td +(out )Tj +1.775 0 Td +(cohesi)Tj +2.761 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.885 0 Td +(pieces )Tj +3.108 0 Td +(of )Tj +1.219 0 Td +(functionality )Tj +5.777 0 Td +(into )Tj +2.053 0 Td +(new )Tj +2.219 0 Td +(classes )Tj +3.33 0 Td +(and)Tj +( )Tj +-40.588 -1.44 Td +(inject )Tj +2.962 0 Td +(them )Tj +2.739 0 Td +(into )Tj +2.24 0 Td +(the )Tj +1.906 0 Td +(facade. )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 191.5546 332 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.628 0 Td +(facade )Tj +3.406 0 Td +(becomes )Tj +4.406 0 Td +(leaner )Tj +3.239 0 Td +(and )Tj +2.184 0 Td +(the )Tj +1.906 0 Td +(extr)Tj +1.599 0 Td +(acted )Tj +2.906 0 Td +(classes )Tj +3.517 0 Td +(become )Tj +-38.755 -1.44 Td +(independently )Tj +6.817 0 Td +(testable. )Tj +4.204 0 Td +(Because )Tj +4.203 0 Td +(of )Tj +1.481 0 Td +(EJB )Tj +2.036 0 Td +(3.1, )Tj +2.315 0 Td +(the )Tj +1.981 0 Td +(process )Tj +3.87 0 Td +(of )Tj +1.481 0 Td +(refactoring )Tj +5.259 0 Td +(has )Tj +2.092 0 Td +(no )Tj +1.759 0 Td +(impact )Tj +3.592 0 Td +(on)Tj +( )Tj +-41.088 -1.44 Td +(consistenc)Tj +4.478 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.634 0 Td +(It )Tj +0.912 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.634 0 Td +(make )Tj +2.689 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.856 0 Td +(difference )Tj +4.635 0 Td +(w)Tj +0.76 0 Td +(hether )Tj +3.079 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.134 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.469 0 Td +(participants )Tj +5.358 0 Td +(are )Tj +1.689 0 Td +(accessed)Tj +( )Tj +-38.366 -1.44 Td +(inside )Tj +2.845 0 Td +(the )Tj +1.622 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.401 0 Td +(initiating )Tj +4.068 0 Td +(class )Tj +2.344 0 Td +(or )Tj +1.177 0 Td +(injected )Tj +3.734 0 Td +(beans. )Tj +2.993 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.344 0 Td +(participating )Tj +5.679 0 Td +(components )Tj +5.568 0 Td +(only )Tj +2.178 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.788 0 Td +(to )Tj +-41.366 -1.44 Td +(be executed in the same thread and tr)Tj +16.216 0 Td +(ansaction.)Tj +-14.416 -2.24 Td +(In )Tj +1.296 0 Td +(accordance )Tj +5.463 0 Td +(with )Tj +2.352 0 Td +(the )Tj +1.796 0 Td +(approac)Tj +3.483 0 Td +(h )Tj +1.018 0 Td +(described )Tj +4.63 0 Td +(here, )Tj +2.629 0 Td +(incohesi)Tj +3.595 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.962 0 Td +(business )Tj +4.075 0 Td +(logic )Tj +2.574 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.351 0 Td +(extr)Tj +1.599 0 Td +(acted )Tj +-39.866 -1.44 Td +(from )Tj +2.406 0 Td +(the )Tj +1.74 0 Td +(boundary )Tj +4.519 0 Td +(and )Tj +2.018 0 Td +(put )Tj +1.796 0 Td +(into )Tj +2.074 0 Td +(newly )Tj +3.018 0 Td +(created )Tj +3.573 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(ers )Tj +1.628 0 Td +(behind )Tj +3.408 0 Td +(it. )Tj +1.24 0 Td +(It )Tj +0.962 0 Td +(is )Tj +1.073 0 Td +(also )Tj +2.129 0 Td +(a )Tj +0.906 0 Td +(common )Tj +4.24 0 Td +(pattern )Tj +3.407 0 Td +(to )Tj +-41.366 -1.44 Td +(extr)Tj +1.599 0 Td +(act )Tj +1.79 0 Td +(the )Tj +1.846 0 Td +(facade )Tj +3.346 0 Td +(functionality )Tj +5.904 0 Td +(from )Tj +2.512 0 Td +(an )Tj +1.568 0 Td +(existing )Tj +3.791 0 Td +(boundary )Tj +4.625 0 Td +(and )Tj +2.124 0 Td +(degr)Tj +1.877 0 Td +(ade )Tj +2.068 0 Td +(the )Tj +1.846 0 Td +(boundary )Tj +4.625 0 Td +(into )Tj +2.18 0 Td +(a )Tj +-41.7 -1.44 Td +(\223usual\224 class. )Tj +5.983 0 Td +(T)Tj +0.511 0 Td +(his w)Tj +2.261 0 Td +(as also done during x)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +9.825 0 Td +(a)Tj +0.47 0 Td +(y dev)Tj +2.322 0 Td +(elopment. )Tj +-19.572 -2.24 Td +(In )Tj +1.155 0 Td +(m)Tj +0.821 0 Td +(y )Tj +/C2_0 1 Tf +0.821 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.877 0 Td +(proof )Tj +2.6 0 Td +(of )Tj +1.155 0 Td +(concept)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.017 0 Td +(the )Tj +/TT2 1 Tf +1.655 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.722 0 Td +(class )Tj +2.377 0 Td +(implemented )Tj +5.989 0 Td +(the )Tj +1.655 0 Td +(actual )Tj +2.933 0 Td +(business )Tj +3.934 0 Td +(logic )Tj +2.433 0 Td +(as )Tj +1.21 0 Td +(well )Tj +2.155 0 Td +(as)Tj +( )Tj +-41.311 -1.44 Td +(R)Tj +0.623 0 Td +(E)Tj +0.512 0 Td +(S)Tj +0.512 0 Td +(T )Tj +1.34 0 Td +(f)Tj +0.29 0 Td +(u)Tj +0.568 0 Td +(n)Tj +0.568 0 Td +(c)Tj +0.512 0 Td +(t)Tj +0.29 0 Td +(i)Tj +0.29 0 Td +(o)Tj +0.568 0 Td +(n)Tj +0.568 0 Td +(a)Tj +0.512 0 Td +(l)Tj +0.29 0 Td +(i)Tj +0.29 0 Td +(t)Tj +0.29 0 Td +(y)Tj +0.42 0 Td +(. )Tj +1.062 0 Td +(I)Tj +0.29 0 Td +(n )Tj +1.34 0 Td +(s)Tj +0.401 0 Td +(u)Tj +0.568 0 Td +(b)Tj +0.568 0 Td +(s)Tj +0.401 0 Td +(e)Tj +0.512 0 Td +(q)Tj +0.568 0 Td +(u)Tj +0.568 0 Td +(e)Tj +0.512 0 Td +(n)Tj +0.568 0 Td +(t )Tj +1.062 0 Td +(i)Tj +0.29 0 Td +(t)Tj +0.29 0 Td +(e)Tj +0.512 0 Td +(r)Tj +(a)Tj +0.845 0 Td +(t)Tj +0.29 0 Td +(i)Tj +0.29 0 Td +(o)Tj +0.568 0 Td +(n)Tj +0.568 0 Td +(s)Tj +/TT1 1 Tf +0.401 0 Td +(,)Tj +/TT0 1 Tf +( )Tj +1.034 0 Td +(I )Tj +1.062 0 Td +(c)Tj +0.512 0 Td +(r)Tj +0.345 0 Td +(e)Tj +0.512 0 Td +(a)Tj +0.512 0 Td +(t)Tj +0.29 0 Td +(e)Tj +0.512 0 Td +(d )Tj +1.34 0 Td +(a )Tj +1.284 0 Td +(n)Tj +0.568 0 Td +(e)Tj +0.512 0 Td +(w )Tj +/TT2 1 Tf +1.562 0 Td +(@)Tj +0.612 0 Td +(S)Tj +0.612 0 Td +(t)Tj +0.612 0 Td +(a)Tj +0.612 0 Td +(t)Tj +0.612 0 Td +(e)Tj +0.612 0 Td +(l)Tj +0.612 0 Td +(e)Tj +0.612 0 Td +(s)Tj +0.612 0 Td +(s)Tj +/TT0 1 Tf +( )Tj +1.384 0 Td +(E)Tj +0.512 0 Td +(J)Tj +0.29 0 Td +(B )Tj +1.395 0 Td +(b)Tj +0.568 0 Td +(e)Tj +0.512 0 Td +(a)Tj +0.512 0 Td +(n )Tj +/TT2 1 Tf +-41.644 -1.44 Td +(HitsResource)Tj +/TT0 1 Tf +(. )Tj +8.073 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.724 0 Td +(moti)Tj +1.927 0 Td +(v)Tj +0.476 0 Td +(ation )Tj +2.836 0 Td +(behind )Tj +3.67 0 Td +(this )Tj +2.169 0 Td +(factoring )Tj +4.447 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.557 0 Td +(the )Tj +2.002 0 Td +(principle )Tj +4.503 0 Td +(of )Tj +1.502 0 Td +(Separ)Tj +2.377 0 Td +(ation )Tj +2.836 0 Td +(of )Tj +-41.366 -1.44 Td +(Concerns. )Tj +4.67 0 Td +(Before )Tj +3.113 0 Td +(the )Tj +1.669 0 Td +(refactoring)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.197 0 Td +(the )Tj +/TT2 1 Tf +1.669 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.735 0 Td +(bean )Tj +2.447 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.224 0 Td +(responsible )Tj +5.226 0 Td +(for )Tj +1.502 0 Td +(cross)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(cutting )Tj +5.781 0 Td +(concerns )Tj +4.225 0 Td +(suc)Tj +1.427 0 Td +(h)Tj +( )Tj +-41.644 -1.44 Td +(as )Tj +1.436 0 Td +(tr)Tj +0.599 0 Td +(ansactions, )Tj +5.327 0 Td +(threading, )Tj +4.882 0 Td +(exposure )Tj +4.437 0 Td +(of )Tj +1.381 0 Td +(REST )Tj +2.714 0 Td +(services)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.186 0 Td +(and )Tj +2.159 0 Td +(the )Tj +1.881 0 Td +(actual )Tj +3.159 0 Td +(implementation )Tj +7.327 0 Td +(of )Tj +1.381 0 Td +(the )Tj +-40.866 -1.44 Td +(business )Tj +3.927 0 Td +(logic. )Tj +2.704 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +0.87 0 Td +(an )Tj +1.37 0 Td +(approac)Tj +3.483 0 Td +(h )Tj +0.87 0 Td +(sa)Tj +0.859 0 Td +(v)Tj +0.488 0 Td +(es )Tj +1.203 0 Td +(some )Tj +2.592 0 Td +(code, )Tj +2.704 0 Td +(but )Tj +1.704 0 Td +(it )Tj +0.87 0 Td +(makes )Tj +3.036 0 Td +(the )Tj +1.648 0 Td +(business )Tj +3.927 0 Td +(logic )Tj +2.426 0 Td +(dependent )Tj +4.872 0 Td +(on )Tj +-41.088 -1.44 Td +(the )Tj +1.637 0 Td +(concrete )Tj +4.026 0 Td +(implementation )Tj +7.083 0 Td +(of )Tj +1.137 0 Td +(the )Tj +1.637 0 Td +(protocol )Tj +3.916 0 Td +(that )Tj +1.915 0 Td +(is )Tj +0.97 0 Td +(used )Tj +2.304 0 Td +(\(REST)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.998 0 Td +(in )Tj +1.137 0 Td +(this )Tj +1.804 0 Td +(case\))Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.72 0 Td +(so )Tj +1.248 0 Td +(the )Tj +1.637 0 Td +(business )Tj +3.916 0 Td +(logic )Tj +-40.088 -1.44 Td +(is unusable in another context. )Tj +ET + +endstream +endobj +159 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 160 0 R>>endobj +160 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(65)Tj +0 Tc 0 Tw -18.632 57.06 Td +(C)Tj +0.838 0 Td +(o)Tj +0.727 0 Td +(n)Tj +0.727 0 Td +(s)Tj +0.56 0 Td +(i)Tj +0.449 0 Td +(d)Tj +0.727 0 Td +(e)Tj +0.671 0 Td +(r )Tj +1.196 0 Td +(t)Tj +0.449 0 Td +(h)Tj +0.727 0 Td +(e )Tj +1.363 0 Td +(m)Tj +1.004 0 Td +(e)Tj +0.671 0 Td +(t)Tj +0.449 0 Td +(h)Tj +0.727 0 Td +(o)Tj +0.727 0 Td +(d )Tj +/TT1 1 Tf +1.419 0 Td +(u)Tj +0.771 0 Td +(p)Tj +0.771 0 Td +(d)Tj +0.771 0 Td +(a)Tj +0.771 0 Td +(t)Tj +0.771 0 Td +(e)Tj +0.771 0 Td +(S)Tj +0.771 0 Td +(t)Tj +0.771 0 Td +(a)Tj +0.771 0 Td +(t)Tj +0.771 0 Td +(i)Tj +0.771 0 Td +(s)Tj +0.771 0 Td +(t)Tj +0.771 0 Td +(i)Tj +0.771 0 Td +(c)Tj +0.771 0 Td +(s)Tj +/TT0 1 Tf +( )Tj +1.464 0 Td +(\()Tj +0.449 0 Td +(s)Tj +0.56 0 Td +(e)Tj +0.671 0 Td +(e )Tj +1.363 0 Td +(L)Tj +0.671 0 Td +(i)Tj +0.449 0 Td +(s)Tj +0.56 0 Td +(t)Tj +0.449 0 Td +(i)Tj +0.449 0 Td +(n)Tj +0.727 0 Td +(g )Tj +1.363 0 Td +(3)Tj +0.727 0 Td +(1)Tj +0.727 0 Td +(\))Tj +0.449 0 Td +(. )Tj +1.141 0 Td +(U)Tj +0.949 0 Td +(s)Tj +0.56 0 Td +(i)Tj +0.449 0 Td +(n)Tj +0.727 0 Td +(g)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(javax.ws.rs.core.Response)Tj +/TT0 1 Tf +( )Tj +15.46 0 Td +(as )Tj +1.347 0 Td +(a )Tj +0.958 0 Td +(return )Tj +3.014 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.292 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.736 0 Td +(make )Tj +2.791 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.958 0 Td +(sense )Tj +2.792 0 Td +(in )Tj +1.292 0 Td +(the )Tj +1.792 0 Td +(context )Tj +3.626 0 Td +(of )Tj +-41.366 -1.44 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(aServ)Tj +2.321 0 Td +(er F)Tj +1.556 0 Td +(aces \(JSF\), Servlets, or SO)Tj +10.854 0 Td +(AP)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( or ev)Tj +3.906 0 Td +(en in the context of other EJB beans. )Tj +/TT1 1 Tf +-19.849 -1.79 Td +( @PUT)Tj +0 -1.79 TD +( @Consumes\({MediaType.TEXT_PLAIN}\))Tj +T* +( public Response updateStatistics\(String url\) {)Tj +T* +( //\205)Tj +0 -1.79 TD +( return Response.noContent\(\).build\(\);)Tj +0 -1.79 TD +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 31: )Tj +4.688 0 Td +(An Example of a Method Dependent on J)Tj +17.657 0 Td +(AX-RS)Tj +-20.545 -2.24 Td +(J)Tj +0.26 0 Td +(AX-RS injection of, for example, )Tj +/TT1 1 Tf +(UriInfo)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( is ev)Tj +20.778 0 Td +(en more destructi)Tj +7.484 0 Td +(v)Tj +0.488 0 Td +(e:)Tj +/TT1 1 Tf +-30.81 -1.79 Td +(import javax.ws.rs.core.UriInfo;)Tj +0 -1.79 TD +(import javax.ws.rs.core.Context;)Tj +0 -1.79 TD +(@Context UriInfo info;)Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.402 0 Td +(injection )Tj +4.126 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.292 0 Td +(w)Tj +0.766 0 Td +(ork )Tj +1.735 0 Td +(only )Tj +2.236 0 Td +(in )Tj +1.18 0 Td +(the )Tj +1.68 0 Td +(case )Tj +2.235 0 Td +(of )Tj +1.18 0 Td +(a )Tj +0.846 0 Td +(REST )Tj +2.513 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation. )Tj +3.811 0 Td +(An)Tj +1.205 0 Td +(y )Tj +0.846 0 Td +(use )Tj +1.791 0 Td +(in )Tj +1.18 0 Td +(another )Tj +3.625 0 Td +(context )Tj +-39.032 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.589 0 Td +(lead )Tj +2.477 0 Td +(to )Tj +/TT1 1 Tf +1.477 0 Td +(NullPointerException)Tj +/TT0 1 Tf +( )Tj +12.645 0 Td +(caused )Tj +3.644 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.143 0 Td +(a )Tj +1.143 0 Td +(not)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(injected )Tj +/TT1 1 Tf +5.812 0 Td +(@Context )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 436.9931 361.7 Tm +(UriInfo )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 347.3 Tm +(info.)Tj +/TT0 1 Tf +( )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.608 0 Td +(separ)Tj +2.266 0 Td +(ation )Tj +2.72 0 Td +(of )Tj +1.386 0 Td +(REST )Tj +2.719 0 Td +(and )Tj +2.164 0 Td +(business )Tj +4.165 0 Td +(logic )Tj +2.664 0 Td +(with )Tj +2.442 0 Td +(the )Tj +1.886 0 Td +(introduction )Tj +5.833 0 Td +(of )Tj +1.386 0 Td +(Resour)Tj +2.933 0 Td +(ce )Tj +1.552 0 Td +(classes )Tj +3.497 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(str)Tj +0.988 0 Td +(aightforw)Tj +4.039 0 Td +(ard. )Tj +1.951 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.488 0 Td +(only )Tj +2.266 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.876 0 Td +(to )Tj +1.21 0 Td +(introduce )Tj +4.489 0 Td +(the )Tj +1.71 0 Td +(new )Tj +2.21 0 Td +(boundaries )Tj +5.156 0 Td +(\(or )Tj +1.543 0 Td +(resour)Tj +2.655 0 Td +(ces\) )Tj +2.043 0 Td +(as )Tj +1.265 0 Td +(EJB )Tj +1.765 0 Td +(3.1 )Tj +1.766 0 Td +(beans. )Tj +-39.421 -1.44 Td +(W)Tj +0.982 0 Td +(ithout )Tj +/C2_0 1 Tf +3.167 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(guring )Tj +5.556 0 Td +(an)Tj +1.038 0 Td +(ything, )Tj +3.611 0 Td +(the )Tj +/C2_0 1 Tf +1.999 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +2.221 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(er )Tj +1.498 0 Td +(will )Tj +2.277 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.554 0 Td +(start )Tj +2.443 0 Td +(the )Tj +1.999 0 Td +(tr)Tj +0.599 0 Td +(ansaction, )Tj +5.056 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.221 0 Td +(gets)Tj +( )Tj +-40.533 -1.44 Td +(tr)Tj +0.599 0 Td +(ansparently propagated to all in)Tj +13.605 0 Td +(v)Tj +0.482 0 Td +(oked participants)Tj +/TT2 1 Tf +(.)Tj +/TT3 1 Tf +12 0 0 12 57 246.5 Tm +(EJB and POJO Injection)Tj +/TT0 1 Tf +10 0 0 10 75 224.1 Tm +(T)Tj +0.474 0 Td +(w)Tj +0.776 0 Td +(o )Tj +1.339 0 Td +(d)Tj +0.566 0 Td +(e)Tj +0.51 0 Td +(p)Tj +0.566 0 Td +(e)Tj +0.51 0 Td +(n)Tj +0.566 0 Td +(d)Tj +0.566 0 Td +(e)Tj +0.51 0 Td +(n)Tj +0.566 0 Td +(t )Tj +1.061 0 Td +(c)Tj +0.51 0 Td +(l)Tj +0.288 0 Td +(a)Tj +0.51 0 Td +(s)Tj +0.399 0 Td +(s)Tj +0.399 0 Td +(e)Tj +0.51 0 Td +(s )Tj +1.172 0 Td +(a)Tj +0.51 0 Td +(r)Tj +0.343 0 Td +(e )Tj +1.283 0 Td +(i)Tj +0.288 0 Td +(n)Tj +0.566 0 Td +(j)Tj +0.288 0 Td +(e)Tj +0.51 0 Td +(c)Tj +0.51 0 Td +(t)Tj +0.288 0 Td +(e)Tj +0.51 0 Td +(d )Tj +1.339 0 Td +(i)Tj +0.288 0 Td +(n)Tj +0.566 0 Td +(t)Tj +0.288 0 Td +(o )Tj +1.339 0 Td +(t)Tj +0.288 0 Td +(h)Tj +0.566 0 Td +(e )Tj +/TT1 1 Tf +1.283 0 Td +(H)Tj +0.61 0 Td +(i)Tj +0.61 0 Td +(t)Tj +0.61 0 Td +(s)Tj +0.61 0 Td +(R)Tj +0.61 0 Td +(e)Tj +0.61 0 Td +(s)Tj +0.61 0 Td +(o)Tj +0.61 0 Td +(u)Tj +0.61 0 Td +(r)Tj +0.61 0 Td +(c)Tj +0.61 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.383 0 Td +(b)Tj +0.566 0 Td +(o)Tj +0.566 0 Td +(u)Tj +0.566 0 Td +(n)Tj +0.566 0 Td +(d)Tj +0.566 0 Td +(a)Tj +0.51 0 Td +(r)Tj +0.343 0 Td +(y)Tj +0.51 0 Td +(\227)Tj +1.01 0 Td +(t)Tj +0.288 0 Td +(h)Tj +0.566 0 Td +(e )Tj +1.283 0 Td +(c)Tj +0.51 0 Td +(l)Tj +0.288 0 Td +(a)Tj +0.51 0 Td +(s)Tj +0.399 0 Td +(s)Tj +( )Tj +/TT1 1 Tf +-41.811 -1.44 Td +(URLPathExtractor)Tj +/TT0 1 Tf +( and the EJB 3.1 bean )Tj +/TT1 1 Tf +(Hits)Tj +/TT0 1 Tf +(. )Tj +/TT1 1 Tf +1.8 -2.24 Td +(URLPathExtractor)Tj +/TT0 1 Tf +( )Tj +9.883 0 Td +(is )Tj +0.949 0 Td +(just )Tj +1.783 0 Td +(a )Tj +0.782 0 Td +(utility )Tj +2.728 0 Td +(class )Tj +2.338 0 Td +(without )Tj +3.562 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.782 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.782 0 Td +(on )Tj +1.394 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.782 0 Td +(EE )Tj +1.282 0 Td +(6. )Tj +1.116 0 Td +(It )Tj +0.838 0 Td +(is )Tj +0.949 0 Td +(injected)Tj +( )Tj +-38.754 -1.44 Td +(with the )Tj +/TT1 1 Tf +(@Inject)Tj +/TT0 1 Tf +( annotation. )Tj +13.355 0 Td +(T)Tj +0.511 0 Td +(he only requirement is the existence of a default constructor)Tj +25.714 0 Td +(. )Tj +-37.78 -2.24 Td +(I )Tj +0.72 0 Td +(factored )Tj +3.943 0 Td +(out )Tj +/TT1 1 Tf +1.832 0 Td +(URLPathExtractor)Tj +/TT0 1 Tf +( )Tj +10.044 0 Td +(from )Tj +/TT1 1 Tf +2.442 0 Td +(HitsResource)Tj +/TT0 1 Tf +( )Tj +7.644 0 Td +(to )Tj +1.276 0 Td +(mitigate )Tj +3.887 0 Td +(the )Tj +1.776 0 Td +(complexity )Tj +5.221 0 Td +(and )Tj +-40.588 -1.44 Td +(increase )Tj +3.892 0 Td +(testability)Tj +4.021 0 Td +(. )Tj +0.614 0 Td +(I )Tj +0.614 0 Td +(did )Tj +1.726 0 Td +(this )Tj +1.837 0 Td +(after )Tj +2.225 0 Td +(few )Tj +1.892 0 Td +(iter)Tj +1.377 0 Td +(ations. )Tj +3.171 0 Td +(Designing )Tj +4.671 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.836 0 Td +(EE )Tj +1.336 0 Td +(applications )Tj +5.561 0 Td +(is )Tj +1.003 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.669 0 Td +(similar )Tj +3.225 0 Td +(to )Tj +-41.366 -1.44 Td +(plain )Tj +2.612 0 Td +(old, )Tj +2.112 0 Td +(but )Tj +1.834 0 Td +(pr)Tj +0.877 0 Td +(agmatic, )Tj +4.111 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.944 0 Td +(Platform, )Tj +4.334 0 Td +(Standard )Tj +4.223 0 Td +(Edition )Tj +3.446 0 Td +(\(J)Tj +0.544 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.944 0 Td +(SE\) )Tj +1.722 0 Td +(design. )Tj +3.501 0 Td +(Introduction )Tj +5.725 0 Td +(of )Tj +1.278 0 Td +(new )Tj +-40.366 -1.44 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(ers )Tj +1.554 0 Td +(happens )Tj +3.945 0 Td +(on )Tj +1.444 0 Td +(demand )Tj +3.833 0 Td +(in )Tj +1.166 0 Td +(a )Tj +0.832 0 Td +(bottom-up )Tj +4.834 0 Td +(fashion. )Tj +3.649 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.221 0 Td +(is )Tj +0.999 0 Td +(no )Tj +1.444 0 Td +(need )Tj +2.444 0 Td +(for )Tj +1.499 0 Td +(a )Tj +0.832 0 Td +(top-do)Tj +2.823 0 Td +(wn )Tj +1.666 0 Td +(introduction )Tj +-36.919 -1.44 Td +(of )Tj +1.313 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitectur)Tj +3.267 0 Td +(al )Tj +1.257 0 Td +(artifacts. )Tj +4.017 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.535 0 Td +(old )Tj +1.869 0 Td +(\223di)Tj +1.26 0 Td +(vide )Tj +2.313 0 Td +(and )Tj +2.091 0 Td +(conquer\224 )Tj +4.48 0 Td +(algorithm )Tj +4.591 0 Td +(\()Tj +(http://en.wikipedia.org/wiki/)Tj +-29.805 -1.44 Td +(Di)Tj +1.038 0 Td +(vide_and_conquer_algorithm)Tj +(\) )Tj +13.495 0 Td +(can )Tj +2.158 0 Td +(be )Tj +1.658 0 Td +(applied )Tj +3.826 0 Td +(for )Tj +1.769 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.102 0 Td +(EE )Tj +1.602 0 Td +(6 )Tj +1.158 0 Td +(as )Tj +1.491 0 Td +(well. )Tj +2.714 0 Td +(Ov)Tj +1.321 0 Td +(erly )Tj +2.213 0 Td +(bloated )Tj +3.826 0 Td +(and )Tj +ET + +endstream +endobj +161 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 163 0 R>>endobj +162 0 obj<>endobj +163 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(66)Tj +0 Tc 0 Tw -20.432 57.06 Td +(complex )Tj +4.086 0 Td +(classes )Tj +3.308 0 Td +(are )Tj +1.696 0 Td +(di)Tj +0.816 0 Td +(vided )Tj +2.753 0 Td +(into )Tj +2.031 0 Td +(cohesi)Tj +2.761 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.863 0 Td +(and )Tj +1.975 0 Td +(easier)Tj +2.445 0 Td +(-to-understand )Tj +6.643 0 Td +(pieces )Tj +3.086 0 Td +(after )Tj +2.252 0 Td +(a )Tj +0.863 0 Td +(few )Tj +1.919 0 Td +(iter)Tj +1.377 0 Td +(ations.)Tj +( )Tj +-39.365 -1.44 Td +(No )Tj +1.731 0 Td +(upfront )Tj +3.51 0 Td +(design )Tj +3.176 0 Td +(is )Tj +1.064 0 Td +(needed, )Tj +3.843 0 Td +(because )Tj +3.898 0 Td +(no )Tj +1.509 0 Td +(upfront )Tj +3.51 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +3.342 0 Td +(exists)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +( )Tj +2.981 0 Td +(F)Tj +0.463 0 Td +(rom )Tj +2.119 0 Td +(the )Tj +1.731 0 Td +(design )Tj +3.176 0 Td +(perspecti)Tj +3.872 0 Td +(v)Tj +0.488 0 Td +(e)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-41.45 -1.44 Td +(there is absolutely no difference between POJOs, EJB beans, managed bean\ s)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( or JP)Tj +35.319 0 Td +(A entities.)Tj +-33.519 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT2 1 Tf +1.527 0 Td +(URLPathExtractor)Tj +/TT0 1 Tf +( )Tj +10.072 0 Td +(is )Tj +1.138 0 Td +(injected )Tj +3.917 0 Td +(with )Tj +/TT2 1 Tf +2.361 0 Td +(@Inject)Tj +/TT0 1 Tf +(, )Tj +4.949 0 Td +(and )Tj +2.083 0 Td +(the )Tj +/TT2 1 Tf +1.805 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.871 0 Td +(boundary )Tj +4.584 0 Td +(is )Tj +1.138 0 Td +(injected )Tj +-38.754 -1.44 Td +(with )Tj +2.405 0 Td +(the )Tj +/TT2 1 Tf +1.849 0 Td +(@EJB)Tj +/TT0 1 Tf +( )Tj +2.916 0 Td +(annotation. )Tj +5.333 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.738 0 Td +(distinction )Tj +5.018 0 Td +(is )Tj +1.182 0 Td +(not )Tj +1.905 0 Td +(necessary)Tj +4.075 0 Td +(. )Tj +0.701 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.627 0 Td +(could )Tj +2.961 0 Td +(also )Tj +2.238 0 Td +(inject )Tj +2.905 0 Td +(both )Tj +2.461 0 Td +(with )Tj +/TT2 1 Tf +-40.31 -1.44 Td +(@Inject)Tj +/TT0 1 Tf +(. )Tj +4.801 0 Td +(If )Tj +0.879 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.435 0 Td +(do )Tj +1.435 0 Td +(so, )Tj +1.546 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.435 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.823 0 Td +(to )Tj +1.157 0 Td +(keep )Tj +2.379 0 Td +(in )Tj +1.157 0 Td +(mind )Tj +2.546 0 Td +(that )Tj +/TT2 1 Tf +1.935 0 Td +(@Inject)Tj +/TT0 1 Tf +( )Tj +4.523 0 Td +(injection )Tj +4.103 0 Td +(is )Tj +0.99 0 Td +(more )Tj +2.545 0 Td +(po)Tj +1.1 0 Td +(werful )Tj +3.046 0 Td +(than )Tj +-40.31 -1.44 Td +(EJB )Tj +1.699 0 Td +(beans. )Tj +3.015 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.366 0 Td +(support )Tj +3.534 0 Td +(for )Tj +1.477 0 Td +(inheritance )Tj +5.145 0 Td +(is )Tj +0.977 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.643 0 Td +(poor )Tj +2.311 0 Td +(in )Tj +1.144 0 Td +(EJB)Tj +1.365 0 Td +(, )Tj +0.588 0 Td +(but )Tj +1.7 0 Td +(it )Tj +0.866 0 Td +(is )Tj +0.977 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.643 0 Td +(po)Tj +1.1 0 Td +(werful )Tj +3.033 0 Td +(in )Tj +1.144 0 Td +(CDI )Tj +2.033 0 Td +(managed )Tj +-38.255 -1.44 Td +(beans. )Tj +3.279 0 Td +(T)Tj +0.482 0 Td +(rying )Tj +2.741 0 Td +(to )Tj +1.408 0 Td +(inject )Tj +2.964 0 Td +(polymorphic )Tj +6.076 0 Td +(EJB )Tj +1.963 0 Td +(beans )Tj +3.075 0 Td +(with )Tj +/TT2 1 Tf +2.464 0 Td +(@Inject)Tj +/TT0 1 Tf +( )Tj +4.775 0 Td +(could )Tj +3.02 0 Td +(lead )Tj +2.408 0 Td +(to )Tj +1.408 0 Td +(nasty )Tj +2.797 0 Td +(runtime )Tj +-38.866 -1.44 Td +(problems.)Tj +/TT3 1 Tf +12 0 0 12 57 469.9999 Tm +(Ev)Tj +0.988 0 Td +(entual Consistenc)Tj +7.701 0 Td +(y with Singletons)Tj +/TT0 1 Tf +10 0 0 10 75 447.5999 Tm +(Ev)Tj +0.988 0 Td +(ery )Tj +1.924 0 Td +(clic)Tj +1.538 0 Td +(k )Tj +1.091 0 Td +(is )Tj +1.258 0 Td +(forw)Tj +1.927 0 Td +(arded )Tj +3.036 0 Td +(to )Tj +1.425 0 Td +(the )Tj +1.925 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.703 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.091 0 Td +(an )Tj +1.647 0 Td +(HTTP )Tj +/C2_0 1 Tf +3.037 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.536 0 Td +(and )Tj +2.203 0 Td +(forw)Tj +1.927 0 Td +(arded )Tj +3.036 0 Td +(to )Tj +/TT2 1 Tf +1.425 0 Td +(x-ray-)Tj +-38.599 -1.44 Td +(services)Tj +/TT0 1 Tf +( )Tj +5.112 0 Td +(via )Tj +1.589 0 Td +(HTTP )Tj +2.757 0 Td +(PUT)Tj +1.779 0 Td +(. )Tj +0.589 0 Td +(But )Tj +1.756 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.089 0 Td +(do )Tj +1.423 0 Td +(we )Tj +1.589 0 Td +(persist )Tj +3.034 0 Td +(and )Tj +1.923 0 Td +(compute )Tj +4.09 0 Td +(the )Tj +1.645 0 Td +(statistics? )Tj +4.22 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.811 0 Td +(are )Tj +1.644 0 Td +(actually )Tj +3.701 0 Td +(not )Tj +-40.81 -1.44 Td +(interested )Tj +4.501 0 Td +(in )Tj +1.167 0 Td +(tr)Tj +0.599 0 Td +(ac)Tj +0.982 0 Td +(king )Tj +2.167 0 Td +(user )Tj +2.111 0 Td +(beha)Tj +2.082 0 Td +(vior; )Tj +2.278 0 Td +(r)Tj +0.321 0 Td +(ather )Tj +2.5 0 Td +(we )Tj +1.611 0 Td +(are )Tj +1.666 0 Td +(interested )Tj +4.501 0 Td +(in )Tj +1.167 0 Td +(the )Tj +1.667 0 Td +(popularity )Tj +4.724 0 Td +(of )Tj +1.167 0 Td +(posts. )Tj +2.742 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.833 0 Td +(could)Tj +( )Tj +-39.754 -1.44 Td +(insert )Tj +2.742 0 Td +(new )Tj +2.242 0 Td +(URIs )Tj +2.464 0 Td +(into )Tj +2.076 0 Td +(the )Tj +1.742 0 Td +(database )Tj +4.187 0 Td +(and )Tj +2.02 0 Td +(update )Tj +3.354 0 Td +(the )Tj +1.742 0 Td +(statistics )Tj +3.965 0 Td +(for )Tj +1.575 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.908 0 Td +(existing )Tj +3.687 0 Td +(URIs. )Tj +2.742 0 Td +(On )Tj +1.797 0 Td +(ev)Tj +0.988 0 Td +(ery)Tj +( )Tj +-40.867 -1.44 Td +(clic)Tj +1.538 0 Td +(k, )Tj +1.187 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.521 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.355 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.909 0 Td +(to )Tj +1.243 0 Td +(perform )Tj +3.798 0 Td +(an )Tj +1.465 0 Td +(insert )Tj +2.743 0 Td +(or )Tj +1.298 0 Td +(database )Tj +4.188 0 Td +(update. )Tj +3.559 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.465 0 Td +(database )Tj +4.188 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.355 0 Td +(become )Tj +3.854 0 Td +(a )Tj +-41.7 -1.44 Td +(potential )Tj +4.21 0 Td +(bottlenec)Tj +3.984 0 Td +(k, )Tj +1.208 0 Td +(and )Tj +2.042 0 Td +(we )Tj +1.708 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.376 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.93 0 Td +(to )Tj +1.264 0 Td +(deal )Tj +2.264 0 Td +(with )Tj +2.32 0 Td +(it )Tj +0.986 0 Td +(from )Tj +2.43 0 Td +(the )Tj +1.764 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +/C2_0 1 Tf +1.763 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.986 0 Td +(increment. )Tj +5.042 0 Td +(On )Tj +1.819 0 Td +(the )Tj +-40.866 -1.44 Td +(other )Tj +2.53 0 Td +(hand, )Tj +2.753 0 Td +(a )Tj +0.807 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.084 0 Td +(database )Tj +4.085 0 Td +(as )Tj +1.195 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.084 0 Td +(data )Tj +2.141 0 Td +(store )Tj +2.362 0 Td +(is )Tj +0.974 0 Td +(the )Tj +1.641 0 Td +(most )Tj +2.362 0 Td +(consistent )Tj +4.586 0 Td +(approac)Tj +3.483 0 Td +(h. )Tj +1.066 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.362 0 Td +(system )Tj +3.196 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.175 0 Td +(in )Tj +1.12 0 Td +(a )Tj +0.786 0 Td +(consistent )Tj +4.566 0 Td +(state )Tj +2.231 0 Td +(at )Tj +1.064 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.619 0 Td +(point )Tj +2.51 0 Td +(in )Tj +1.12 0 Td +(time. )Tj +2.453 0 Td +(So, )Tj +1.62 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.064 0 Td +(do )Tj +1.398 0 Td +(we )Tj +1.564 0 Td +(decide )Tj +3.176 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.62 0 Td +(consistenc)Tj +4.478 0 Td +(y )Tj +0.786 0 Td +(lev)Tj +1.266 0 Td +(el )Tj +1.064 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(actually needed? )Tj +7.429 0 Td +(T)Tj +0.511 0 Td +(he ans)Tj +2.767 0 Td +(wer is easy)Tj +4.631 0 Td +(. )Tj +0.519 0 Td +(A dev)Tj +2.489 0 Td +(eloper cannot just decide that; it is a business decision.)Tj +-16.546 -2.24 Td +(In )Tj +1.118 0 Td +(the )Tj +1.618 0 Td +(role )Tj +1.951 0 Td +(of )Tj +1.118 0 Td +(domain )Tj +3.563 0 Td +(expert, )Tj +3.229 0 Td +(I\222m )Tj +1.673 0 Td +(really )Tj +2.673 0 Td +(interested )Tj +4.452 0 Td +(in )Tj +1.118 0 Td +(the )Tj +1.618 0 Td +(popularity )Tj +4.675 0 Td +(of )Tj +1.118 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.84 0 Td +(post. )Tj +2.304 0 Td +(At )Tj +1.229 0 Td +(the )Tj +1.618 0 Td +(time )Tj +2.173 0 Td +(of )Tj +-41.366 -1.44 Td +(this )Tj +1.919 0 Td +(writing, )Tj +3.697 0 Td +(there )Tj +2.585 0 Td +(are )Tj +1.751 0 Td +(about )Tj +2.864 0 Td +(one )Tj +2.03 0 Td +(thousand )Tj +4.365 0 Td +(posts. )Tj +2.864 0 Td +(It )Tj +0.974 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.364 0 Td +(be )Tj +1.474 0 Td +(interesting )Tj +4.864 0 Td +(to )Tj +1.252 0 Td +(kno)Tj +1.6 0 Td +(w )Tj +1.196 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.196 0 Td +(popular )Tj +-38.865 -1.44 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.998 0 Td +(one )Tj +2.054 0 Td +(is. )Tj +1.387 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +0.998 0 Td +(statistics )Tj +3.999 0 Td +(don\222)Tj +1.909 0 Td +(t )Tj +0.72 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.942 0 Td +(to )Tj +1.276 0 Td +(be )Tj +1.498 0 Td +(consistent )Tj +4.722 0 Td +(in )Tj +1.276 0 Td +(real )Tj +2.053 0 Td +(time. )Tj +2.572 0 Td +(A )Tj +1.109 0 Td +(daily )Tj +2.554 0 Td +(update )Tj +3.388 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.388 0 Td +(be )Tj +ET +BT +/C2_0 1 Tf +10 0 0 10 57 266.8 Tm +<004B004D003E005D>Tj +/TT0 1 Tf +(cient. )Tj +4.555 0 Td +(Before )Tj +3.164 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.664 0 Td +(I )Tj +0.664 0 Td +(used )Tj +2.387 0 Td +(weekly )Tj +3.405 0 Td +(W)Tj +0.963 0 Td +(ebalizer )Tj +3.831 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.mrunix.net/webalizer/)Tj +(\) )Tj +10.389 0 Td +(runs )Tj +2.22 0 Td +(for )Tj +1.553 0 Td +(the )Tj +-40.866 -1.44 Td +(computation )Tj +5.989 0 Td +(and )Tj +2.154 0 Td +(published )Tj +4.767 0 Td +(the )Tj +1.876 0 Td +(statistics )Tj +4.099 0 Td +(monthly)Tj +3.465 0 Td +(. )Tj +0.783 0 Td +(A )Tj +1.209 0 Td +(daily )Tj +2.654 0 Td +(statistic )Tj +3.71 0 Td +(update )Tj +3.488 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.488 0 Td +(be )Tj +1.598 0 Td +(a )Tj +1.042 0 Td +(huge)Tj +( )Tj +-40.088 -1.44 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(ement compared to the previous situation.)Tj +-1.232 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.405 0 Td +(next )Tj +2.184 0 Td +(interesting )Tj +4.795 0 Td +(statistic )Tj +3.518 0 Td +(is )Tj +1.016 0 Td +(currently )Tj +4.184 0 Td +(trending )Tj +3.907 0 Td +(topics. )Tj +3.184 0 Td +(It )Tj +0.905 0 Td +(is )Tj +1.016 0 Td +(interesting )Tj +4.795 0 Td +(to )Tj +1.183 0 Td +(see )Tj +1.738 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.683 0 Td +(happens )Tj +-38.587 -1.44 Td +(in )Tj +1.258 0 Td +(real )Tj +2.035 0 Td +(time, )Tj +2.591 0 Td +(but )Tj +1.814 0 Td +(these )Tj +2.647 0 Td +(results )Tj +3.147 0 Td +(don\222)Tj +1.909 0 Td +(t )Tj +0.702 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.924 0 Td +(to )Tj +1.258 0 Td +(be )Tj +1.48 0 Td +(stored )Tj +3.036 0 Td +(persistently)Tj +4.743 0 Td +(. )Tj +0.628 0 Td +(T)Tj +0.511 0 Td +(hey )Tj +1.98 0 Td +(could )Tj +2.87 0 Td +(get )Tj +1.702 0 Td +(lost )Tj +1.925 0 Td +(at )Tj +1.202 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +-40.867 -1.44 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.392 0 Td +(restart )Tj +3.17 0 Td +(or )Tj +1.448 0 Td +(cr)Tj +0.821 0 Td +(ash. )Tj +2.282 0 Td +(P)Tj +0.511 0 Td +(ersisting )Tj +4.06 0 Td +(the )Tj +1.893 0 Td +(current )Tj +3.615 0 Td +(trend )Tj +2.782 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.505 0 Td +(be )Tj +1.615 0 Td +(a )Tj +1.059 0 Td +(nice, )Tj +2.671 0 Td +(but )Tj +1.949 0 Td +(not )Tj +1.949 0 Td +(an )Tj +1.615 0 Td +(absolutely)Tj +( )Tj +-37.809 -1.44 Td +(necessary)Tj +4.075 0 Td +(, )Tj +0.84 0 Td +(feature. )Tj +3.785 0 Td +(Furthermore, )Tj +6.118 0 Td +(it )Tj +1.118 0 Td +(turns )Tj +2.674 0 Td +(out )Tj +1.952 0 Td +(that )Tj +2.174 0 Td +(so )Tj +1.507 0 Td +(far)Tj +1.037 0 Td +(, )Tj +0.84 0 Td +(the )Tj +1.896 0 Td +(Linux, )Tj +3.23 0 Td +(JDK )Tj +2.229 0 Td +(1.6, )Tj +2.23 0 Td +(GlassF)Tj +2.816 0 Td +(ish, )Tj +2.063 0 Td +(and)Tj +( )Tj +-40.588 -1.44 Td +(Hypersonic )Tj +5.407 0 Td +(database )Tj +4.24 0 Td +(\(HSQLDB\) )Tj +5.017 0 Td +(\()Tj +(http://hsqldb.org)Tj +(\) )Tj +8.077 0 Td +(combination )Tj +5.908 0 Td +(is )Tj +1.128 0 Td +(extremely )Tj +4.683 0 Td +(stable. )Tj +3.166 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.517 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +-41.367 -1.44 Td +(has )Tj +1.894 0 Td +(nev)Tj +1.544 0 Td +(er )Tj +1.282 0 Td +(cr)Tj +0.821 0 Td +(ashed )Tj +2.95 0 Td +(thus )Tj +2.228 0 Td +(far)Tj +1.037 0 Td +(. )Tj +0.727 0 Td +(It )Tj +1.005 0 Td +(r)Tj +0.321 0 Td +(an )Tj +1.505 0 Td +(for )Tj +1.616 0 Td +(months, )Tj +3.895 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.505 0 Td +(y)Tj +0.482 0 Td +(ears. )Tj +2.449 0 Td +(I )Tj +0.727 0 Td +(restarted )Tj +4.116 0 Td +(it )Tj +1.005 0 Td +(only )Tj +2.339 0 Td +(for )Tj +1.616 0 Td +(updates. )Tj +4.062 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +-41.644 -1.44 Td +(c)Tj +0.501 0 Td +(o)Tj +0.557 0 Td +(n)Tj +0.557 0 Td +(s)Tj +0.39 0 Td +(i)Tj +0.279 0 Td +(d)Tj +0.557 0 Td +(e)Tj +0.501 0 Td +(r)Tj +0.322 0 Td +(a)Tj +0.501 0 Td +(t)Tj +0.279 0 Td +(i)Tj +0.279 0 Td +(o)Tj +0.557 0 Td +(n)Tj +0.557 0 Td +(s )Tj +1.167 0 Td +(a)Tj +0.501 0 Td +(r)Tj +0.334 0 Td +(e )Tj +1.278 0 Td +(a)Tj +0.501 0 Td +(l)Tj +0.279 0 Td +(s)Tj +0.39 0 Td +(o )Tj +1.334 0 Td +(v)Tj +0.477 0 Td +(a)Tj +0.501 0 Td +(l)Tj +0.279 0 Td +(u)Tj +0.557 0 Td +(a)Tj +0.501 0 Td +(b)Tj +0.557 0 Td +(l)Tj +0.279 0 Td +(e )Tj +1.278 0 Td +(i)Tj +0.279 0 Td +(n )Tj +1.334 0 Td +(c)Tj +0.501 0 Td +(o)Tj +0.557 0 Td +(m)Tj +0.834 0 Td +(m)Tj +0.834 0 Td +(e)Tj +0.501 0 Td +(r)Tj +0.322 0 Td +(c)Tj +0.501 0 Td +(i)Tj +0.279 0 Td +(a)Tj +0.501 0 Td +(l )Tj +1.056 0 Td +(p)Tj +0.557 0 Td +(r)Tj +0.334 0 Td +(o)Tj +0.557 0 Td +(j)Tj +0.279 0 Td +(e)Tj +0.501 0 Td +(c)Tj +0.501 0 Td +(t)Tj +0.279 0 Td +(s)Tj +0.39 0 Td +(. )Tj +1.056 0 Td +(H)Tj +0.779 0 Td +(i)Tj +0.279 0 Td +(g)Tj +0.501 0 Td +(h )Tj +1.334 0 Td +(a)Tj +0.471 0 Td +(v)Tj +0.477 0 Td +(a)Tj +0.501 0 Td +(i)Tj +0.279 0 Td +(l)Tj +0.279 0 Td +(a)Tj +0.501 0 Td +(b)Tj +0.557 0 Td +(i)Tj +0.279 0 Td +(l)Tj +0.279 0 Td +(i)Tj +0.279 0 Td +(t)Tj +0.279 0 Td +(y )Tj +1.278 0 Td +(a)Tj +0.501 0 Td +(n)Tj +0.557 0 Td +(d )Tj +1.334 0 Td +(e)Tj +0.501 0 Td +(x)Tj +0.501 0 Td +(t)Tj +0.279 0 Td +(r)Tj +0.334 0 Td +(e)Tj +0.501 0 Td +(m)Tj +0.834 0 Td +(e )Tj +-41.7 -1.44 Td +(consistenc)Tj +4.478 0 Td +(y )Tj +1.003 0 Td +(are )Tj +1.836 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(err)Tj +1.154 0 Td +(ated )Tj +2.337 0 Td +(in )Tj +1.337 0 Td +(the )Tj +1.837 0 Td +(real )Tj +2.114 0 Td +(w)Tj +0.766 0 Td +(orld. )Tj +2.504 0 Td +(Clients )Tj +3.449 0 Td +(prescribe )Tj +4.448 0 Td +(24/7 )Tj +2.449 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.227 0 Td +(for )Tj +1.67 0 Td +(noncritical )Tj +-37.587 -1.44 Td +(softw)Tj +2.261 0 Td +(are without ev)Tj +6.157 0 Td +(en thinking about the consequences. )Tj +-6.618 -2.24 Td +(It )Tj +0.936 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.326 0 Td +(also )Tj +2.103 0 Td +(be )Tj +1.436 0 Td +(nice )Tj +2.214 0 Td +(to )Tj +1.214 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.88 0 Td +(the )Tj +1.714 0 Td +(total )Tj +2.27 0 Td +(number )Tj +3.714 0 Td +(of )Tj +1.214 0 Td +(daily )Tj +2.492 0 Td +(hits )Tj +1.881 0 Td +(and )Tj +1.992 0 Td +(hits )Tj +1.881 0 Td +(from )Tj +2.38 0 Td +(the )Tj +1.714 0 Td +(previous )Tj +4.048 0 Td +(da)Tj +1.026 0 Td +(y)Tj +0.408 0 Td +(. )Tj +ET + +endstream +endobj +164 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 165 0 R>>endobj +165 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(67)Tj +0 Tc 0 Tw -20.432 57.06 Td +(T)Tj +0.511 0 Td +(his )Tj +1.536 0 Td +(statistic )Tj +3.481 0 Td +(also )Tj +2.036 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.591 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.813 0 Td +(to )Tj +1.147 0 Td +(be )Tj +1.369 0 Td +(persistent. )Tj +4.648 0 Td +(Upon )Tj +2.759 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.146 0 Td +(cr)Tj +0.821 0 Td +(ash )Tj +1.758 0 Td +(or )Tj +1.202 0 Td +(restart, )Tj +3.202 0 Td +(the )Tj +1.647 0 Td +(daily )Tj +2.425 0 Td +(hits )Tj +1.814 0 Td +(counter )Tj +-38.921 -1.44 Td +(could just be reset. )Tj +1.8 -2.24 Td +(Bey)Tj +1.593 0 Td +(ond )Tj +2.093 0 Td +(that, )Tj +2.315 0 Td +(I )Tj +0.703 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.371 0 Td +(be )Tj +1.481 0 Td +(also )Tj +2.148 0 Td +(interested )Tj +4.593 0 Td +(in )Tj +1.259 0 Td +(the )Tj +1.759 0 Td +(referers )Tj +3.591 0 Td +(statistics, )Tj +4.26 0 Td +(especially )Tj +4.704 0 Td +(the )Tj +1.759 0 Td +(information )Tj +-37.198 -1.44 Td +(about )Tj +2.898 0 Td +(w)Tj +0.76 0 Td +(ho )Tj +1.564 0 Td +(\(for )Tj +1.897 0 Td +(example, )Tj +4.397 0 Td +(the )Tj +1.786 0 Td +(user )Tj +2.23 0 Td +(agent\) )Tj +3.064 0 Td +(visits )Tj +2.564 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.952 0 Td +(blog )Tj +2.342 0 Td +(and )Tj +2.064 0 Td +(from )Tj +2.452 0 Td +(w)Tj +0.76 0 Td +(here )Tj +2.341 0 Td +(\(referer\) )Tj +3.785 0 Td +(the )Tj +1.786 0 Td +(visitor )Tj +3.064 0 Td +(is )Tj +-41.533 -1.44 Td +(coming. )Tj +3.854 0 Td +(Sometimes, )Tj +5.298 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.853 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.186 0 Td +(has )Tj +1.798 0 Td +(to )Tj +1.187 0 Td +(handle )Tj +3.299 0 Td +(serious )Tj +3.354 0 Td +(load )Tj +2.243 0 Td +(peaks, )Tj +3.076 0 Td +(and )Tj +1.965 0 Td +(it )Tj +0.909 0 Td +(hard )Tj +2.298 0 Td +(to )Tj +1.187 0 Td +(sa)Tj +0.859 0 Td +(y )Tj +0.853 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.687 0 Td +(caused )Tj +-39.199 -1.44 Td +(the )Tj +1.665 0 Td +(load. )Tj +2.462 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.443 0 Td +(the )Tj +1.665 0 Td +(extr)Tj +1.599 0 Td +(action )Tj +2.999 0 Td +(and )Tj +1.943 0 Td +(computation )Tj +5.778 0 Td +(of )Tj +1.165 0 Td +(referer )Tj +3.108 0 Td +(statistics, )Tj +4.166 0 Td +(I )Tj +0.609 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.277 0 Td +(at )Tj +1.109 0 Td +(least )Tj +2.276 0 Td +(kno)Tj +1.6 0 Td +(w )Tj +1.109 0 Td +(w)Tj +0.76 0 Td +(hether)Tj +( )Tj +-39.477 -1.44 Td +(dzone.com)Tj +(, )Tj +5.565 0 Td +(digg, )Tj +2.564 0 Td +(hac)Tj +1.538 0 Td +(kernews, )Tj +4.286 0 Td +(or )Tj +1.341 0 Td +(ja)Tj +0.748 0 Td +(v)Tj +0.476 0 Td +(alobb)Tj +2.428 0 Td +(y )Tj +0.952 0 Td +(caused )Tj +3.453 0 Td +(the )Tj +1.786 0 Td +(tr)Tj +/C2_0 1 Tf +0.599 0 Td +<0039003E005D>Tj +/TT0 1 Tf +(c )Tj +2.286 0 Td +(or )Tj +1.341 0 Td +(w)Tj +0.76 0 Td +(hether )Tj +3.175 0 Td +(it )Tj +1.008 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.341 0 Td +(an )Tj +1.508 0 Td +(attempted )Tj +-37.921 -1.44 Td +(Denial of Service attac)Tj +9.707 0 Td +(k.)Tj +-7.907 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.48 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.924 0 Td +(functional )Tj +4.76 0 Td +(and )Tj +2.036 0 Td +(non-functional )Tj +6.761 0 Td +(requirements )Tj +6.036 0 Td +(are )Tj +1.757 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.924 0 Td +(unusually )Tj +4.593 0 Td +(precise. )Tj +3.758 0 Td +(In )Tj +1.258 0 Td +(the )Tj +-40.866 -1.44 Td +(real )Tj +1.982 0 Td +(w)Tj +0.766 0 Td +(orld, )Tj +2.372 0 Td +(expectations )Tj +5.761 0 Td +(regarding )Tj +4.426 0 Td +(the )Tj +1.704 0 Td +(consistenc)Tj +4.478 0 Td +(y )Tj +0.871 0 Td +(and )Tj +1.982 0 Td +(persistence )Tj +5.149 0 Td +(are )Tj +1.703 0 Td +(usually )Tj +3.427 0 Td +(higher )Tj +3.094 0 Td +(during )Tj +3.15 0 Td +(the )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.875 0 Td +(iter)Tj +1.377 0 Td +(ations. )Tj +3.08 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.875 0 Td +(satisfy )Tj +2.931 0 Td +(the )Tj +1.653 0 Td +(high )Tj +2.209 0 Td +(non-functional )Tj +6.656 0 Td +(requirements, )Tj +6.209 0 Td +(we )Tj +1.597 0 Td +(probably )Tj +4.154 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.819 0 Td +(to )Tj +1.153 0 Td +(start )Tj +2.097 0 Td +(with )Tj +2.209 0 Td +(the )Tj +-40.866 -1.44 Td +(implementation )Tj +7.211 0 Td +(of )Tj +1.265 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.098 0 Td +(2 )Tj +0.987 0 Td +(persistence )Tj +5.21 0 Td +(and )Tj +2.043 0 Td +(perform )Tj +3.82 0 Td +(some )Tj +2.709 0 Td +(stress )Tj +2.709 0 Td +(tests )Tj +2.265 0 Td +(afterw)Tj +2.649 0 Td +(ards. )Tj +2.487 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.098 0 Td +(2 )Tj +0.987 0 Td +(integr)Tj +2.433 0 Td +(ates)Tj +( )Tj +-40.533 -1.44 Td +(v)Tj +0.488 0 Td +(ery nicely with EJB 3.1 and CDI, so this w)Tj +17.941 0 Td +(on\222)Tj +1.353 0 Td +(t cause additional o)Tj +8.437 0 Td +(v)Tj +0.488 0 Td +(erhead. )Tj +-26.907 -2.24 Td +(Kno)Tj +1.711 0 Td +(wing )Tj +2.405 0 Td +(the )Tj +1.627 0 Td +(use )Tj +1.738 0 Td +(cases )Tj +2.571 0 Td +(and )Tj +1.905 0 Td +(being )Tj +2.683 0 Td +(able )Tj +2.127 0 Td +(to )Tj +1.127 0 Td +(loosen )Tj +3.128 0 Td +(the )Tj +1.627 0 Td +(consistenc)Tj +4.478 0 Td +(y )Tj +0.793 0 Td +(and )Tj +1.905 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.017 0 Td +(requirements )Tj +-36.588 -1.44 Td +(sparks )Tj +3.086 0 Td +(another )Tj +3.698 0 Td +(idea: )Tj +2.531 0 Td +(the )Tj +1.753 0 Td +(introduction )Tj +5.7 0 Td +(of )Tj +1.253 0 Td +(a )Tj +0.919 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.475 0 Td +(for )Tj +1.586 0 Td +(the )Tj +1.753 0 Td +(computation )Tj +5.866 0 Td +(of )Tj +1.253 0 Td +(statistics )Tj +3.976 0 Td +(with )Tj +2.309 0 Td +(deferred )Tj +-38.644 -1.44 Td +(writes to persistent stor)Tj +9.825 0 Td +(age. )Tj +2.019 0 Td +(W)Tj +0.982 0 Td +(ith EJB 3.1 and J)Tj +6.881 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 suc)Tj +4.317 0 Td +(h a cac)Tj +3.094 0 Td +(he is v)Tj +2.767 0 Td +(ery easy to implement\205)Tj +/TT1 1 Tf +12 0 0 12 57 353.2 Tm +(Singletons )Tj +4.687 0 Td +(Are Not Completely Dead)Tj +/TT0 1 Tf +10 0 0 10 75 330.8 Tm +(A)Tj +0.612 0 Td +(v)Tj +0.482 0 Td +(oiding )Tj +/TT2 1 Tf +3.29 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +6.567 0 Td +(beans )Tj +3.067 0 Td +(for )Tj +1.733 0 Td +(the )Tj +1.9 0 Td +(implementation )Tj +7.346 0 Td +(of )Tj +1.4 0 Td +(business )Tj +4.179 0 Td +(logic )Tj +2.678 0 Td +(is )Tj +1.233 0 Td +(a )Tj +1.066 0 Td +(good )Tj +2.734 0 Td +(idea.)Tj +( )Tj +/TT2 1 Tf +-40.088 -1.44 Td +(@Stateless)Tj +/TT0 1 Tf +(, )Tj +6.813 0 Td +(and )Tj +2.146 0 Td +(sometimes )Tj +/TT2 1 Tf +5.09 0 Td +(@Stateful)Tj +/TT0 1 Tf +( )Tj +5.935 0 Td +(session )Tj +3.591 0 Td +(beans )Tj +3.035 0 Td +(and )Tj +2.146 0 Td +(CDI )Tj +2.257 0 Td +(managed )Tj +4.479 0 Td +(beans)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.285 0 Td +(is )Tj +1.201 0 Td +(more )Tj +-39.978 -1.44 Td +(suitable for this purpose. )Tj +/TT2 1 Tf +1.8 -2.24 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +6.315 0 Td +(beans )Tj +2.815 0 Td +(came )Tj +2.647 0 Td +(with )Tj +2.204 0 Td +(EJB )Tj +1.703 0 Td +(3.1 )Tj +1.704 0 Td +(in )Tj +1.148 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.814 0 Td +(EE )Tj +1.314 0 Td +(6 )Tj +0.87 0 Td +(and )Tj +1.926 0 Td +(caught )Tj +3.204 0 Td +(lots )Tj +1.815 0 Td +(of )Tj +1.148 0 Td +(interest. )Tj +3.63 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.37 0 Td +(container )Tj +-38.143 -1.44 Td +(creates )Tj +3.55 0 Td +(a )Tj +1.05 0 Td +(single )Tj +/TT2 1 Tf +3.051 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +6.551 0 Td +(bean )Tj +2.662 0 Td +(per )Tj +1.939 0 Td +(JVM )Tj +2.384 0 Td +(instance. )Tj +4.385 0 Td +(On )Tj +1.939 0 Td +(one )Tj +2.162 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.633 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.662 0 Td +(get )Tj +1.828 0 Td +(exactly )Tj +3.606 0 Td +(one )Tj +-40.588 -1.44 Td +(instance. )Tj +4.237 0 Td +(If )Tj +0.958 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.847 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.235 0 Td +(is )Tj +1.069 0 Td +(running )Tj +3.737 0 Td +(in )Tj +1.236 0 Td +(a )Tj +0.902 0 Td +(clustered )Tj +4.292 0 Td +(en)Tj +1.044 0 Td +(vironment, )Tj +5.07 0 Td +(the )Tj +1.736 0 Td +(application )Tj +5.238 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.235 0 Td +(creates )Tj +3.402 0 Td +(an )Tj +-41.144 -1.44 Td +(instance )Tj +4.043 0 Td +(for )Tj +1.653 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +1.042 0 Td +(node )Tj +2.654 0 Td +(\(JVM\). )Tj +3.154 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.986 0 Td +(EE )Tj +1.486 0 Td +(6 )Tj +1.042 0 Td +(singletons )Tj +4.766 0 Td +(are )Tj +1.819 0 Td +(similar )Tj +3.375 0 Td +(to )Tj +1.32 0 Td +(the )Tj +1.82 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.986 0 Td +(SE )Tj +1.486 0 Td +(Singleton )Tj +4.488 0 Td +(\(anti\) )Tj +-40.032 -1.44 Td +(pattern. )Tj +3.483 0 Td +(T)Tj +0.511 0 Td +(hey are, ho)Tj +4.823 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, subtle differences between the tw)Tj +14.939 0 Td +(o. )Tj +-24.481 -2.24 Td +(In )Tj +1.171 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.837 0 Td +(EE)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.587 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.449 0 Td +(can )Tj +1.893 0 Td +(get )Tj +1.615 0 Td +(more )Tj +2.559 0 Td +(than )Tj +2.227 0 Td +(one )Tj +1.949 0 Td +(singleton )Tj +4.228 0 Td +(instance )Tj +3.894 0 Td +(in )Tj +1.171 0 Td +(a )Tj +0.837 0 Td +(cluster)Tj +2.76 0 Td +(. )Tj +0.615 0 Td +(In )Tj +1.171 0 Td +(J)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 394.2694 199.6 Tm +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.837 0 Td +(SE)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.587 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.449 0 Td +(can )Tj +1.893 0 Td +(get )Tj +-40.922 -1.44 Td +(multiple )Tj +3.839 0 Td +(singleton )Tj +4.173 0 Td +(instances )Tj +4.228 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.782 0 Td +(loading )Tj +3.506 0 Td +(them )Tj +2.449 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.782 0 Td +(multiple )Tj +3.839 0 Td +(class )Tj +2.338 0 Td +(loaders. )Tj +3.598 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.338 0 Td +(real )Tj +1.893 0 Td +(problem )Tj +3.894 0 Td +(is )Tj +0.949 0 Td +(not )Tj +1.672 0 Td +(the )Tj +-40.866 -1.44 Td +(number )Tj +3.665 0 Td +(of )Tj +1.165 0 Td +(instances; )Tj +4.555 0 Td +(r)Tj +0.321 0 Td +(ather )Tj +2.498 0 Td +(it )Tj +0.887 0 Td +(is )Tj +0.998 0 Td +(the )Tj +1.665 0 Td +(concurrenc)Tj +4.866 0 Td +(y )Tj +0.831 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(. )Tj +0.609 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.831 0 Td +(SE )Tj +1.331 0 Td +(singletons )Tj +4.611 0 Td +(can )Tj +1.887 0 Td +(be )Tj +1.387 0 Td +(accessed )Tj +4.165 0 Td +(b)Tj +0.538 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(multiple )Tj +4.137 0 Td +(threads, )Tj +3.97 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.136 0 Td +(is )Tj +1.247 0 Td +(fast, )Tj +2.303 0 Td +(but )Tj +1.97 0 Td +(not )Tj +1.97 0 Td +(necessarily )Tj +5.303 0 Td +(consistent. )Tj +5.101 0 Td +(A )Tj +/TT2 1 Tf +1.247 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +6.581 0 Td +(EJB )Tj +1.969 0 Td +(can )Tj +2.136 0 Td +(be )Tj +-41.144 -1.44 Td +(accessed )Tj +4.128 0 Td +(only )Tj +2.184 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.794 0 Td +(one )Tj +1.906 0 Td +(thread )Tj +3.017 0 Td +(a )Tj +0.794 0 Td +(time, )Tj +2.461 0 Td +(so )Tj +1.239 0 Td +(it )Tj +0.85 0 Td +(will )Tj +1.906 0 Td +(be )Tj +1.35 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.183 0 Td +(consistent. )Tj +4.778 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.517 0 Td +(consistenc)Tj +4.478 0 Td +(y )Tj +0.794 0 Td +(comes )Tj +3.072 0 Td +(with )Tj +2.184 0 Td +(a )Tj +-41.7 -1.44 Td +(high )Tj +2.636 0 Td +(price\227the )Tj +/TT2 1 Tf +5.247 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +6.747 0 Td +(annotation )Tj +5.36 0 Td +(without )Tj +4.026 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.246 0 Td +(further )Tj +/C2_0 1 Tf +3.58 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.914 0 Td +(causes )Tj +3.58 0 Td +(serial )Tj +-39.922 -1.44 Td +(execution of threads and becomes a bottlenec)Tj +19.768 0 Td +(k. )Tj +-17.968 -2.24 Td +(T)Tj +0.511 0 Td +(his )Tj +1.513 0 Td +(is )Tj +0.957 0 Td +(the )Tj +1.624 0 Td +(default )Tj +/C2_0 1 Tf +3.236 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.458 0 Td +(of )Tj +1.124 0 Td +(a )Tj +0.79 0 Td +(singleton, )Tj +4.459 0 Td +(but )Tj +1.68 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.402 0 Td +(can )Tj +1.846 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.623 0 Td +(easily )Tj +2.735 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erride )Tj +2.79 0 Td +(it. )Tj +1.124 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +-39.476 -1.44 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.172 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +2.507 0 Td +(in )Tj +1.173 0 Td +(the )Tj +1.673 0 Td +(context )Tj +3.507 0 Td +(of )Tj +1.173 0 Td +(a )Tj +0.839 0 Td +(singleton )Tj +4.23 0 Td +(means )Tj +3.117 0 Td +(serial )Tj +2.617 0 Td +(execution, )Tj +4.841 0 Td +(but )Tj +1.729 0 Td +(this )Tj +1.84 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.006 0 Td +(can )Tj +1.895 0 Td +(be )Tj +ET + +endstream +endobj +166 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 167 0 R>>endobj +167 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(68)Tj +0 Tc 0 Tw -20.432 57.06 Td +(c)Tj +0.482 0 Td +(hanged with a single annotation.)Tj +1.318 -2.24 Td +(T)Tj +0.515 0 Td +(h)Tj +0.56 0 Td +(e )Tj +/TT1 1 Tf +1.28 0 Td +(@)Tj +0.604 0 Td +(C)Tj +0.604 0 Td +(o)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(c)Tj +0.604 0 Td +(u)Tj +0.604 0 Td +(r)Tj +0.604 0 Td +(r)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(c)Tj +0.604 0 Td +(y)Tj +0.604 0 Td +(M)Tj +0.604 0 Td +(a)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(a)Tj +0.604 0 Td +(g)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(m)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(t)Tj +0.604 0 Td +(\()Tj +0.604 0 Td +(C)Tj +0.604 0 Td +(o)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(c)Tj +0.604 0 Td +(u)Tj +0.604 0 Td +(r)Tj +0.604 0 Td +(r)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(c)Tj +0.604 0 Td +(y)Tj +0.604 0 Td +(M)Tj +0.604 0 Td +(a)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(a)Tj +0.604 0 Td +(g)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(m)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(t)Tj +0.604 0 Td +(T)Tj +0.604 0 Td +(y)Tj +0.604 0 Td +(p)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(.)Tj +0.604 0 Td +(B)Tj +0.604 0 Td +(E)Tj +0.604 0 Td +(A)Tj +0.604 0 Td +(N)Tj +0.604 0 Td +(\))Tj +/TT0 1 Tf +( )Tj +1.38 0 Td +(a)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(n)Tj +0.56 0 Td +(o)Tj +0.56 0 Td +(t)Tj +0.282 0 Td +(a)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(o)Tj +0.56 0 Td +(n )Tj +-41.644 -1.44 Td +(m)Tj +0.958 0 Td +(a)Tj +0.625 0 Td +(k)Tj +0.625 0 Td +(e)Tj +0.625 0 Td +(s )Tj +1.229 0 Td +(t)Tj +0.403 0 Td +(h)Tj +0.681 0 Td +(e )Tj +/TT1 1 Tf +1.34 0 Td +(@)Tj +0.725 0 Td +(S)Tj +0.725 0 Td +(i)Tj +0.725 0 Td +(n)Tj +0.725 0 Td +(g)Tj +0.725 0 Td +(l)Tj +0.725 0 Td +(e)Tj +0.725 0 Td +(t)Tj +0.725 0 Td +(o)Tj +0.725 0 Td +(n)Tj +/TT0 1 Tf +( )Tj +1.441 0 Td +(v)Tj +0.613 0 Td +(e)Tj +0.625 0 Td +(r)Tj +0.458 0 Td +(y )Tj +1.34 0 Td +(f)Tj +0.403 0 Td +(a)Tj +0.625 0 Td +(s)Tj +0.514 0 Td +(t)Tj +0.403 0 Td +(, )Tj +1.118 0 Td +(b)Tj +0.681 0 Td +(u)Tj +0.681 0 Td +(t )Tj +1.118 0 Td +(i)Tj +0.403 0 Td +(n)Tj +0.681 0 Td +(c)Tj +0.625 0 Td +(o)Tj +0.681 0 Td +(n)Tj +0.681 0 Td +(s)Tj +0.514 0 Td +(i)Tj +0.403 0 Td +(s)Tj +0.514 0 Td +(t)Tj +0.403 0 Td +(e)Tj +0.625 0 Td +(n)Tj +0.681 0 Td +(t)Tj +0.403 0 Td +(. )Tj +1.081 0 Td +(W)Tj +1.107 0 Td +(i)Tj +0.403 0 Td +(t)Tj +0.403 0 Td +(h )Tj +1.396 0 Td +(t)Tj +0.403 0 Td +(h)Tj +0.681 0 Td +(e )Tj +1.34 0 Td +(a)Tj +0.625 0 Td +(n)Tj +0.681 0 Td +(n)Tj +0.681 0 Td +(o)Tj +0.681 0 Td +(t)Tj +0.403 0 Td +(a)Tj +0.625 0 Td +(t)Tj +0.403 0 Td +(i)Tj +0.403 0 Td +(o)Tj +0.681 0 Td +(n )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(ConcurrencyManagement.BEAN)Tj +/TT0 1 Tf +(, )Tj +16.217 0 Td +(the )Tj +1.671 0 Td +(EJB )Tj +1.726 0 Td +(container )Tj +4.394 0 Td +(does )Tj +2.338 0 Td +(not )Tj +1.727 0 Td +(care )Tj +2.17 0 Td +(about )Tj +2.783 0 Td +(serializing )Tj +4.727 0 Td +(the )Tj +1.671 0 Td +(access )Tj +-39.422 -1.44 Td +(and )Tj +1.938 0 Td +(the )Tj +1.66 0 Td +(singleton )Tj +4.217 0 Td +(becomes )Tj +4.16 0 Td +(accessible )Tj +4.716 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.826 0 Td +(multiple )Tj +3.883 0 Td +(threads. )Tj +3.716 0 Td +(Sev)Tj +1.488 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.104 0 Td +(threads )Tj +3.438 0 Td +(are )Tj +1.659 0 Td +(able )Tj +2.16 0 Td +(to )Tj +1.16 0 Td +(access )Tj +3.104 0 Td +(and)Tj +( )Tj +-40.588 -1.44 Td +(m)Tj +0.858 0 Td +(o)Tj +0.581 0 Td +(d)Tj +0.581 0 Td +(i)Tj +0.303 0 Td +(f)Tj +0.303 0 Td +(y )Tj +1.29 0 Td +(a )Tj +1.29 0 Td +(g)Tj +0.525 0 Td +(l)Tj +0.303 0 Td +(o)Tj +0.581 0 Td +(b)Tj +0.581 0 Td +(a)Tj +0.525 0 Td +(l )Tj +1.068 0 Td +(d)Tj +0.581 0 Td +(a)Tj +0.525 0 Td +(t)Tj +0.303 0 Td +(a )Tj +1.29 0 Td +(s)Tj +0.414 0 Td +(t)Tj +0.303 0 Td +(r)Tj +0.358 0 Td +(u)Tj +0.581 0 Td +(c)Tj +0.525 0 Td +(t)Tj +0.303 0 Td +(u)Tj +0.581 0 Td +(r)Tj +0.358 0 Td +(e )Tj +1.29 0 Td +(w)Tj +0.803 0 Td +(i)Tj +0.303 0 Td +(t)Tj +0.303 0 Td +(h)Tj +0.581 0 Td +(o)Tj +0.581 0 Td +(u)Tj +0.581 0 Td +(t )Tj +1.068 0 Td +(a)Tj +0.525 0 Td +(n)Tj +0.563 0 Td +(y )Tj +1.29 0 Td +(s)Tj +0.414 0 Td +(y)Tj +0.525 0 Td +(n)Tj +0.581 0 Td +(c)Tj +0.507 0 Td +(h)Tj +0.581 0 Td +(r)Tj +0.358 0 Td +(o)Tj +0.581 0 Td +(n)Tj +0.581 0 Td +(i)Tj +0.303 0 Td +(z)Tj +0.525 0 Td +(a)Tj +0.525 0 Td +(t)Tj +0.303 0 Td +(i)Tj +0.303 0 Td +(o)Tj +0.581 0 Td +(n)Tj +0.581 0 Td +(, )Tj +1.068 0 Td +(w)Tj +0.785 0 Td +(h)Tj +0.581 0 Td +(i)Tj +0.303 0 Td +(c)Tj +0.507 0 Td +(h )Tj +1.346 0 Td +(c)Tj +0.525 0 Td +(a)Tj +0.525 0 Td +(u)Tj +0.581 0 Td +(s)Tj +0.414 0 Td +(e)Tj +0.525 0 Td +(s )Tj +1.179 0 Td +(e)Tj +0.525 0 Td +(v)Tj +0.513 0 Td +(e)Tj +0.525 0 Td +(n)Tj +0.581 0 Td +(t)Tj +0.303 0 Td +(u)Tj +0.581 0 Td +(a)Tj +0.525 0 Td +(l )Tj +-41.922 -1.44 Td +(inconsistencies. )Tj +1.8 -2.24 Td +(F)Tj +0.491 0 Td +(o)Tj +0.592 0 Td +(r)Tj +0.369 0 Td +(t)Tj +0.314 0 Td +(u)Tj +0.592 0 Td +(n)Tj +0.592 0 Td +(a)Tj +0.536 0 Td +(t)Tj +0.314 0 Td +(e)Tj +0.536 0 Td +(l)Tj +0.314 0 Td +(y)Tj +/TT2 1 Tf +0.536 0 Td +(,)Tj +/TT0 1 Tf +( )Tj +1.046 0 Td +(J)Tj +0.314 0 Td +(D)Tj +0.814 0 Td +(K )Tj +1.407 0 Td +(1)Tj +0.592 0 Td +(.)Tj +0.314 0 Td +(5 )Tj +1.352 0 Td +(b)Tj +0.592 0 Td +(r)Tj +0.369 0 Td +(o)Tj +0.592 0 Td +(u)Tj +0.592 0 Td +(g)Tj +0.536 0 Td +(h)Tj +0.592 0 Td +(t )Tj +1.074 0 Td +(u)Tj +0.592 0 Td +(s )Tj +1.185 0 Td +(l)Tj +0.314 0 Td +(o)Tj +0.592 0 Td +(c)Tj +0.518 0 Td +(k)Tj +0.536 0 Td +(-)Tj +0.369 0 Td +(f)Tj +0.314 0 Td +(r)Tj +0.369 0 Td +(e)Tj +0.536 0 Td +(e)Tj +0.536 0 Td +(, )Tj +1.074 0 Td +(b)Tj +0.592 0 Td +(u)Tj +0.592 0 Td +(t )Tj +1.074 0 Td +(s)Tj +0.425 0 Td +(t)Tj +0.314 0 Td +(i)Tj +0.314 0 Td +(l)Tj +0.314 0 Td +(l )Tj +1.074 0 Td +(c)Tj +0.536 0 Td +(o)Tj +0.592 0 Td +(n)Tj +0.592 0 Td +(s)Tj +0.425 0 Td +(i)Tj +0.314 0 Td +(s)Tj +0.425 0 Td +(t)Tj +0.314 0 Td +(e)Tj +0.536 0 Td +(n)Tj +0.592 0 Td +(t)Tj +/TT2 1 Tf +0.314 0 Td +(,)Tj +/TT0 1 Tf +( )Tj +1.046 0 Td +(c)Tj +0.536 0 Td +(o)Tj +0.592 0 Td +(l)Tj +0.314 0 Td +(l)Tj +0.314 0 Td +(e)Tj +0.536 0 Td +(c)Tj +0.536 0 Td +(t)Tj +0.314 0 Td +(i)Tj +0.314 0 Td +(o)Tj +0.592 0 Td +(n)Tj +0.592 0 Td +(s)Tj +0.425 0 Td +(. )Tj +1 0 Td +(T)Tj +0.547 0 Td +(h)Tj +0.592 0 Td +(e)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 479 512.8 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 498.3999 Tm +(java.util.concurrent.ConcurrentHashMap)Tj +/TT0 1 Tf +( )Tj +23.408 0 Td +(is )Tj +1.271 0 Td +(a )Tj +1.104 0 Td +(loc)Tj +1.316 0 Td +(k-free )Tj +3.048 0 Td +(but )Tj +1.994 0 Td +(consistent )Tj +/TT1 1 Tf +4.884 0 Td +(Map)Tj +/TT0 1 Tf +( )Tj +2.404 0 Td +(and )Tj +2.216 0 Td +(it)Tj +( )Tj +-41.644 -1.44 Td +(meets )Tj +3.152 0 Td +(our )Tj +2.097 0 Td +(requirements )Tj +6.264 0 Td +(perfectly)Tj +3.631 0 Td +(. )Tj +0.893 0 Td +(A )Tj +/TT1 1 Tf +1.319 0 Td +(ConcurrentHashMap)Tj +/TT0 1 Tf +( )Tj +10.854 0 Td +(can )Tj +2.208 0 Td +(be )Tj +1.708 0 Td +(directly )Tj +3.875 0 Td +(exposed )Tj +4.209 0 Td +(in )Tj +1.486 0 Td +(a)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(@Singleton)Tj +/TT0 1 Tf +( to multiple threads without an)Tj +19.212 0 Td +(y sync)Tj +2.705 0 Td +(hronization \(see Listing 32\):)Tj +/TT1 1 Tf +-21.917 -4.03 Td +(@Singleton)Tj +0 -1.79 TD +(@ConcurrencyManagement\(ConcurrencyManagementType.BEAN\))Tj +T* +(public class Hits {)Tj +T* +( )Tj +T* +(private ConcurrentHashMap hits = null;)Tj +0 -3.58 TD +(@PostConstruct)Tj +0 -1.79 TD +(public void preloadCache\(\) {)Tj +T* +(hits = new ConcurrentHashMap\(hits\);)Tj +T* +(//\205preloading)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 32: Using ConcurrentHashMap as a Cac)Tj +20.379 0 Td +(he)Tj +-18.579 -2.24 Td +(A )Tj +0.955 0 Td +(method )Tj +3.567 0 Td +(in )Tj +1.122 0 Td +(a )Tj +/TT1 1 Tf +0.788 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +6.289 0 Td +(annotated )Tj +4.568 0 Td +(with )Tj +/TT1 1 Tf +2.178 0 Td +(@PostConstruct)Tj +/TT0 1 Tf +( )Tj +8.689 0 Td +(will )Tj +1.9 0 Td +(be )Tj +1.344 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.4 0 Td +(just )Tj +1.789 0 Td +(after )Tj +2.177 0 Td +(the )Tj +-40.866 -1.44 Td +(creation )Tj +3.803 0 Td +(of )Tj +1.136 0 Td +(the )Tj +1.636 0 Td +(instance )Tj +3.859 0 Td +(and )Tj +1.914 0 Td +(the )Tj +1.636 0 Td +(injection )Tj +4.082 0 Td +(of )Tj +1.136 0 Td +(all )Tj +1.358 0 Td +(dependencies. )Tj +6.435 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.414 0 Td +(can )Tj +1.858 0 Td +(rely )Tj +1.913 0 Td +(on )Tj +1.414 0 Td +(the )Tj +1.636 0 Td +(existence )Tj +4.303 0 Td +(of )Tj +1.136 0 Td +(all )Tj +/C2_0 1 Tf +-41.144 -1.44 Td +<004100460042003D003B004C003D003C0001005D>Tj +/TT0 1 Tf +(elds. Either the injection is successful, or the instance will not be cr\ eated. )Tj +1.8 -2.24 Td +(W)Tj +0.963 0 Td +(e )Tj +1.222 0 Td +(are )Tj +2.055 0 Td +(using )Tj +3.001 0 Td +(the )Tj +/TT1 1 Tf +2.056 0 Td +(ConcurrentHashMap)Tj +/TT0 1 Tf +( )Tj +10.924 0 Td +(as )Tj +1.611 0 Td +(a )Tj +1.222 0 Td +(cac)Tj +1.482 0 Td +(he. )Tj +1.982 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.778 0 Td +(ConcurrentHashMap)Tj +/TT0 1 Tf +( )Tj +10.924 0 Td +(is )Tj +-41.533 -1.44 Td +(i)Tj +0.282 0 Td +(n)Tj +0.56 0 Td +(i)Tj +0.282 0 Td +(t)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(a)Tj +0.504 0 Td +(l)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(z)Tj +0.504 0 Td +(e)Tj +0.504 0 Td +(d )Tj +1.336 0 Td +(i)Tj +0.282 0 Td +(n )Tj +1.336 0 Td +(t)Tj +0.282 0 Td +(h)Tj +0.56 0 Td +(e )Tj +/TT1 1 Tf +1.28 0 Td +(@)Tj +0.605 0 Td +(P)Tj +0.605 0 Td +(o)Tj +0.605 0 Td +(s)Tj +0.605 0 Td +(t)Tj +0.605 0 Td +(C)Tj +0.605 0 Td +(o)Tj +0.605 0 Td +(n)Tj +0.605 0 Td +(s)Tj +0.605 0 Td +(t)Tj +0.605 0 Td +(r)Tj +0.605 0 Td +(u)Tj +0.605 0 Td +(c)Tj +0.605 0 Td +(t)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +1.38 0 Td +(p)Tj +0.605 0 Td +(r)Tj +0.605 0 Td +(e)Tj +0.605 0 Td +(l)Tj +0.605 0 Td +(o)Tj +0.605 0 Td +(a)Tj +0.605 0 Td +(d)Tj +0.605 0 Td +(C)Tj +0.605 0 Td +(a)Tj +0.605 0 Td +(c)Tj +0.605 0 Td +(h)Tj +0.605 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.38 0 Td +(m)Tj +0.837 0 Td +(e)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(h)Tj +0.56 0 Td +(o)Tj +0.56 0 Td +(d )Tj +1.336 0 Td +(j)Tj +0.282 0 Td +(u)Tj +0.56 0 Td +(s)Tj +0.393 0 Td +(t )Tj +1.058 0 Td +(t)Tj +0.282 0 Td +(o )Tj +1.336 0 Td +(g)Tj +0.504 0 Td +(r)Tj +0.337 0 Td +(o)Tj +0.56 0 Td +(u)Tj +0.56 0 Td +(p )Tj +1.336 0 Td +(t)Tj +0.282 0 Td +(h)Tj +0.56 0 Td +(e )Tj +1.28 0 Td +(w)Tj +0.764 0 Td +(h)Tj +0.56 0 Td +(o)Tj +0.56 0 Td +(l)Tj +0.282 0 Td +(e )Tj +-41.7 -1.44 Td +(initialization )Tj +5.993 0 Td +(process )Tj +3.824 0 Td +(of )Tj +1.435 0 Td +(the )Tj +1.935 0 Td +(class )Tj +2.657 0 Td +(in )Tj +1.435 0 Td +(one )Tj +2.213 0 Td +(place. )Tj +3.213 0 Td +(J)Tj +0.26 0 Td +(ust )Tj +1.824 0 Td +(after )Tj +2.49 0 Td +(the )Tj +1.935 0 Td +(initialization)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.243 0 Td +(the )Tj +1.935 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.657 0 Td +(gets )Tj +-40.533 -1.44 Td +(prepopulated from the persistent store at startup.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.434 0 Td +(method )Tj +/TT1 1 Tf +3.657 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +9.98 0 Td +(is )Tj +1.045 0 Td +(directly )Tj +3.601 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.49 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.878 0 Td +(the )Tj +/TT1 1 Tf +1.712 0 Td +(HitsResource)Tj +/TT0 1 Tf +(, )Tj +7.858 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.934 0 Td +(is )Tj +1.045 0 Td +(the )Tj +-40.866 -1.44 Td +(REST boundary \(see Listing 33\). )Tj +ET + +endstream +endobj +168 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 169 0 R>>endobj +169 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(69)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( public void updateStatistics\(String uri, String referer, )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 624.1999 Tm +(Map headerMap\) {)Tj +0 -1.79 TD +( try {)Tj +T* +( if \(urlFilter.ignore\(uri\) || httpHeaderFilter.ignore)Tj +0 -0.99 TD +(\(headerMap\)\) {)Tj +0 -1.79 TD +( numberOfRejectedRequests.incrementAndGet\(\);)Tj +0 -1.79 TD +( return;)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( storeURI\(uri\);)Tj +T* +( if \(referer != null && !referer.isEmpty\(\)\) {)Tj +T* +( storeReferer\(referer\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( } catch \(Exception e\) { // logging\205)Tj +T* +( })Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 33: Protocol-Agnostic Boundary Implementation)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.417 0 Td +(implementation )Tj +7.141 0 Td +(is )Tj +1.028 0 Td +(str)Tj +0.988 0 Td +(aightforw)Tj +4.039 0 Td +(ard. )Tj +2.028 0 Td +(It )Tj +0.917 0 Td +(is )Tj +1.028 0 Td +(a )Tj +0.861 0 Td +(simple )Tj +3.195 0 Td +(facade )Tj +3.195 0 Td +(that )Tj +1.973 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(okes )Tj +2.306 0 Td +(the )Tj +/TT1 1 Tf +1.695 0 Td +(storeURI)Tj +/TT0 1 Tf +( )Tj +5.162 0 Td +(and )Tj +/TT1 1 Tf +-40.588 -1.44 Td +(storeReferer)Tj +/TT0 1 Tf +( after c)Tj +10.128 0 Td +(hec)Tj +1.538 0 Td +(king the preconditions. )Tj +10.098 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +(storeURI)Tj +/TT0 1 Tf +( in)Tj +7.235 0 Td +(v)Tj +0.482 0 Td +(okes tw)Tj +3.267 0 Td +(o other methods:)Tj +/TT1 1 Tf +-33.259 -4.03 Td +( void storeURI\(String uniqueAction\) {)Tj +0 -1.79 TD +( storeHitStatistics\(uniqueAction\);)Tj +T* +( if \(isRelevantForTrend\(uniqueAction\)\) {)Tj +T* +( storeTrending\(uniqueAction\);)Tj +T* +( })Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(Inside )Tj +2.894 0 Td +(the )Tj +/TT1 1 Tf +1.671 0 Td +(storeHitsStatistics)Tj +/TT0 1 Tf +( )Tj +11.739 0 Td +(method)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.866 0 Td +(the )Tj +1.671 0 Td +(actual )Tj +2.949 0 Td +(magic )Tj +2.948 0 Td +(happens. )Tj +4.154 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.393 0 Td +(putIfAbsent)Tj +/TT0 1 Tf +( )Tj +-35.599 -1.44 Td +(method )Tj +3.616 0 Td +(is )Tj +1.004 0 Td +(the )Tj +1.671 0 Td +(reason )Tj +3.171 0 Td +(for )Tj +1.504 0 Td +(using )Tj +/TT1 1 Tf +2.616 0 Td +(ConcurrentHashMap)Tj +/TT0 1 Tf +(, )Tj +10.816 0 Td +(instead )Tj +3.394 0 Td +(of )Tj +1.171 0 Td +(the )Tj +1.671 0 Td +(usual )Tj +/TT1 1 Tf +2.616 0 Td +(Map)Tj +/TT0 1 Tf +( )Tj +2.137 0 Td +(interface)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.31 0 Td +(in )Tj +1.171 0 Td +(the )Tj +-40.866 -1.44 Td +(declar)Tj +2.655 0 Td +(ation:)Tj +/TT1 1 Tf +-2.655 -1.79 Td +( long storeHitStatistics\(String uniqueAction\) {)Tj +/TT3 1 Tf +0 -1.79 TD +( hitStatistics.putIfAbsent\(uniqueAction, new AtomicLong\(\)\);)Tj +0 -1.79 TD +( AtomicLong hitCount = hitStatistics.get\(uniqueAction\);)Tj +T* +( return hitCount.incrementAndGet\(\);)Tj +ET + +endstream +endobj +170 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 171 0 R>>endobj +171 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(70)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( })Tj +ET +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 611.7 Tm +(F)Tj +0.455 0 Td +(or )Tj +1.25 0 Td +(an )Tj +1.417 0 Td +(unkno)Tj +2.712 0 Td +(wn )Tj +1.695 0 Td +(URI)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.278 0 Td +(a )Tj +0.861 0 Td +(new )Tj +/TT1 1 Tf +2.195 0 Td +(AtomicLong)Tj +/TT0 1 Tf +( )Tj +6.362 0 Td +(instance )Tj +3.918 0 Td +(is )Tj +1.028 0 Td +(created. )Tj +3.806 0 Td +(If )Tj +0.917 0 Td +(the )Tj +1.695 0 Td +(URI )Tj +2.028 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.861 0 Td +(exists)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.945 0 Td +(the )Tj +-40.866 -1.44 Td +(c)Tj +0.517 0 Td +(o)Tj +0.573 0 Td +(r)Tj +0.35 0 Td +(r)Tj +0.35 0 Td +(e)Tj +0.517 0 Td +(s)Tj +0.406 0 Td +(p)Tj +0.573 0 Td +(o)Tj +0.573 0 Td +(n)Tj +0.573 0 Td +(d)Tj +0.573 0 Td +(i)Tj +0.295 0 Td +(n)Tj +0.573 0 Td +(g )Tj +/TT1 1 Tf +1.286 0 Td +(A)Tj +0.617 0 Td +(t)Tj +0.617 0 Td +(o)Tj +0.617 0 Td +(m)Tj +0.617 0 Td +(i)Tj +0.617 0 Td +(c)Tj +0.617 0 Td +(I)Tj +0.617 0 Td +(n)Tj +0.617 0 Td +(t)Tj +0.617 0 Td +(e)Tj +0.617 0 Td +(g)Tj +0.617 0 Td +(e)Tj +0.617 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.387 0 Td +(i)Tj +0.295 0 Td +(n)Tj +0.573 0 Td +(s)Tj +0.406 0 Td +(t)Tj +0.295 0 Td +(a)Tj +0.517 0 Td +(n)Tj +0.573 0 Td +(c)Tj +0.517 0 Td +(e )Tj +1.286 0 Td +(i)Tj +0.295 0 Td +(s )Tj +1.175 0 Td +(r)Tj +0.35 0 Td +(e)Tj +0.517 0 Td +(t)Tj +0.295 0 Td +(u)Tj +0.573 0 Td +(r)Tj +0.35 0 Td +(n)Tj +0.573 0 Td +(e)Tj +0.517 0 Td +(d )Tj +1.342 0 Td +(a)Tj +0.517 0 Td +(n)Tj +0.573 0 Td +(d )Tj +1.342 0 Td +(i)Tj +0.295 0 Td +(t)Tj +0.295 0 Td +(s )Tj +1.175 0 Td +(v)Tj +0.493 0 Td +(a)Tj +0.517 0 Td +(l)Tj +0.295 0 Td +(u)Tj +0.573 0 Td +(e )Tj +1.286 0 Td +(i)Tj +0.295 0 Td +(s )Tj +1.175 0 Td +(i)Tj +0.295 0 Td +(n)Tj +0.573 0 Td +(c)Tj +0.517 0 Td +(r)Tj +0.35 0 Td +(e)Tj +0.517 0 Td +(a)Tj +0.517 0 Td +(s)Tj +0.406 0 Td +(e)Tj +0.517 0 Td +(d )Tj +1.342 0 Td +(w)Tj +0.795 0 Td +(i)Tj +0.295 0 Td +(t)Tj +0.295 0 Td +(h)Tj +( )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(incrementAndGet)Tj +/TT0 1 Tf +(. )Tj +9.794 0 Td +(Also)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.692 0 Td +(the )Tj +/TT1 1 Tf +1.886 0 Td +(AtomicInteger)Tj +/TT0 1 Tf +( )Tj +8.353 0 Td +(is )Tj +1.219 0 Td +(w)Tj +0.766 0 Td +(orking )Tj +3.275 0 Td +(in )Tj +1.386 0 Td +(an )Tj +1.608 0 Td +(optimistic )Tj +4.776 0 Td +(and )Tj +2.164 0 Td +(consistent )Tj +-37.92 -1.44 Td +(manner without bloc)Tj +8.986 0 Td +(king. It uses the \223compare and set/s)Tj +15.16 0 Td +(w)Tj +0.76 0 Td +(ap\224 algorithm )Tj +-24.906 -1.44 Td +(\()Tj +(http://en.wikipedia.org/wiki/Compare-and-s)Tj +18.995 0 Td +(w)Tj +0.76 0 Td +(ap)Tj +(\) )Tj +1.827 0 Td +(behind )Tj +3.495 0 Td +(the )Tj +1.827 0 Td +(scenes. )Tj +3.531 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.549 0 Td +(principle )Tj +4.328 0 Td +(is )Tj +1.16 0 Td +(similar )Tj +3.382 0 Td +(to )Tj +-41.366 -1.44 Td +(optimistic loc)Tj +5.818 0 Td +(ks in JP)Tj +3.058 0 Td +(A. )Tj +-7.076 -2.24 Td +(In )Tj +1.304 0 Td +(JP)Tj +0.779 0 Td +(A)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.387 0 Td +(the )Tj +1.804 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.304 0 Td +(of )Tj +1.304 0 Td +(the )Tj +/C2_0 1 Tf +1.804 0 Td +<005D>Tj +/TT0 1 Tf +(eld )Tj +2.36 0 Td +(marked )Tj +3.692 0 Td +(with )Tj +2.36 0 Td +(the )Tj +/TT1 1 Tf +1.804 0 Td +(@Version)Tj +/TT0 1 Tf +( )Tj +5.271 0 Td +(annotation )Tj +5.084 0 Td +(is )Tj +1.137 0 Td +(remembered )Tj +5.914 0 Td +(and )Tj +-40.588 -1.44 Td +(compared )Tj +4.787 0 Td +(during )Tj +3.232 0 Td +(the )Tj +1.787 0 Td +(update )Tj +3.399 0 Td +(phase. )Tj +3.195 0 Td +(An )Tj +1.676 0 Td +(unc)Tj +1.594 0 Td +(hanged )Tj +3.621 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.287 0 Td +(indicates )Tj +4.288 0 Td +(a )Tj +0.953 0 Td +(consistent )Tj +4.733 0 Td +(state, )Tj +2.676 0 Td +(because)Tj +( )Tj +-38.699 -1.44 Td +(there )Tj +2.506 0 Td +(were )Tj +2.45 0 Td +(no )Tj +/C2_0 1 Tf +1.451 0 Td +<00450047003C0041005D>Tj +/TT0 1 Tf +(cations )Tj +6.175 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.839 0 Td +(other )Tj +2.562 0 Td +(threads )Tj +3.451 0 Td +(or )Tj +1.228 0 Td +(tr)Tj +0.599 0 Td +(ansactions )Tj +4.841 0 Td +(in )Tj +1.173 0 Td +(the )Tj +1.673 0 Td +(database. )Tj +4.396 0 Td +(If )Tj +0.895 0 Td +(the )Tj +1.673 0 Td +(cac)Tj +1.482 0 Td +(hed )Tj +1.951 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +-40.366 -1.44 Td +(\(the )Tj +1.935 0 Td +(\223before\224 )Tj +3.934 0 Td +(image\) )Tj +3.212 0 Td +(and )Tj +1.935 0 Td +(the )Tj +1.657 0 Td +(actual )Tj +2.935 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.157 0 Td +(in )Tj +1.157 0 Td +(the )Tj +1.657 0 Td +(data )Tj +2.157 0 Td +(store )Tj +2.379 0 Td +(do )Tj +1.435 0 Td +(not )Tj +1.713 0 Td +(matc)Tj +2.093 0 Td +(h)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.129 0 Td +(an )Tj +1.379 0 Td +(exception )Tj +4.547 0 Td +(is )Tj +0.99 0 Td +(thro)Tj +1.711 0 Td +(wn. )Tj +-40.588 -1.44 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.548 0 Td +(JP)Tj +0.779 0 Td +(A)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.353 0 Td +(an )Tj +/TT1 1 Tf +1.492 0 Td +(OptimisticLockException)Tj +/TT0 1 Tf +( )Tj +14.238 0 Td +(is )Tj +1.103 0 Td +(thro)Tj +1.711 0 Td +(wn. )Tj +1.974 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.492 0 Td +(AtomicLong)Tj +/TT0 1 Tf +( )Tj +6.437 0 Td +(implementation)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +7.466 0 Td +(on )Tj +-41.088 -1.44 Td +(the )Tj +1.726 0 Td +(other )Tj +2.615 0 Td +(hand)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.81 0 Td +(relies )Tj +2.67 0 Td +(on )Tj +1.504 0 Td +(nati)Tj +1.594 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.892 0 Td +(code )Tj +2.504 0 Td +(and )Tj +2.004 0 Td +(is )Tj +1.059 0 Td +(able )Tj +2.226 0 Td +(to )Tj +1.226 0 Td +(update )Tj +3.338 0 Td +(the )Tj +1.726 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.226 0 Td +(automatically )Tj +6.227 0 Td +(at )Tj +1.17 0 Td +(the )Tj +1.726 0 Td +(CPU )Tj +-40.199 -1.44 Td +(lev)Tj +1.266 0 Td +(el.)Tj +0.534 -2.24 Td +(A )Tj +1.486 0 Td +(s)Tj +0.47 0 Td +(i)Tj +0.359 0 Td +(n)Tj +0.637 0 Td +(g)Tj +0.581 0 Td +(l)Tj +0.359 0 Td +(e )Tj +1.319 0 Td +(r)Tj +0.414 0 Td +(o)Tj +0.637 0 Td +(u)Tj +0.637 0 Td +(n)Tj +0.637 0 Td +(d)Tj +0.637 0 Td +(t)Tj +0.359 0 Td +(r)Tj +0.414 0 Td +(i)Tj +0.359 0 Td +(p )Tj +1.375 0 Td +(e)Tj +0.581 0 Td +(n)Tj +0.637 0 Td +(d)Tj +0.637 0 Td +(s )Tj +1.208 0 Td +(w)Tj +0.859 0 Td +(i)Tj +0.359 0 Td +(t)Tj +0.359 0 Td +(h )Tj +1.375 0 Td +(t)Tj +0.359 0 Td +(h)Tj +0.637 0 Td +(e )Tj +1.319 0 Td +(u)Tj +0.637 0 Td +(p)Tj +0.637 0 Td +(d)Tj +0.637 0 Td +(a)Tj +0.581 0 Td +(t)Tj +0.359 0 Td +(i)Tj +0.359 0 Td +(n)Tj +0.637 0 Td +(g )Tj +1.319 0 Td +(o)Tj +0.637 0 Td +(f )Tj +1.097 0 Td +(t)Tj +0.359 0 Td +(h)Tj +0.637 0 Td +(e )Tj +1.319 0 Td +(s)Tj +0.47 0 Td +(t)Tj +0.359 0 Td +(a)Tj +0.581 0 Td +(t)Tj +0.359 0 Td +(i)Tj +0.359 0 Td +(s)Tj +0.47 0 Td +(t)Tj +0.359 0 Td +(i)Tj +0.359 0 Td +(c)Tj +0.581 0 Td +(s )Tj +1.208 0 Td +(s)Tj +0.47 0 Td +(t)Tj +0.359 0 Td +(o)Tj +0.637 0 Td +(r)Tj +0.414 0 Td +(e)Tj +0.581 0 Td +(d )Tj +1.375 0 Td +(i)Tj +0.359 0 Td +(n )Tj +1.375 0 Td +(t)Tj +0.359 0 Td +(h)Tj +0.637 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(ConcurrentHashMap)Tj +/TT0 1 Tf +(. )Tj +10.83 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.48 0 Td +(updates )Tj +3.759 0 Td +(do )Tj +1.536 0 Td +(not )Tj +1.814 0 Td +(loc)Tj +1.316 0 Td +(k )Tj +0.924 0 Td +(the )Tj +1.758 0 Td +(data )Tj +2.258 0 Td +(structure, )Tj +4.425 0 Td +(so )Tj +1.369 0 Td +(the )Tj +1.758 0 Td +(performance )Tj +5.869 0 Td +(of )Tj +1.258 0 Td +(the )Tj +-40.866 -1.44 Td +(m)Tj +0.952 0 Td +(e)Tj +0.619 0 Td +(t)Tj +0.397 0 Td +(h)Tj +0.675 0 Td +(o)Tj +0.675 0 Td +(d )Tj +/TT1 1 Tf +1.394 0 Td +(u)Tj +0.719 0 Td +(p)Tj +0.719 0 Td +(d)Tj +0.719 0 Td +(a)Tj +0.719 0 Td +(t)Tj +0.719 0 Td +(e)Tj +0.719 0 Td +(S)Tj +0.719 0 Td +(t)Tj +0.719 0 Td +(a)Tj +0.719 0 Td +(t)Tj +0.719 0 Td +(i)Tj +0.719 0 Td +(s)Tj +0.719 0 Td +(t)Tj +0.719 0 Td +(i)Tj +0.719 0 Td +(c)Tj +0.719 0 Td +(s)Tj +/TT0 1 Tf +( )Tj +1.438 0 Td +(i)Tj +0.397 0 Td +(s )Tj +1.227 0 Td +(d)Tj +0.675 0 Td +(e)Tj +0.619 0 Td +(p)Tj +0.675 0 Td +(e)Tj +0.619 0 Td +(n)Tj +0.675 0 Td +(d)Tj +0.675 0 Td +(e)Tj +0.619 0 Td +(n)Tj +0.675 0 Td +(t )Tj +1.116 0 Td +(o)Tj +0.675 0 Td +(n)Tj +0.675 0 Td +(l)Tj +0.397 0 Td +(y )Tj +1.338 0 Td +(o)Tj +0.675 0 Td +(n )Tj +1.394 0 Td +(t)Tj +0.397 0 Td +(h)Tj +0.675 0 Td +(e )Tj +1.338 0 Td +(s)Tj +0.508 0 Td +(c)Tj +0.619 0 Td +(a)Tj +0.619 0 Td +(l)Tj +0.397 0 Td +(a)Tj +0.619 0 Td +(b)Tj +0.675 0 Td +(i)Tj +0.397 0 Td +(l)Tj +0.397 0 Td +(i)Tj +0.397 0 Td +(t)Tj +0.397 0 Td +(y )Tj +1.338 0 Td +(o)Tj +0.675 0 Td +(f )Tj +1.116 0 Td +(t)Tj +0.397 0 Td +(h)Tj +0.675 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(ConcurrentHashMap)Tj +/TT0 1 Tf +(. )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 165.75 365.3 Tm +(W)Tj +0.982 0 Td +(ith )Tj +1.544 0 Td +(a )Tj +0.932 0 Td +(simple )Tj +/TT1 1 Tf +3.266 0 Td +(@Singleton)Tj +/TT0 1 Tf +(, )Tj +6.711 0 Td +(we )Tj +1.71 0 Td +(managed )Tj +4.377 0 Td +(to )Tj +1.266 0 Td +(implement )Tj +5.044 0 Td +(a )Tj +0.932 0 Td +(consistent, )Tj +-37.642 -1.44 Td +(loc)Tj +1.316 0 Td +(k-free)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.141 0 Td +(and )Tj +2.059 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.78 0 Td +(scalable )Tj +3.948 0 Td +(data )Tj +2.281 0 Td +(store. )Tj +2.707 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.503 0 Td +(only )Tj +2.337 0 Td +(thing )Tj +2.615 0 Td +(we )Tj +1.725 0 Td +(are )Tj +1.78 0 Td +(missing )Tj +3.67 0 Td +(is )Tj +1.114 0 Td +(failure )Tj +3.17 0 Td +(toler)Tj +1.933 0 Td +(ance )Tj +2.503 0 Td +(and )Tj +-40.588 -1.44 Td +(persistence.)Tj +/TT3 1 Tf +12 0 0 12 57 300.1 Tm +(@Async)Tj +3.344 0 Td +(hronous or Not)Tj +/TT0 1 Tf +10 0 0 10 75 277.7 Tm +(It )Tj +1.266 0 Td +(turns )Tj +2.822 0 Td +(out, )Tj +2.378 0 Td +(that )Tj +2.322 0 Td +(the )Tj +2.044 0 Td +(performance )Tj +6.155 0 Td +(of )Tj +1.544 0 Td +(the )Tj +/TT1 1 Tf +2.044 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +10.312 0 Td +(method )Tj +3.989 0 Td +(is )Tj +1.377 0 Td +(not )Tj +2.1 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +-41.144 -1.44 Td +(measur)Tj +3.099 0 Td +(able. )Tj +2.317 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.502 0 Td +(is )Tj +0.946 0 Td +(a )Tj +0.779 0 Td +(shame, )Tj +3.335 0 Td +(because )Tj +3.78 0 Td +(this )Tj +1.78 0 Td +(method )Tj +3.558 0 Td +(is )Tj +0.946 0 Td +(the )Tj +1.613 0 Td +(perfect )Tj +3.224 0 Td +(example )Tj +3.946 0 Td +(for )Tj +1.446 0 Td +(the )Tj +/TT1 1 Tf +1.613 0 Td +(@Asynchronous)Tj +/TT0 1 Tf +( )Tj +-34.399 -1.44 Td +(annotation. )Tj +5.173 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.911 0 Td +(make )Tj +2.688 0 Td +(it )Tj +0.911 0 Td +(execute )Tj +3.689 0 Td +(async)Tj +2.427 0 Td +(hronously )Tj +4.635 0 Td +(in )Tj +1.189 0 Td +(an )Tj +1.411 0 Td +(application )Tj +5.191 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.188 0 Td +(thread )Tj +3.078 0 Td +(pool, )Tj +2.579 0 Td +(the )Tj +1.689 0 Td +(method )Tj +/TT1 1 Tf +-38.921 -1.44 Td +(updateStatistics)Tj +/TT0 1 Tf +( has to be annotated with the )Tj +/TT1 1 Tf +(@Asynchronous )Tj +/TT0 1 Tf +(annotation:)Tj +/TT4 1 Tf +0 -1.79 TD +(@Asynchronous)Tj +/TT1 1 Tf +0 -0.99 TD +(public void updateStatistics\(String uri, String referer\) {)Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.655 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +4.101 0 Td +(method )Tj +3.878 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.823 0 Td +(decouples )Tj +4.99 0 Td +(the )Tj +1.933 0 Td +(execution )Tj +4.823 0 Td +(of )Tj +1.433 0 Td +(this )Tj +2.1 0 Td +(method )Tj +3.878 0 Td +(from )Tj +2.599 0 Td +(its )Tj +-41.255 -1.44 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oker)Tj +1.815 0 Td +(. )Tj +0.482 0 Td +(T)Tj +0.511 0 Td +(hen, the client doesn\222)Tj +9.246 0 Td +(t ha)Tj +1.582 0 Td +(v)Tj +0.488 0 Td +(e to w)Tj +2.65 0 Td +(ait until the method returns. )Tj +-16.278 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.62 0 Td +(method )Tj +/TT1 1 Tf +3.843 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +10.166 0 Td +(is )Tj +1.231 0 Td +(executed )Tj +4.454 0 Td +(in )Tj +1.398 0 Td +(a )Tj +1.064 0 Td +(bac)Tj +1.538 0 Td +(kground )Tj +4.121 0 Td +(thread )Tj +3.287 0 Td +(managed )Tj +4.509 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.064 0 Td +(an )Tj +-41.144 -1.44 Td +(application )Tj +5.507 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.949 0 Td +(Because )Tj +4.227 0 Td +(it )Tj +1.227 0 Td +(is )Tj +1.338 0 Td +(an )Tj +1.727 0 Td +(EJB )Tj +2.06 0 Td +(bean, )Tj +3.061 0 Td +(the )Tj +2.005 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.895 0 Td +(is )Tj +1.338 0 Td +(tr)Tj +0.599 0 Td +(ansactional )Tj +5.562 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.171 0 Td +(default. )Tj +-38.976 -1.44 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.278 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.387 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +2.722 0 Td +(does )Tj +2.555 0 Td +(not )Tj +1.944 0 Td +(pla)Tj +1.304 0 Td +(y )Tj +1.054 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.887 0 Td +(well )Tj +2.388 0 Td +(with )Tj +2.444 0 Td +(tr)Tj +0.599 0 Td +(ansactions )Tj +5.056 0 Td +(and )Tj +2.166 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +-38.698 -1.44 Td +(method )Tj +3.755 0 Td +(execution. )Tj +4.978 0 Td +(In )Tj +1.31 0 Td +(the )Tj +1.81 0 Td +(default )Tj +3.422 0 Td +(case, )Tj +2.643 0 Td +(the )Tj +1.81 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.589 0 Td +(gets )Tj +2.143 0 Td +(propagated )Tj +5.311 0 Td +(and )Tj +2.088 0 Td +(the )Tj +1.81 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +ET + +endstream +endobj +172 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 174 0 R>>endobj +173 0 obj<>endobj +174 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(71)Tj +0 Tc 0 Tw -20.432 57.06 Td +(method )Tj +3.673 0 Td +(is )Tj +1.061 0 Td +(executed )Tj +4.284 0 Td +(in )Tj +1.228 0 Td +(the )Tj +1.728 0 Td +(caller\222)Tj +2.575 0 Td +(s )Tj +0.783 0 Td +(tr)Tj +0.599 0 Td +(ansaction. )Tj +4.785 0 Td +(More )Tj +2.672 0 Td +(appropriate )Tj +5.34 0 Td +(for )Tj +1.561 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +3.896 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.618 0 Td +(is )Tj +-41.533 -1.44 Td +(the )Tj +/TT1 1 Tf +(RequiresNew)Tj +/TT0 1 Tf +( tr)Tj +9.09 0 Td +(ansaction lev)Tj +5.657 0 Td +(el:)Tj +/TT1 1 Tf +-14.747 -1.79 Td +(@Asynchronous)Tj +/TT2 1 Tf +0 -0.99 TD +(@TransactionAttribute\(TransactionAttributeType.REQUIRES_NEW\))Tj +/TT1 1 Tf +0 -0.99 TD +(public void updateStatistics\(String uri, String referer\) {)Tj +0 -1.79 TD +(//\205)Tj +T* +(})Tj +/TT0 1 Tf +1.8 -2.24 Td +(So )Tj +1.389 0 Td +(far)Tj +1.037 0 Td +(, )Tj +0.611 0 Td +(the )Tj +1.667 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.223 0 Td +(implementation )Tj +7.113 0 Td +(has )Tj +1.778 0 Td +(been )Tj +2.445 0 Td +(realized )Tj +3.778 0 Td +(without )Tj +3.613 0 Td +(loc)Tj +1.316 0 Td +(king. )Tj +2.445 0 Td +(No )Tj +1.667 0 Td +(complex )Tj +4.056 0 Td +(algorithms )Tj +-37.699 -1.44 Td +(or )Tj +1.22 0 Td +(slo)Tj +1.211 0 Td +(w )Tj +1.109 0 Td +(IO )Tj +1.442 0 Td +(oper)Tj +1.933 0 Td +(ations )Tj +2.888 0 Td +(are )Tj +1.664 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(olv)Tj +1.322 0 Td +(ed. )Tj +1.591 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.387 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.221 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.444 0 Td +(is )Tj +0.998 0 Td +(executed )Tj +4.221 0 Td +(in )Tj +1.165 0 Td +(one )Tj +1.943 0 Td +(process, )Tj +3.832 0 Td +(so )Tj +1.276 0 Td +(there )Tj +2.498 0 Td +(is )Tj +-41.533 -1.44 Td +(no )Tj +1.544 0 Td +(need )Tj +2.544 0 Td +(for )Tj +1.599 0 Td +(XA )Tj +1.71 0 Td +(or )Tj +1.321 0 Td +(tw)Tj +1.044 0 Td +(o-phase )Tj +3.822 0 Td +(commit )Tj +3.71 0 Td +(\(2PC\) )Tj +2.767 0 Td +(semantics. )Tj +4.896 0 Td +(As )Tj +1.488 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.932 0 Td +(noted, )Tj +3.156 0 Td +(the )Tj +1.766 0 Td +(execution )Tj +4.656 0 Td +(of )Tj +1.266 0 Td +(the )Tj +-40.866 -1.44 Td +(method )Tj +/TT1 1 Tf +3.716 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +10.039 0 Td +(is )Tj +1.104 0 Td +(hardly )Tj +3.16 0 Td +(measur)Tj +3.099 0 Td +(able )Tj +2.271 0 Td +(through )Tj +3.772 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.937 0 Td +(means. )Tj +3.456 0 Td +(Although )Tj +4.384 0 Td +(the )Tj +1.771 0 Td +(method )Tj +-38.921 -1.44 Td +(signature )Tj +4.278 0 Td +(and )Tj +2 0 Td +(its )Tj +1.333 0 Td +(functionality )Tj +5.78 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.334 0 Td +(perfectly )Tj +/C2_0 1 Tf +4.111 0 Td +<005D>Tj +/TT0 1 Tf +(t )Tj +1.222 0 Td +(the )Tj +1.722 0 Td +(par)Tj +1.377 0 Td +(adigm )Tj +3.055 0 Td +(of )Tj +/TT1 1 Tf +1.222 0 Td +(@Asynchronous)Tj +/TT0 1 Tf +( )Tj +8.19 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation, )Tj +-38.698 -1.44 Td +(using )Tj +/TT1 1 Tf +2.772 0 Td +(@Asynchronous)Tj +/TT0 1 Tf +( )Tj +8.294 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.717 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.439 0 Td +(cause )Tj +2.938 0 Td +(additional )Tj +4.829 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead. )Tj +3.716 0 Td +(Eac)Tj +1.482 0 Td +(h )Tj +1.049 0 Td +(request )Tj +3.605 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.439 0 Td +(be )Tj +-41.144 -1.44 Td +(p)Tj +0.588 0 Td +(a)Tj +0.532 0 Td +(s)Tj +0.421 0 Td +(s)Tj +0.421 0 Td +(e)Tj +0.532 0 Td +(d )Tj +1.35 0 Td +(t)Tj +0.31 0 Td +(o )Tj +1.35 0 Td +(a )Tj +1.294 0 Td +(t)Tj +0.31 0 Td +(h)Tj +0.588 0 Td +(r)Tj +0.365 0 Td +(e)Tj +0.532 0 Td +(a)Tj +0.532 0 Td +(d )Tj +1.35 0 Td +(p)Tj +0.588 0 Td +(o)Tj +0.588 0 Td +(o)Tj +0.588 0 Td +(l )Tj +1.072 0 Td +(a)Tj +0.532 0 Td +(n)Tj +0.588 0 Td +(d )Tj +1.35 0 Td +(e)Tj +0.532 0 Td +(x)Tj +0.532 0 Td +(e)Tj +0.532 0 Td +(c)Tj +0.532 0 Td +(u)Tj +0.588 0 Td +(t)Tj +0.31 0 Td +(e)Tj +0.532 0 Td +(d )Tj +1.35 0 Td +(i)Tj +0.31 0 Td +(n )Tj +1.35 0 Td +(a )Tj +1.294 0 Td +(s)Tj +0.421 0 Td +(e)Tj +0.532 0 Td +(p)Tj +0.588 0 Td +(a)Tj +0.532 0 Td +(r)Tj +0.353 0 Td +(a)Tj +0.532 0 Td +(t)Tj +0.31 0 Td +(e )Tj +1.294 0 Td +(t)Tj +0.31 0 Td +(h)Tj +0.588 0 Td +(r)Tj +0.365 0 Td +(e)Tj +0.532 0 Td +(a)Tj +0.532 0 Td +(d)Tj +0.588 0 Td +(. )Tj +0.998 0 Td +(T)Tj +0.543 0 Td +(h)Tj +0.588 0 Td +(e )Tj +1.294 0 Td +(d)Tj +0.588 0 Td +(u)Tj +0.588 0 Td +(r)Tj +0.353 0 Td +(a)Tj +0.532 0 Td +(t)Tj +0.31 0 Td +(i)Tj +0.31 0 Td +(o)Tj +0.588 0 Td +(n )Tj +1.35 0 Td +(o)Tj +0.588 0 Td +(f )Tj +1.072 0 Td +(t)Tj +0.31 0 Td +(h)Tj +0.588 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +10.055 0 Td +(method )Tj +3.733 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.343 0 Td +(not )Tj +1.844 0 Td +(measur)Tj +3.099 0 Td +(able, )Tj +2.566 0 Td +(so )Tj +1.399 0 Td +(the )Tj +1.788 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +3.956 0 Td +(processing )Tj +5.011 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.4 0 Td +(be )Tj +-41.144 -1.44 Td +(processed almost sync)Tj +9.596 0 Td +(hronously)Tj +4.188 0 Td +(. )Tj +0.519 0 Td +(Async)Tj +2.594 0 Td +(hronous in)Tj +4.602 0 Td +(v)Tj +0.482 0 Td +(ocation of a v)Tj +5.88 0 Td +(ery fast method causes additional )Tj +-27.861 -1.44 Td +(resour)Tj +2.655 0 Td +(ce o)Tj +1.822 0 Td +(v)Tj +0.488 0 Td +(erhead without an)Tj +/C2_0 1 Tf +7.819 0 Td +<00510001003A003D0046003D005D>Tj +/TT0 1 Tf +(t.)Tj +-10.984 -2.24 Td +(An )Tj +1.656 0 Td +(interesting )Tj +4.879 0 Td +(question )Tj +4.102 0 Td +(to )Tj +1.267 0 Td +(ask )Tj +1.822 0 Td +(is: )Tj +1.378 0 Td +(\223What )Tj +3.211 0 Td +(happens )Tj +4.046 0 Td +(in )Tj +1.267 0 Td +(the )Tj +1.767 0 Td +(w)Tj +0.766 0 Td +(orst )Tj +1.989 0 Td +(case?\224 )Tj +3.155 0 Td +(Let\222)Tj +1.464 0 Td +(s )Tj +0.822 0 Td +(assume )Tj +3.6 0 Td +(that )Tj +2.045 0 Td +(for )Tj +-41.033 -1.44 Td +(some )Tj +2.752 0 Td +(reason, )Tj +3.586 0 Td +(our )Tj +1.919 0 Td +(bac)Tj +1.538 0 Td +(k-end )Tj +2.919 0 Td +(implementation )Tj +7.254 0 Td +(will )Tj +2.086 0 Td +(bloc)Tj +1.872 0 Td +(k )Tj +0.974 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.807 0 Td +(request )Tj +3.586 0 Td +(forev)Tj +2.155 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.752 0 Td +(In )Tj +1.308 0 Td +(this )Tj +1.975 0 Td +(case, )Tj +2.641 0 Td +(the )Tj +-40.866 -1.44 Td +(previously )Tj +4.846 0 Td +(discussed )Tj +4.513 0 Td +(client-side )Tj +4.846 0 Td +(thread )Tj +3.123 0 Td +(pool )Tj +2.346 0 Td +(in )Tj +1.234 0 Td +(the )Tj +1.734 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.9 0 Td +(probe )Tj +2.901 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.346 0 Td +(reject )Tj +2.789 0 Td +(incoming )Tj +4.457 0 Td +(requests. )Tj +-38.421 -1.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.491 0 Td +(statistics )Tj +3.992 0 Td +(for )Tj +1.602 0 Td +(the )Tj +1.769 0 Td +(incoming )Tj +4.492 0 Td +(requests )Tj +3.936 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.381 0 Td +(be )Tj +1.491 0 Td +(lost, )Tj +2.214 0 Td +(but )Tj +1.825 0 Td +(the )Tj +1.769 0 Td +(user )Tj +2.213 0 Td +(w)Tj +0.766 0 Td +(ouldn\222)Tj +2.743 0 Td +(t )Tj +0.713 0 Td +(notice )Tj +3.103 0 Td +(that. )Tj +2.325 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +-41.644 -1.44 Td +(beha)Tj +2.082 0 Td +(vior is perfectly viable in our case. )Tj +15.024 0 Td +(A good user experience has priority o)Tj +16.105 0 Td +(v)Tj +0.488 0 Td +(er exact statistics. )Tj +-31.899 -2.24 Td +(Let\222)Tj +1.464 0 Td +(s )Tj +0.788 0 Td +(assume )Tj +3.566 0 Td +(the )Tj +1.733 0 Td +(same )Tj +2.621 0 Td +(scenario )Tj +4.011 0 Td +(\(bloc)Tj +2.15 0 Td +(king )Tj +2.233 0 Td +(method )Tj +3.678 0 Td +(call\) )Tj +2.233 0 Td +(for )Tj +1.566 0 Td +(an )Tj +1.455 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +3.901 0 Td +(EJB )Tj +1.788 0 Td +(method )Tj +3.678 0 Td +(on )Tj +-41.088 -1.44 Td +(the )Tj +1.702 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.201 0 Td +(side. )Tj +2.369 0 Td +(Eac)Tj +1.482 0 Td +(h )Tj +0.924 0 Td +(new )Tj +2.202 0 Td +(request )Tj +3.48 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.314 0 Td +(loc)Tj +1.316 0 Td +(k )Tj +0.868 0 Td +(an )Tj +1.424 0 Td +(additional )Tj +4.704 0 Td +(bean )Tj +2.48 0 Td +(instance )Tj +3.925 0 Td +(and )Tj +1.98 0 Td +(allocate )Tj +3.758 0 Td +(a )Tj +0.868 0 Td +(thread )Tj +-39.477 -1.44 Td +(from )Tj +2.378 0 Td +(the )Tj +1.712 0 Td +(pool. )Tj +2.602 0 Td +(More )Tj +2.656 0 Td +(and )Tj +1.99 0 Td +(more )Tj +2.6 0 Td +(fresh )Tj +2.434 0 Td +(bean )Tj +2.49 0 Td +(instances )Tj +4.324 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.324 0 Td +(be )Tj +1.434 0 Td +(loc)Tj +1.316 0 Td +(ked )Tj +1.934 0 Td +(until )Tj +2.324 0 Td +(the )Tj +1.712 0 Td +(pool )Tj +2.324 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.267 0 Td +(empty)Tj +2.575 0 Td +(. )Tj +-41.922 -1.44 Td +(After )Tj +2.367 0 Td +(the )Tj +1.645 0 Td +(exhaustion )Tj +4.98 0 Td +(of )Tj +1.145 0 Td +(all )Tj +1.367 0 Td +(pool )Tj +2.257 0 Td +(resour)Tj +2.655 0 Td +(ces, )Tj +1.978 0 Td +(the )Tj +1.645 0 Td +(client )Tj +2.701 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.257 0 Td +(be )Tj +1.367 0 Td +(bloc)Tj +1.872 0 Td +(ked. )Tj +2.071 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.534 0 Td +(scenario )Tj +3.923 0 Td +(is, )Tj +1.256 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +-41.922 -1.44 Td +(properly handled in our case. )Tj +1.8 -2.24 Td +(An )Tj +1.565 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 153.37 207.3 Tm +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.567 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.289 0 Td +(decouple )Tj +4.344 0 Td +(the )Tj +1.677 0 Td +(client )Tj +2.733 0 Td +(but )Tj +1.732 0 Td +(bind )Tj +2.289 0 Td +(more )Tj +2.564 0 Td +(threads )Tj +3.455 0 Td +(and )Tj +1.954 0 Td +(consume )Tj +-38.31 -1.44 Td +(more )Tj +2.504 0 Td +(resour)Tj +2.655 0 Td +(ces. )Tj +1.912 0 Td +(W)Tj +0.982 0 Td +(ithout )Tj +2.784 0 Td +(a )Tj +0.782 0 Td +(thread )Tj +3.005 0 Td +(pool )Tj +2.228 0 Td +(with )Tj +2.172 0 Td +(a )Tj +0.782 0 Td +(bounded )Tj +4.118 0 Td +(size, )Tj +2.227 0 Td +(acquiring )Tj +4.339 0 Td +(a )Tj +0.782 0 Td +(new )Tj +2.116 0 Td +(thread )Tj +3.005 0 Td +(for )Tj +1.449 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.838 0 Td +(new)Tj +1.76 0 Td +(, )Tj +-41.922 -1.44 Td +(but slo)Tj +2.879 0 Td +(w)Tj +0.704 0 Td +(, request could lead to )Tj +/TT1 1 Tf +(OutOfMemoryException)Tj +/TT0 1 Tf +(. )Tj +-1.783 -2.24 Td +(In )Tj +1.121 0 Td +(our )Tj +1.732 0 Td +(case, )Tj +2.454 0 Td +(the )Tj +1.621 0 Td +(implementation )Tj +7.067 0 Td +(of )Tj +1.121 0 Td +(the )Tj +1.621 0 Td +(safety )Tj +2.732 0 Td +(v)Tj +0.476 0 Td +(alv)Tj +1.266 0 Td +(e )Tj +0.787 0 Td +(is )Tj +0.954 0 Td +(better )Tj +2.732 0 Td +(located )Tj +3.455 0 Td +(on )Tj +1.399 0 Td +(the )Tj +1.621 0 Td +(client )Tj +2.677 0 Td +(side. )Tj +2.251 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.787 0 Td +(can )Tj +-40.644 -1.44 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.621 0 Td +(shut )Tj +2.344 0 Td +(do)Tj +1.1 0 Td +(wn )Tj +1.899 0 Td +(the )Tj +/TT1 1 Tf +1.899 0 Td +(x-ray-services)Tj +/TT0 1 Tf +( )Tj +8.966 0 Td +(application )Tj +5.401 0 Td +(without )Tj +3.845 0 Td +(impacting )Tj +4.844 0 Td +(stability )Tj +3.9 0 Td +(or )Tj +1.454 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.621 0 Td +(the )Tj +-40.866 -1.44 Td +(performance of the client \(that is, the blog\).)Tj +ET + +endstream +endobj +175 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 176 0 R>>endobj +176 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(72)Tj +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 593.2 Tm +(P)Tj +0.511 0 Td +(ersistence for )Tj +6.113 0 Td +(A)Tj +0.612 0 Td +(v)Tj +0.476 0 Td +(ailability)Tj +/TT0 1 Tf +10 0 0 10 75 570.7999 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.585 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.029 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.641 0 Td +(stores )Tj +2.974 0 Td +(its )Tj +1.474 0 Td +(state )Tj +2.474 0 Td +(in )Tj +1.363 0 Td +(key-v)Tj +2.309 0 Td +(alue )Tj +2.363 0 Td +(pairs. )Tj +2.826 0 Td +(Also, )Tj +2.697 0 Td +(simple )Tj +3.363 0 Td +(statistics, )Tj +4.364 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.085 0 Td +(as )Tj +1.418 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(computation )Tj +5.765 0 Td +(of )Tj +1.152 0 Td +(total )Tj +2.208 0 Td +(hits, )Tj +2.097 0 Td +(are )Tj +1.651 0 Td +(performed )Tj +4.763 0 Td +(on )Tj +1.43 0 Td +(the )Tj +1.652 0 Td +(key-v)Tj +2.309 0 Td +(alue )Tj +2.152 0 Td +(store. )Tj +2.578 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.374 0 Td +(state )Tj +2.263 0 Td +(of )Tj +1.152 0 Td +(the )Tj +1.652 0 Td +(tr)Tj +0.599 0 Td +(ansient )Tj +3.375 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.374 0 Td +(is )Tj +/C2_0 1 Tf +-41.533 -1.44 Td +<005E>Tj +/TT0 1 Tf +(ushed )Tj +3.45 0 Td +(into )Tj +2.005 0 Td +(a )Tj +0.837 0 Td +(persistent )Tj +4.394 0 Td +(store )Tj +2.393 0 Td +(in )Tj +1.171 0 Td +(a )Tj +/C2_0 1 Tf +0.837 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(able )Tj +2.171 0 Td +(period )Tj +3.116 0 Td +(repeatedly)Tj +4.409 0 Td +(. )Tj +0.578 0 Td +(A )Tj +1.004 0 Td +(cr)Tj +0.821 0 Td +(ash )Tj +1.782 0 Td +(or )Tj +1.226 0 Td +(reboot )Tj +3.116 0 Td +(between )Tj +4.005 0 Td +(the )Tj +-40.866 -1.44 Td +(sync)Tj +1.927 0 Td +(hronization )Tj +5.324 0 Td +(points )Tj +2.99 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.323 0 Td +(lead )Tj +2.211 0 Td +(to )Tj +1.211 0 Td +(data )Tj +2.211 0 Td +(loss. )Tj +2.193 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.433 0 Td +(shorter )Tj +3.322 0 Td +(the )Tj +1.711 0 Td +(period )Tj +3.156 0 Td +(between )Tj +/C2_0 1 Tf +4.045 0 Td +<005E>Tj +/TT0 1 Tf +(ushes, )Tj +3.601 0 Td +(the )Tj +1.711 0 Td +(less)Tj +( )Tj +-40.644 -1.44 Td +(data gets lost.)Tj +1.8 -2.24 Td +(I )Tj +0.663 0 Td +(implemented )Tj +6.053 0 Td +(the )Tj +1.719 0 Td +(periodic )Tj +3.942 0 Td +(sync)Tj +1.927 0 Td +(hronization )Tj +5.332 0 Td +(with )Tj +2.275 0 Td +(the )Tj +/TT2 1 Tf +1.719 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +/TT2 1 Tf +6.386 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.785 0 Td +(EJB )Tj +1.774 0 Td +(bean )Tj +2.497 0 Td +(and )Tj +1.997 0 Td +(the )Tj +/TT2 1 Tf +-40.866 -1.44 Td +(@Schedule)Tj +/TT0 1 Tf +( annotation \(see Listing 34\). )Tj +/TT2 1 Tf +0 -1.79 TD +(@Startup)Tj +0 -1.79 TD +(@Singleton)Tj +0 -1.79 TD +(@ConcurrencyManagement\(ConcurrencyManagementType.BEAN\))Tj +0 -1.79 TD +(@Interceptors\(PerformanceAuditor.class\))Tj +T* +(public class Hits {)Tj +T* +( )Tj +T* +( @EJB)Tj +T* +( PersistentHitStore hitStore;)Tj +T* +( @EJB)Tj +T* +( PersistentRefererStore refererStore;)Tj +3.6 -1.79 Td +( )Tj +-3.6 -1.79 Td +( //\205)Tj +T* +( private ConcurrentHashMap hitStatistics = )Tj +0 -0.99 TD +(null;)Tj +0 -1.79 TD +( private ConcurrentHashMap trending = null;)Tj +T* +( private ConcurrentHashMap refererStatistics = )Tj +0 -0.99 TD +(null;)Tj +0 -3.58 TD +( @PostConstruct)Tj +0 -1.79 TD +( public void preloadCache\(\) {)Tj +0 -1.79 TD +( Map hits = hitStore.getHits\(\);)Tj +0 -1.79 TD +( Map referers = refererStore.getReferers\(\);\ )Tj +0 -1.79 TD +( hitStatistics = new ConcurrentHashMap)Tj +ET + +endstream +endobj +177 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 178 0 R>>endobj +178 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(73)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +(\(hits\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( trending = new ConcurrentHashMap\(\);)Tj +0 -1.79 TD +( refererStatistics = new ConcurrentHashMap)Tj +0 -0.99 TD +(\(referers\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public void updateStatistics\(String uri, String referer, )Tj +0 -0.99 TD +(Map headerMap\) {)Tj +7.2 -1.79 Td +(//...)Tj +-7.2 -1.79 Td +( })Tj +/TT2 1 Tf +0 -3.58 TD +( @Schedule\(minute = "*/5", hour = "*", persistent = false\))Tj +0 -1.79 TD +( public void persistHitsCache\(\) {)Tj +0 -1.79 TD +( hitStore.store\(hitStatistics\);)Tj +T* +( })Tj +/TT1 1 Tf +0 -3.58 TD +( @Schedule\(minute = "*/5", hour = "*", persistent = false\))Tj +0 -1.79 TD +( public void persistReferersCache\(\) {)Tj +/TT2 1 Tf +0 -1.79 TD +( refererStore.store\(refererStatistics\);)Tj +/TT1 1 Tf +T* +( })Tj +0 -3.58 TD +( @Schedule\(hour = "*/1", persistent = false\))Tj +0 -1.79 TD +( public void resetTrends\(\) {)Tj +0 -1.79 TD +( trending.clear\(\);)Tj +T* +( })Tj +3.6 -1.79 Td +(//...methods ommitted)Tj +-3.6 -1.79 Td +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 34: Ev)Tj +5.713 0 Td +(entual P)Tj +3.457 0 Td +(ersistenc)Tj +3.699 0 Td +(y with @Sc)Tj +4.728 0 Td +(hedule)Tj +-15.797 -2.24 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +/C2_0 1 Tf +1.682 0 Td +<005D>Tj +/TT0 1 Tf +(v)Tj +1.044 0 Td +(e )Tj +0.849 0 Td +(minutes )Tj +/TT1 1 Tf +3.739 0 Td +(\(minute )Tj +4.872 0 Td +(= )Tj +1.271 0 Td +(\223*/5\224\))Tj +/TT0 1 Tf +(, )Tj +4.228 0 Td +(the )Tj +1.683 0 Td +(method )Tj +/TT1 1 Tf +3.628 0 Td +(persistHitsCache)Tj +/TT0 1 Tf +( )Tj +9.951 0 Td +(is )Tj +1.016 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.461 0 Td +(in )Tj +1.183 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.758 0 Td +(context )Tj +3.813 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.145 0 Td +(the )Tj +1.979 0 Td +(container)Tj +3.983 0 Td +(. )Tj +0.923 0 Td +(In )Tj +1.479 0 Td +(subsequent )Tj +5.481 0 Td +(iter)Tj +1.377 0 Td +(ations, )Tj +3.48 0 Td +(I )Tj +0.923 0 Td +(factored )Tj +4.146 0 Td +(out )Tj +2.035 0 Td +(the )Tj +1.979 0 Td +(periodic )Tj +-38.643 -1.44 Td +(execution into a dedicated class \(see Listing 35\) and made the period\222\ )Tj +/C2_0 1 Tf +29.866 0 Td +<004B00010044003D0046003F004C00400001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +7.158 0 Td +(able.)Tj +/TT1 1 Tf +-35.224 -2.12 Td +(@Singleton)Tj +ET + +endstream +endobj +179 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 180 0 R>>endobj +180 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(74)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 630.7999 Tm +(@Startup)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 609.5999 Tm +(public class HitsFlushTimer {)Tj +0 -4.24 TD +( @Inject)Tj +0 -2.12 TD +( private int hitsFlushRate;)Tj +0 -4.24 TD +( @EJB)Tj +0 -2.12 TD +( Hits hits;)Tj +0 -4.24 TD +( @Resource)Tj +0 -2.12 TD +( TimerService timerService;)Tj +0 -4.24 TD +( @PostConstruct)Tj +0 -2.12 TD +( )Tj +/TT2 1 Tf +(public void initializeTimer\(\) {)Tj +0 -2.12 TD +( ScheduleExpression expression = new ScheduleExpression\(\);)Tj +0 -2.12 TD +( expression.minute\("*/" + this.hitsFlushRate\).hour\("*"\);)Tj +T* +( TimerConfig timerConfig = new TimerConfig\(\);)Tj +T* +( timerConfig.setPersistent\(false\);)Tj +T* +( timerService.createCalendarTimer\(expression, timerConfig\);)Tj +T* +( })Tj +/TT1 1 Tf +0 -4.24 TD +( @Timeout)Tj +0 -2.12 TD +( public void initiateFlush\(\) {)Tj +0 -2.12 TD +( this.hits.persistHitsCache\(\);)Tj +T* +( })Tj +T* +(})Tj +/C2_0 1 Tf +-1.8 -1.2 Td +<00280041004B004C00410046003F00010010001200170001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +8.437 0 Td +(able Sc)Tj +3.094 0 Td +(heduler)Tj +ET + +endstream +endobj +181 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 182 0 R>>endobj +182 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(75)Tj +0 Tc 0 Tw -18.632 57.06 Td +(On )Tj +1.702 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.646 0 Td +(\223timeout,)Tj +3.946 0 Td +(\224 )Tj +0.757 0 Td +(the )Tj +1.647 0 Td +(cac)Tj +1.482 0 Td +(he, )Tj +1.647 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.869 0 Td +(is )Tj +0.98 0 Td +(implemented )Tj +5.981 0 Td +(as )Tj +1.202 0 Td +(a )Tj +/TT1 1 Tf +0.813 0 Td +(ConcurrentHashMap)Tj +/TT0 1 Tf +(, )Tj +10.793 0 Td +(is )Tj +0.98 0 Td +(passed )Tj +-39.31 -1.44 Td +(to )Tj +1.242 0 Td +(the )Tj +/TT1 1 Tf +1.742 0 Td +(PersistentHitStore)Tj +/TT0 1 Tf +( )Tj +11.209 0 Td +(control. )Tj +3.743 0 Td +(Because )Tj +3.964 0 Td +(hits )Tj +1.909 0 Td +(and )Tj +2.02 0 Td +(referrers )Tj +3.907 0 Td +(are )Tj +1.741 0 Td +(processed )Tj +4.687 0 Td +(in )Tj +1.242 0 Td +(exactly )Tj +3.464 0 Td +(the )Tj +-40.866 -1.44 Td +(same )Tj +2.643 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.699 0 Td +(the )Tj +1.755 0 Td +(common )Tj +4.255 0 Td +(logic )Tj +2.533 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.31 0 Td +(factored )Tj +3.922 0 Td +(out )Tj +1.811 0 Td +(into )Tj +2.089 0 Td +(an )Tj +1.477 0 Td +(abstr)Tj +2.044 0 Td +(act )Tj +/TT1 1 Tf +1.699 0 Td +(PersistentStore)Tj +/TT0 1 Tf +( )Tj +9.422 0 Td +(class )Tj +2.477 0 Td +(\(see)Tj +( )Tj +-40.533 -1.44 Td +(Listing 36\):)Tj +/TT1 1 Tf +0 -1.79 TD +(public abstract class PersistentStore {)Tj +0 -3.58 TD +( public void store\(Map cache\){)Tj +0 -1.79 TD +( Set> entrySet = cache.entrySet\(\);)Tj +T* +( for \(Entry entry : entrySet\) {)Tj +T* +( String id = entry.getKey\(\);)Tj +T* +( AtomicLong hitCount = entry.getValue\(\);)Tj +0 -1.79 TD +( updateStatistics\(id,hitCount\);)Tj +0 -1.79 TD +( })Tj +T* +( })Tj +T* +( abstract void updateStatistics\(String id, AtomicLong hitCount\);)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 36: )Tj +4.651 0 Td +(T)Tj +0.456 0 Td +(emplate P)Tj +4.187 0 Td +(attern for Reuse of Iter)Tj +9.491 0 Td +(ation Logic)Tj +/TT1 1 Tf +-16.985 -2.24 Td +(PersistentStore)Tj +/TT0 1 Tf +( is an implementation of the Gang of F)Tj +25.519 0 Td +(our\222)Tj +1.631 0 Td +(s )Tj +0.593 0 Td +(T)Tj +0.456 0 Td +(emplate pattern )Tj +-29.999 -1.44 Td +(\()Tj +(http://en.wikipedia.org/wiki/T)Tj +12.851 0 Td +(emplate_pattern)Tj +(\). )Tj +7.853 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.481 0 Td +(interesting )Tj +4.871 0 Td +(information )Tj +5.427 0 Td +(is )Tj +1.092 0 Td +(extr)Tj +1.599 0 Td +(acted )Tj +2.759 0 Td +(from )Tj +2.425 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(Map)Tj +/TT0 1 Tf +( )Tj +2.102 0 Td +(and )Tj +1.914 0 Td +(an )Tj +1.358 0 Td +(abstr)Tj +2.044 0 Td +(act )Tj +1.58 0 Td +(method )Tj +/TT1 1 Tf +3.581 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +9.903 0 Td +(is )Tj +0.969 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.414 0 Td +(with )Tj +2.192 0 Td +(the )Tj +1.636 0 Td +(extr)Tj +1.599 0 Td +(acted )Tj +2.636 0 Td +(information )Tj +5.304 0 Td +(\(see )Tj +-40.533 -1.44 Td +(Listing 37\):)Tj +/TT1 1 Tf +0 -1.79 TD +(@Stateless)Tj +T* +(@Interceptors\(PerformanceAuditor.class\))Tj +T* +(public class PersistentHitStore )Tj +/TT2 1 Tf +(extends PersistentStore)Tj +/TT1 1 Tf +({)Tj +0 -3.58 TD +( @PersistenceContext\(unitName="hitscounter"\))Tj +0 -1.79 TD +( EntityManager em;)Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public void updateStatistics\(String id, AtomicLong hitCount\) {)Tj +0 -1.79 TD +( Hit hit = getManaged\(id\);)Tj +T* +( hit.setCount\(hitCount.get\(\)\);)Tj +ET + +endstream +endobj +183 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 185 0 R>>endobj +184 0 obj<>endobj +185 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(76)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( })Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 598.2999 Tm +( public Hit getManaged\(String id\){)Tj +0 -1.79 TD +( Hit found = em.find\(Hit.class, id\);)Tj +T* +( if\(found == null\){)Tj +T* +( found = new Hit\(id,0\);)Tj +T* +( found = em.merge\(found\);)Tj +T* +( })Tj +T* +( return found;)Tj +T* +( })Tj +3.6 -1.79 Td +(//...)Tj +-3.6 -1.79 Td +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 37: P)Tj +5.236 0 Td +(ersisting the )Tj +5.317 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansient Cac)Tj +4.984 0 Td +(he with JP)Tj +4.281 0 Td +(A)Tj +-18.821 -2.24 Td +(T)Tj +0.513 0 Td +(h)Tj +0.558 0 Td +(e )Tj +1.279 0 Td +(c)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(s)Tj +0.391 0 Td +(s )Tj +/TT1 1 Tf +1.168 0 Td +(P)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(s)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(s)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(H)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(S)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(o)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.379 0 Td +(f)Tj +0.28 0 Td +(r)Tj +0.335 0 Td +(o)Tj +0.558 0 Td +(m )Tj +1.612 0 Td +(L)Tj +0.502 0 Td +(i)Tj +0.28 0 Td +(s)Tj +0.391 0 Td +(t)Tj +0.28 0 Td +(i)Tj +0.28 0 Td +(n)Tj +0.558 0 Td +(g )Tj +1.279 0 Td +(3)Tj +0.558 0 Td +(7 )Tj +1.335 0 Td +(i)Tj +0.28 0 Td +(m)Tj +0.835 0 Td +(p)Tj +0.558 0 Td +(l)Tj +0.28 0 Td +(e)Tj +0.502 0 Td +(m)Tj +0.835 0 Td +(e)Tj +0.502 0 Td +(n)Tj +0.558 0 Td +(t)Tj +0.28 0 Td +(s )Tj +1.168 0 Td +(t)Tj +0.28 0 Td +(h)Tj +0.558 0 Td +(e )Tj +1.279 0 Td +(a)Tj +0.502 0 Td +(b)Tj +0.558 0 Td +(s)Tj +0.391 0 Td +(t)Tj +0.28 0 Td +(r)Tj +0.323 0 Td +(a)Tj +0.502 0 Td +(c)Tj +0.502 0 Td +(t )Tj +1.057 0 Td +(m)Tj +0.835 0 Td +(e)Tj +0.502 0 Td +(t)Tj +0.28 0 Td +(h)Tj +0.558 0 Td +(o)Tj +0.558 0 Td +(d )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +9.94 0 Td +(and )Tj +1.95 0 Td +(is )Tj +1.005 0 Td +(responsible )Tj +5.229 0 Td +(for )Tj +1.505 0 Td +(storing )Tj +3.228 0 Td +(the )Tj +/TT1 1 Tf +1.672 0 Td +(Hit)Tj +/TT0 1 Tf +( )Tj +2.139 0 Td +(entity )Tj +2.728 0 Td +(in )Tj +1.172 0 Td +(a )Tj +0.838 0 Td +(relational )Tj +4.395 0 Td +(database )Tj +4.117 0 Td +(using )Tj +-39.921 -1.44 Td +(JP)Tj +0.779 0 Td +(A. )Tj +1.217 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.402 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erridden )Tj +3.958 0 Td +(method )Tj +/TT1 1 Tf +3.625 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +9.948 0 Td +(fetc)Tj +1.538 0 Td +(hes )Tj +1.791 0 Td +(a )Tj +0.846 0 Td +(managed )Tj +/TT1 1 Tf +4.291 0 Td +(Hit)Tj +/TT0 1 Tf +( )Tj +2.146 0 Td +(entity )Tj +2.736 0 Td +(and )Tj +1.958 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erwrites )Tj +-38.811 -1.44 Td +(its )Tj +1.406 0 Td +(hit )Tj +1.573 0 Td +(count. )Tj +3.185 0 Td +(Because )Tj +/TT1 1 Tf +4.017 0 Td +(updateStatistics)Tj +/TT0 1 Tf +( )Tj +10.062 0 Td +(is )Tj +1.128 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.961 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.573 0 Td +(in )Tj +1.295 0 Td +(a )Tj +0.961 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.574 0 Td +(started )Tj +3.295 0 Td +(in )Tj +1.295 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.834 0 Td +(boundary)Tj +4.021 0 Td +(, )Tj +0.711 0 Td +(all )Tj +1.489 0 Td +(c)Tj +0.482 0 Td +(hanged )Tj +3.601 0 Td +(entities )Tj +3.49 0 Td +(will )Tj +2.045 0 Td +(be )Tj +1.489 0 Td +(tr)Tj +0.599 0 Td +(ansparently )Tj +5.379 0 Td +(updated )Tj +3.935 0 Td +(at )Tj +1.211 0 Td +(commit )Tj +3.711 0 Td +(time. )Tj +2.6 0 Td +(No )Tj +1.767 0 Td +(further )Tj +/TT1 1 Tf +-39.366 -1.44 Td +(EntityManager#merge)Tj +/TT0 1 Tf +( in)Tj +12.502 0 Td +(v)Tj +0.482 0 Td +(ocations are required to update alread)Tj +16.371 0 Td +(y managed entities.)Tj +-27.555 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.354 0 Td +(method )Tj +/TT1 1 Tf +3.577 0 Td +(getManaged)Tj +/TT0 1 Tf +( )Tj +6.299 0 Td +(tries )Tj +2.076 0 Td +(to )Tj +1.132 0 Td +(fetc)Tj +1.538 0 Td +(h )Tj +0.854 0 Td +(the )Tj +/TT1 1 Tf +1.632 0 Td +(Hit)Tj +/TT0 1 Tf +( )Tj +2.098 0 Td +(entity )Tj +2.688 0 Td +(with )Tj +2.188 0 Td +(a )Tj +0.798 0 Td +(URI )Tj +1.965 0 Td +(\(the )Tj +1.91 0 Td +(primary )Tj +3.631 0 Td +(key\). )Tj +2.354 0 Td +(Either )Tj +2.743 0 Td +(an )Tj +-41.144 -1.44 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.999 0 Td +(existing )Tj +3.778 0 Td +(entity )Tj +2.889 0 Td +(will )Tj +2.111 0 Td +(be )Tj +1.555 0 Td +(returned )Tj +4.111 0 Td +(or )Tj +1.388 0 Td +(a )Tj +0.999 0 Td +(new )Tj +2.333 0 Td +(entity )Tj +2.889 0 Td +(will )Tj +2.111 0 Td +(be )Tj +1.555 0 Td +(created )Tj +3.666 0 Td +(and )Tj +2.111 0 Td +(merged )Tj +3.721 0 Td +(\(that )Tj +2.389 0 Td +(is, )Tj +-41.255 -1.44 Td +(attac)Tj +2.038 0 Td +(hed\). )Tj +2.759 0 Td +(It )Tj +1.147 0 Td +(is )Tj +1.258 0 Td +(important )Tj +4.759 0 Td +(to )Tj +1.425 0 Td +(note )Tj +2.481 0 Td +(that )Tj +2.203 0 Td +(the )Tj +/TT1 1 Tf +1.925 0 Td +(javax.persistence.EntityManager#merge)Tj +/TT0 1 Tf +( )Tj +-19.996 -1.44 Td +(method )Tj +3.601 0 Td +(returns )Tj +3.267 0 Td +(an )Tj +1.378 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.822 0 Td +(attac)Tj +2.038 0 Td +(hed )Tj +1.934 0 Td +(instance, )Tj +4.157 0 Td +(but )Tj +1.712 0 Td +(the )Tj +1.656 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.266 0 Td +(itself )Tj +2.323 0 Td +(becomes )Tj +4.156 0 Td +(not )Tj +1.712 0 Td +(managed )Tj +4.267 0 Td +(after )Tj +-40.311 -1.44 Td +(the in)Tj +2.434 0 Td +(v)Tj +0.482 0 Td +(ocation.)Tj +/TT2 1 Tf +12 0 0 12 57 207.6 Tm +(When @Async)Tj +6.234 0 Td +(hronous Becomes Dangerous)Tj +/TT0 1 Tf +10 0 0 10 75 185.2 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.448 0 Td +(method )Tj +/TT1 1 Tf +3.671 0 Td +(store)Tj +/TT0 1 Tf +( )Tj +3.392 0 Td +(\(see )Tj +2.059 0 Td +(Listing )Tj +3.171 0 Td +(36\) )Tj +1.782 0 Td +(is )Tj +/TT1 1 Tf +1.059 0 Td +(void)Tj +/TT0 1 Tf +( )Tj +2.792 0 Td +(and )Tj +2.004 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.338 0 Td +(be )Tj +1.448 0 Td +(a )Tj +0.892 0 Td +(perfect )Tj +3.337 0 Td +(candidate )Tj +4.616 0 Td +(for )Tj +1.559 0 Td +(the )Tj +/C2_0 1 Tf +1.726 0 Td +<005A005D>Tj +/TT0 1 Tf +(re )Tj +-40.367 -1.44 Td +(and )Tj +2.251 0 Td +(forget\224 )Tj +3.528 0 Td +(communication )Tj +7.419 0 Td +(style. )Tj +2.825 0 Td +(Although )Tj +4.586 0 Td +(the )Tj +1.973 0 Td +(method )Tj +/TT1 1 Tf +3.918 0 Td +(store)Tj +/TT0 1 Tf +( )Tj +3.64 0 Td +(is )Tj +1.306 0 Td +(a )Tj +1.139 0 Td +(perfect )Tj +3.584 0 Td +(candidate )Tj +4.863 0 Td +(for )Tj +-41.033 -1.44 Td +(bac)Tj +1.538 0 Td +(kground )Tj +4.235 0 Td +(processing, )Tj +5.513 0 Td +(I )Tj +0.956 0 Td +(did )Tj +2.068 0 Td +(not )Tj +2.068 0 Td +(annotate )Tj +4.402 0 Td +(it )Tj +1.234 0 Td +(with )Tj +/TT1 1 Tf +2.568 0 Td +(@Asynchronous)Tj +/TT0 1 Tf +(. )Tj +8.683 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.734 0 Td +(reason )Tj +3.512 0 Td +(for )Tj +1.845 0 Td +(the )Tj +-40.866 -1.44 Td +(sync)Tj +1.927 0 Td +(hronous in)Tj +4.602 0 Td +(v)Tj +0.482 0 Td +(ocation is the indirect execution b)Tj +14.656 0 Td +(y a timer \()Tj +/TT1 1 Tf +(@Schedule)Tj +/TT0 1 Tf +(\): )Tj +/TT1 1 Tf +-21.667 -1.79 Td +( @Schedule\(minute = "*/5", hour = "*", persistent = false\))Tj +0 -1.79 TD +( public void persistHitsCache\(\) {)Tj +T* +( hitStore.store\(hitStatistics\);)Tj +ET + +endstream +endobj +186 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 187 0 R>>endobj +187 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(77)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( })Tj +ET +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 611.7 Tm +(A )Tj +1.361 0 Td +(sync)Tj +1.927 0 Td +(hronous )Tj +/TT1 1 Tf +4.196 0 Td +(store)Tj +/TT0 1 Tf +( )Tj +3.694 0 Td +(method )Tj +3.973 0 Td +(bloc)Tj +1.872 0 Td +(ks )Tj +1.583 0 Td +(the )Tj +2.028 0 Td +(timer )Tj +2.916 0 Td +(and )Tj +2.306 0 Td +(dela)Tj +1.804 0 Td +(ys )Tj +1.583 0 Td +(its )Tj +1.639 0 Td +(next )Tj +2.528 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation. )Tj +4.122 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(sync)Tj +1.927 0 Td +(hronous )Tj +4.04 0 Td +(execution )Tj +4.762 0 Td +(prev)Tj +1.877 0 Td +(ents )Tj +2.261 0 Td +(launc)Tj +2.372 0 Td +(hing )Tj +2.428 0 Td +(the )Tj +/TT1 1 Tf +1.872 0 Td +(persistHitsCache)Tj +/TT0 1 Tf +( )Tj +10.139 0 Td +(method )Tj +3.817 0 Td +(async)Tj +2.427 0 Td +(hronously )Tj +-37.92 -1.44 Td +(and )Tj +2.195 0 Td +(concurrently )Tj +6.029 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.083 0 Td +(timers. )Tj +3.472 0 Td +(Prev)Tj +1.877 0 Td +(enting )Tj +3.251 0 Td +(uncontrolled )Tj +6.086 0 Td +(gro)Tj +1.377 0 Td +(wth )Tj +2.195 0 Td +(of )Tj +1.417 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +4.085 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocations )Tj +4.196 0 Td +(is )Tj +-41.533 -1.44 Td +(crucial )Tj +3.239 0 Td +(for )Tj +1.461 0 Td +(the )Tj +1.628 0 Td +(stability )Tj +3.629 0 Td +(of )Tj +1.128 0 Td +(the )Tj +1.628 0 Td +(system. )Tj +3.461 0 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +1.627 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +3.796 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.518 0 Td +(requires )Tj +3.739 0 Td +(a )Tj +0.794 0 Td +(free )Tj +1.905 0 Td +(thread, )Tj +3.295 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +-41.644 -1.44 Td +(in )Tj +1.189 0 Td +(turn )Tj +2.078 0 Td +(binds )Tj +2.69 0 Td +(memory)Tj +3.463 0 Td +(. )Tj +0.633 0 Td +(Uncontrolled )Tj +6.08 0 Td +(thread )Tj +3.078 0 Td +(creation )Tj +3.856 0 Td +(causes )Tj +/TT1 1 Tf +3.189 0 Td +(OutOfMemoryError)Tj +/TT0 1 Tf +(, )Tj +10.234 0 Td +(so )Tj +1.3 0 Td +(the )Tj +1.689 0 Td +(thread )Tj +-39.477 -1.44 Td +(pool responsible for handling )Tj +/TT1 1 Tf +(@Asynchronous)Tj +/TT0 1 Tf +( methods w)Tj +25.687 0 Td +(ould ha)Tj +3.25 0 Td +(v)Tj +0.488 0 Td +(e been bounded an)Tj +8.32 0 Td +(yw)Tj +1.26 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(.)Tj +-38.083 -2.24 Td +(Ov)Tj +1.321 0 Td +(er)Tj +0.821 0 Td +(abundant )Tj +4.536 0 Td +(threads )Tj +3.59 0 Td +(caused )Tj +3.479 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.978 0 Td +(timer )Tj +2.7 0 Td +(executions )Tj +5.091 0 Td +(of )Tj +1.312 0 Td +(the )Tj +1.812 0 Td +(slo)Tj +1.211 0 Td +(w)Tj +0.704 0 Td +(, )Tj +0.756 0 Td +(but )Tj +1.868 0 Td +(async)Tj +2.427 0 Td +(hronous, )Tj +/TT1 1 Tf +4.258 0 Td +(store)Tj +/TT0 1 Tf +( )Tj +-39.2 -1.44 Td +(method )Tj +3.606 0 Td +(is )Tj +0.994 0 Td +(theoretically )Tj +5.662 0 Td +(a )Tj +0.827 0 Td +(possibility)Tj +4.244 0 Td +(, )Tj +0.605 0 Td +(but )Tj +1.717 0 Td +(this )Tj +1.828 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.273 0 Td +(occur )Tj +2.772 0 Td +(only )Tj +2.217 0 Td +(if )Tj +0.883 0 Td +(the )Tj +/TT1 1 Tf +1.661 0 Td +(store)Tj +/TT0 1 Tf +( )Tj +3.327 0 Td +(method )Tj +3.606 0 Td +(takes )Tj +2.494 0 Td +(longer )Tj +-39.477 -1.44 Td +(than )Tj +2.436 0 Td +(the )Tj +1.88 0 Td +(sc)Tj +0.871 0 Td +(heduled )Tj +4.048 0 Td +(time. )Tj +2.713 0 Td +(In )Tj +1.38 0 Td +(the )Tj +1.88 0 Td +(current )Tj +3.602 0 Td +(setup)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.075 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.046 0 Td +(persists )Tj +3.658 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.879 0 Td +(60 )Tj +1.658 0 Td +(seconds. )Tj +4.196 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.602 0 Td +(slo)Tj +1.211 0 Td +(west)Tj +( )Tj +-40.255 -1.44 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation ev)Tj +4.49 0 Td +(er of the method )Tj +/TT1 1 Tf +(store)Tj +/TT0 1 Tf +( took 600 ms and the a)Tj +20.256 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age is about 10 ms.)Tj +/TT3 1 Tf +12 0 0 12 57 437.7 Tm +(Who Reads Logs\227Or Ho)Tj +10.991 0 Td +(w to Monitor )Tj +5.966 0 Td +(Y)Tj +0.482 0 Td +(our )Tj +1.742 0 Td +(Application)Tj +/TT0 1 Tf +10 0 0 10 75 415.3 Tm +(Logging )Tj +3.799 0 Td +(is )Tj +1.076 0 Td +(ubiquitous. )Tj +5.209 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.909 0 Td +(don\222)Tj +1.909 0 Td +(t )Tj +0.687 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.465 0 Td +(question )Tj +4.078 0 Td +(w)Tj +0.76 0 Td +(hether )Tj +3.132 0 Td +(to )Tj +1.243 0 Td +(write )Tj +2.576 0 Td +(logs )Tj +2.132 0 Td +(an)Tj +1.038 0 Td +(ymore; )Tj +3.409 0 Td +(instead, )Tj +3.744 0 Td +(we )Tj +-40.922 -1.44 Td +(d)Tj +0.612 0 Td +(e)Tj +0.556 0 Td +(b)Tj +0.612 0 Td +(a)Tj +0.556 0 Td +(t)Tj +0.334 0 Td +(e )Tj +1.306 0 Td +(h)Tj +0.612 0 Td +(o)Tj +0.6 0 Td +(w )Tj +1.584 0 Td +(t)Tj +0.334 0 Td +(o )Tj +1.362 0 Td +(w)Tj +0.834 0 Td +(r)Tj +0.389 0 Td +(i)Tj +0.334 0 Td +(t)Tj +0.334 0 Td +(e )Tj +1.306 0 Td +(t)Tj +0.334 0 Td +(h)Tj +0.612 0 Td +(e)Tj +0.556 0 Td +(m)Tj +0.889 0 Td +(. )Tj +1.01 0 Td +(T)Tj +0.567 0 Td +(h)Tj +0.612 0 Td +(e )Tj +1.306 0 Td +(d)Tj +0.612 0 Td +(i)Tj +0.334 0 Td +(s)Tj +0.445 0 Td +(c)Tj +0.556 0 Td +(u)Tj +0.612 0 Td +(s)Tj +0.445 0 Td +(s)Tj +0.445 0 Td +(i)Tj +0.334 0 Td +(o)Tj +0.612 0 Td +(n )Tj +1.362 0 Td +(u)Tj +0.612 0 Td +(s)Tj +0.445 0 Td +(u)Tj +0.612 0 Td +(a)Tj +0.556 0 Td +(l)Tj +0.334 0 Td +(l)Tj +0.334 0 Td +(y )Tj +1.306 0 Td +(s)Tj +0.445 0 Td +(t)Tj +0.334 0 Td +(a)Tj +0.556 0 Td +(r)Tj +0.389 0 Td +(t)Tj +0.334 0 Td +(s )Tj +1.195 0 Td +(w)Tj +0.834 0 Td +(i)Tj +0.334 0 Td +(t)Tj +0.334 0 Td +(h )Tj +1.362 0 Td +(c)Tj +0.538 0 Td +(h)Tj +0.612 0 Td +(o)Tj +0.612 0 Td +(o)Tj +0.612 0 Td +(s)Tj +0.445 0 Td +(i)Tj +0.334 0 Td +(n)Tj +0.612 0 Td +(g )Tj +1.306 0 Td +(b)Tj +0.612 0 Td +(u)Tj +0.612 0 Td +(i)Tj +0.334 0 Td +(l)Tj +0.334 0 Td +(t)Tj +0.334 0 Td +(-)Tj +0.389 0 Td +(i)Tj +0.334 0 Td +(n )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(j)Tj +0.607 0 Td +(a)Tj +0.607 0 Td +(v)Tj +0.607 0 Td +(a)Tj +0.607 0 Td +(.)Tj +0.607 0 Td +(u)Tj +0.607 0 Td +(t)Tj +0.607 0 Td +(i)Tj +0.607 0 Td +(l)Tj +0.607 0 Td +(.)Tj +0.607 0 Td +(l)Tj +0.607 0 Td +(o)Tj +0.607 0 Td +(g)Tj +0.607 0 Td +(g)Tj +0.607 0 Td +(i)Tj +0.607 0 Td +(n)Tj +0.607 0 Td +(g)Tj +/TT0 1 Tf +0.607 0 Td +(, )Tj +1.059 0 Td +(S)Tj +0.506 0 Td +(i)Tj +0.284 0 Td +(m)Tj +0.839 0 Td +(p)Tj +0.562 0 Td +(l)Tj +0.284 0 Td +(e )Tj +1.281 0 Td +(L)Tj +0.506 0 Td +(o)Tj +0.562 0 Td +(g)Tj +0.506 0 Td +(g)Tj +0.506 0 Td +(i)Tj +0.284 0 Td +(n)Tj +0.562 0 Td +(g )Tj +1.281 0 Td +(F)Tj +0.451 0 Td +(a)Tj +0.506 0 Td +(c)Tj +0.506 0 Td +(a)Tj +0.506 0 Td +(d)Tj +0.562 0 Td +(e )Tj +1.281 0 Td +(f)Tj +0.284 0 Td +(o)Tj +0.562 0 Td +(r )Tj +1.114 0 Td +(J)Tj +0.272 0 Td +(a)Tj +0.476 0 Td +(v)Tj +0.482 0 Td +(a )Tj +1.281 0 Td +(\()Tj +0.284 0 Td +(S)Tj +0.506 0 Td +(L)Tj +0.506 0 Td +(F)Tj +0.506 0 Td +(J)Tj +0.284 0 Td +(\) )Tj +1.059 0 Td +(\()Tj +0.284 0 Td +(h)Tj +0.562 0 Td +(t)Tj +0.284 0 Td +(t)Tj +0.284 0 Td +(p)Tj +0.562 0 Td +(:)Tj +0.284 0 Td +(/)Tj +0.284 0 Td +(/)Tj +0.284 0 Td +(w)Tj +0.784 0 Td +(w)Tj +0.784 0 Td +(w)Tj +0.71 0 Td +(.)Tj +0.284 0 Td +(s)Tj +0.395 0 Td +(l)Tj +0.284 0 Td +(f)Tj +0.284 0 Td +(4)Tj +0.562 0 Td +(j)Tj +0.284 0 Td +(.)Tj +0.284 0 Td +(o)Tj +0.562 0 Td +(r)Tj +0.339 0 Td +(g)Tj +0.506 0 Td +(/)Tj +0.284 0 Td +(\))Tj +0.284 0 Td +(, )Tj +1.059 0 Td +(o)Tj +0.562 0 Td +(r)Tj +( )Tj +-41.867 -1.44 Td +(Commons Logging \()Tj +(http://commons.apac)Tj +17.655 0 Td +(he.org/logging/)Tj +(\) libr)Tj +8.436 0 Td +(aries. )Tj +-24.291 -2.24 Td +(A )Tj +1.15 0 Td +(more )Tj +2.705 0 Td +(interesting )Tj +4.929 0 Td +(question )Tj +4.152 0 Td +(is )Tj +1.15 0 Td +(not )Tj +1.873 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.261 0 Td +(to )Tj +1.317 0 Td +(write )Tj +2.65 0 Td +(logs, )Tj +2.484 0 Td +(but )Tj +1.873 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.817 0 Td +(information )Tj +5.485 0 Td +(a )Tj +0.983 0 Td +(log )Tj +1.817 0 Td +(should )Tj +-39.309 -1.44 Td +(include. )Tj +3.819 0 Td +(It )Tj +0.873 0 Td +(is )Tj +0.984 0 Td +(also )Tj +2.04 0 Td +(useful )Tj +2.874 0 Td +(to )Tj +1.151 0 Td +(kno)Tj +1.6 0 Td +(w )Tj +1.095 0 Td +(w)Tj +0.76 0 Td +(ho )Tj +1.429 0 Td +(actually )Tj +3.707 0 Td +(will )Tj +1.929 0 Td +(read )Tj +2.206 0 Td +(the )Tj +1.651 0 Td +(log )Tj +/C2_0 1 Tf +1.651 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.04 0 Td +(and )Tj +1.929 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.095 0 Td +(the )Tj +1.651 0 Td +(log )Tj +/C2_0 1 Tf +1.651 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.04 0 Td +(can )Tj +1.873 0 Td +(be )Tj +-41.144 -1.44 Td +(accessed. )Tj +4.575 0 Td +(Sometimes)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.38 0 Td +(it )Tj +1.019 0 Td +(might )Tj +2.908 0 Td +(be )Tj +/C2_0 1 Tf +1.519 0 Td +<003C0041003E005D>Tj +/TT0 1 Tf +(cult, )Tj +4.021 0 Td +(or )Tj +1.352 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.519 0 Td +(impossible, )Tj +5.354 0 Td +(to )Tj +1.297 0 Td +(access )Tj +3.241 0 Td +(a )Tj +/C2_0 1 Tf +0.963 0 Td +<005D>Tj +ET +BT +/TT0 1 Tf +10 0 0 10 403.968 320.9 Tm +(le )Tj +1.241 0 Td +(system )Tj +3.352 0 Td +(on )Tj +1.575 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(production mac)Tj +/C2_0 1 Tf +6.818 0 Td +<004000410046003D000B0001002500460001004C00400041004B0001003B0039004B003D0009000100440047003F0001005D>Tj +/TT0 1 Tf +(les become w)Tj +15.884 0 Td +(orthless for debugging purposes.)Tj +-20.902 -2.24 Td +(In )Tj +1.149 0 Td +(the )Tj +1.649 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.815 0 Td +(case)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.454 0 Td +(I\222m )Tj +1.704 0 Td +(also )Tj +2.038 0 Td +(in )Tj +1.149 0 Td +(the )Tj +1.649 0 Td +(\223oper)Tj +2.377 0 Td +(ations\224 )Tj +3.316 0 Td +(role )Tj +1.982 0 Td +(so )Tj +1.26 0 Td +(I )Tj +0.593 0 Td +(can )Tj +1.871 0 Td +(freely )Tj +2.704 0 Td +(c)Tj +0.482 0 Td +(hoose )Tj +2.872 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.649 0 Td +(will )Tj +1.927 0 Td +(be )Tj +1.371 0 Td +(written )Tj +-39.199 -1.44 Td +(to )Tj +1.339 0 Td +(log )Tj +/C2_0 1 Tf +1.839 0 Td +<005D>Tj +/TT0 1 Tf +(les, )Tj +2.506 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.283 0 Td +(it )Tj +1.061 0 Td +(will )Tj +2.117 0 Td +(be )Tj +1.561 0 Td +(written, )Tj +3.784 0 Td +(and )Tj +2.117 0 Td +(w)Tj +0.76 0 Td +(hen )Tj +2.117 0 Td +(it )Tj +1.061 0 Td +(will )Tj +2.117 0 Td +(be )Tj +1.561 0 Td +(written. )Tj +3.747 0 Td +(Writing )Tj +3.728 0 Td +(logs )Tj +2.228 0 Td +(for )Tj +1.672 0 Td +(debugging )Tj +-37.698 -1.44 Td +(purposes is not important, because I\222m able to remotely debug the app\ lication an)Tj +34.886 0 Td +(y time. )Tj +-33.086 -2.24 Td +(More )Tj +2.676 0 Td +(interesting )Tj +4.844 0 Td +(is )Tj +1.065 0 Td +(the )Tj +1.732 0 Td +(performance )Tj +5.843 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.065 0 Td +(in )Tj +1.232 0 Td +(the )Tj +1.732 0 Td +(production )Tj +5.123 0 Td +(en)Tj +1.044 0 Td +(vironment. )Tj +5.066 0 Td +(I )Tj +0.676 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.287 0 Td +(curious )Tj +-39.032 -1.44 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.382 0 Td +(slo)Tj +1.211 0 Td +(w)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.632 0 Td +(simple, )Tj +3.716 0 Td +(and )Tj +2.216 0 Td +(unoptimized )Tj +6.051 0 Td +(code )Tj +2.716 0 Td +(is )Tj +1.271 0 Td +(and )Tj +2.216 0 Td +(w)Tj +0.76 0 Td +(hether )Tj +3.327 0 Td +(there )Tj +2.771 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.493 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.104 0 Td +(need )Tj +2.716 0 Td +(for )Tj +1.771 0 Td +(action. )Tj +-39.254 -1.44 Td +(S)Tj +0.545 0 Td +(y)Tj +0.545 0 Td +(s)Tj +0.434 0 Td +(t)Tj +0.323 0 Td +(e)Tj +0.545 0 Td +(m)Tj +0.878 0 Td +(a)Tj +0.545 0 Td +(t)Tj +0.323 0 Td +(i)Tj +0.323 0 Td +(c )Tj +1.3 0 Td +(p)Tj +0.601 0 Td +(e)Tj +0.545 0 Td +(r)Tj +0.378 0 Td +(f)Tj +0.323 0 Td +(o)Tj +0.601 0 Td +(r)Tj +0.378 0 Td +(m)Tj +0.878 0 Td +(a)Tj +0.545 0 Td +(n)Tj +0.601 0 Td +(c)Tj +0.545 0 Td +(e )Tj +1.3 0 Td +(m)Tj +0.878 0 Td +(e)Tj +0.545 0 Td +(a)Tj +0.545 0 Td +(s)Tj +0.434 0 Td +(u)Tj +0.601 0 Td +(r)Tj +0.378 0 Td +(e)Tj +0.545 0 Td +(m)Tj +0.878 0 Td +(e)Tj +0.545 0 Td +(n)Tj +0.601 0 Td +(t)Tj +0.323 0 Td +(s )Tj +1.189 0 Td +(a)Tj +0.545 0 Td +(r)Tj +0.378 0 Td +(e )Tj +1.3 0 Td +(a)Tj +0.545 0 Td +(c)Tj +0.545 0 Td +(c)Tj +0.545 0 Td +(o)Tj +0.601 0 Td +(m)Tj +0.878 0 Td +(p)Tj +0.601 0 Td +(l)Tj +0.323 0 Td +(i)Tj +0.323 0 Td +(s)Tj +0.434 0 Td +(h)Tj +0.601 0 Td +(e)Tj +0.545 0 Td +(d )Tj +1.356 0 Td +(b)Tj +0.583 0 Td +(y )Tj +1.3 0 Td +(a)Tj +0.545 0 Td +(n )Tj +1.356 0 Td +(E)Tj +0.545 0 Td +(J)Tj +0.323 0 Td +(B )Tj +1.411 0 Td +(3 )Tj +1.356 0 Td +(i)Tj +0.323 0 Td +(n)Tj +0.601 0 Td +(t)Tj +0.323 0 Td +(e)Tj +0.545 0 Td +(r)Tj +0.366 0 Td +(c)Tj +0.545 0 Td +(e)Tj +0.545 0 Td +(p)Tj +0.601 0 Td +(t)Tj +0.323 0 Td +(o)Tj +0.601 0 Td +(r)Tj +0.304 0 Td +(. )Tj +/TT1 1 Tf +-41.922 -1.44 Td +(PerformanceAuditor)Tj +/TT0 1 Tf +( )Tj +11.171 0 Td +(measures )Tj +4.37 0 Td +(the )Tj +1.704 0 Td +(performance )Tj +5.815 0 Td +(and )Tj +1.982 0 Td +(logs )Tj +2.093 0 Td +(exceptions )Tj +4.983 0 Td +(of )Tj +1.204 0 Td +(all )Tj +1.426 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.482 0 Td +(methods )Tj +-38.532 -1.44 Td +(\(see Listing 38\).)Tj +/TT1 1 Tf +0 -1.79 TD +(public class PerformanceAuditor {)Tj +0 -1.79 TD +( private static final Logger LOG = Logger.getLogger)Tj +0 -0.99 TD +(\(PerformanceAuditor.class.getName\(\)\);)Tj +0 -3.58 TD +( @AroundTimeout)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 75.9 Tm +( @AroundInvoke)Tj +ET +Q + +endstream +endobj +188 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 189 0 R>>endobj +189 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(78)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( public Object measurePerformance\(InvocationContext context\) throws\ )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 624.2 Tm +(Exception{)Tj +0 -1.79 TD +( String methodName = context.getMethod\(\).toString\(\);)Tj +T* +( long start = System.currentTimeMillis\(\);)Tj +T* +( try{)Tj +T* +( return context.proceed\(\);)Tj +0 -1.79 TD +( }catch\(Exception e\){)Tj +0 -1.79 TD +( LOG.log\(Level.SEVERE, "!!!During invocation of: {0} )Tj +0 -0.99 TD +(exception occured: {1}", new Object[]{methodName,e}\);)Tj +0 -1.79 TD +( throw e;)Tj +0 -1.79 TD +( }finally{)Tj +T* +( LOG.log\(Level.INFO, "{0} performed in: {1}", new Object[])Tj +0 -0.99 TD +({methodName, \(System.currentTimeMillis\(\) - start\)}\);)Tj +0 -1.79 TD +( })Tj +T* +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 38: P)Tj +5.236 0 Td +(erformance Logging Inter)Tj +10.768 0 Td +(ceptor)Tj +-14.204 -2.24 Td +(All )Tj +1.854 0 Td +(boundaries )Tj +5.411 0 Td +(and )Tj +2.243 0 Td +(services )Tj +4.02 0 Td +(were )Tj +2.742 0 Td +(inter)Tj +1.933 0 Td +(cepted )Tj +3.521 0 Td +(and )Tj +2.243 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +1.187 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.855 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.52 0 Td +(logged )Tj +3.521 0 Td +(in )Tj +1.465 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(follo)Tj +1.934 0 Td +(wing format:)Tj +/TT1 1 Tf +-1.934 -1.79 Td +([#|2011-02-16T19:06:00.944+0100|INFO|glassfish3.0.1|)Tj +0 -0.99 TD +(com.abien.xray.business.monitoring.PerformanceAuditor|)Tj +0 -0.99 TD +(_ThreadID=130998;_ThreadName=Thread-1;|public void )Tj +/TT2 1 Tf +0 -0.99 TD +(com.abien.xray.business.store.boundary.Hits.persistHitsCache\(\) )Tj +T* +(performed in: 892)Tj +/TT1 1 Tf +(|#])Tj +/TT0 1 Tf +1.8 -2.24 Td +(It )Tj +0.919 0 Td +(w)Tj +0.766 0 Td +(orked, )Tj +3.086 0 Td +(but )Tj +1.753 0 Td +(the )Tj +1.697 0 Td +(log )Tj +/C2_0 1 Tf +1.697 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.086 0 Td +(grew )Tj +2.474 0 Td +(in )Tj +1.197 0 Td +(an )Tj +1.419 0 Td +(uncontrolled )Tj +5.866 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.113 0 Td +(and )Tj +1.975 0 Td +(I )Tj +0.641 0 Td +(had )Tj +1.975 0 Td +(to )Tj +1.197 0 Td +(use )Tj +1.808 0 Td +(a )Tj +0.863 0 Td +(combination )Tj +5.81 0 Td +(of )Tj +/TT1 1 Tf +-41.366 -1.44 Td +(tail)Tj +/TT0 1 Tf +( )Tj +2.766 0 Td +(and )Tj +/TT1 1 Tf +1.977 0 Td +(grep)Tj +/TT0 1 Tf +( )Tj +2.766 0 Td +(commands )Tj +5.088 0 Td +(to )Tj +/C2_0 1 Tf +1.199 0 Td +<005D>Tj +/TT0 1 Tf +(lter )Tj +2.31 0 Td +(the )Tj +1.699 0 Td +(interesting )Tj +4.811 0 Td +(information. )Tj +5.645 0 Td +(Most )Tj +2.477 0 Td +(of )Tj +1.199 0 Td +(the )Tj +1.699 0 Td +(method )Tj +3.644 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocations)Tj +( )Tj +-38.587 -1.44 Td +(were performed in 0 ms, w)Tj +11.596 0 Td +(hic)Tj +1.316 0 Td +(h made also the majority of the entries less interesting. )Tj +-11.112 -2.24 Td +(I )Tj +0.594 0 Td +(r)Tj +0.321 0 Td +(arely )Tj +2.427 0 Td +(sear)Tj +1.71 0 Td +(c)Tj +0.482 0 Td +(hed )Tj +1.928 0 Td +(the )Tj +1.65 0 Td +(log )Tj +/C2_0 1 Tf +1.65 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.039 0 Td +(and )Tj +1.928 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.205 0 Td +(more )Tj +2.538 0 Td +(interested )Tj +4.484 0 Td +(in )Tj +1.15 0 Td +(the )Tj +1.65 0 Td +(current )Tj +3.372 0 Td +(state )Tj +2.261 0 Td +(of )Tj +1.15 0 Td +(the )Tj +1.65 0 Td +(system. )Tj +3.483 0 Td +(I )Tj +0.594 0 Td +(r)Tj +0.321 0 Td +(an )Tj +-41.144 -1.44 Td +(the )Tj +1.622 0 Td +(command )Tj +/TT1 1 Tf +4.622 0 Td +(tail )Tj +3.01 0 Td +(-f )Tj +1.81 0 Td +(server.log )Tj +6.611 0 Td +(| )Tj +1.21 0 Td +(grep )Tj +3.01 0 Td +(\221performed )Tj +6.611 0 Td +(in:\222)Tj +/TT0 1 Tf +( )Tj +2.688 0 Td +(all )Tj +1.344 0 Td +(the )Tj +1.622 0 Td +(time )Tj +2.177 0 Td +(to )Tj +1.122 0 Td +(get )Tj +1.566 0 Td +(an )Tj +1.344 0 Td +(idea)Tj +( )Tj +-40.366 -1.44 Td +(of )Tj +1.346 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.846 0 Td +(the )Tj +1.846 0 Td +(system )Tj +3.401 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.401 0 Td +(actually )Tj +3.902 0 Td +(doing. )Tj +3.236 0 Td +(Log )Tj +/C2_0 1 Tf +2.068 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.235 0 Td +(are )Tj +1.845 0 Td +(misused )Tj +4.013 0 Td +(as )Tj +1.401 0 Td +(a )Tj +1.012 0 Td +(real)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(time )Tj +4.345 0 Td +(communication )Tj +-35.42 -1.44 Td +(medium w)Tj +4.594 0 Td +(hen no one is interested in historical content. )Tj +-2.794 -2.24 Td +(Instead )Tj +3.424 0 Td +(of )Tj +1.201 0 Td +(writing )Tj +3.368 0 Td +(the )Tj +1.701 0 Td +(entries )Tj +3.201 0 Td +(to )Tj +1.201 0 Td +(disk )Tj +2.09 0 Td +(as )Tj +1.256 0 Td +(strings )Tj +3.09 0 Td +(and )Tj +1.979 0 Td +(then )Tj +2.257 0 Td +(extr)Tj +1.599 0 Td +(acting )Tj +2.979 0 Td +(pieces )Tj +3.09 0 Td +(of )Tj +1.201 0 Td +(data )Tj +2.201 0 Td +(with )Tj +2.257 0 Td +(fanc)Tj +1.81 0 Td +(y )Tj +-41.7 -1.44 Td +(commands, )Tj +5.349 0 Td +(interesting )Tj +4.794 0 Td +(information )Tj +5.35 0 Td +(can )Tj +1.904 0 Td +(be )Tj +1.404 0 Td +(aggregated, )Tj +5.293 0 Td +(preprocessed)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.266 0 Td +(and )Tj +1.96 0 Td +(published )Tj +4.573 0 Td +(in )Tj +1.182 0 Td +(real )Tj +1.959 0 Td +(time. )Tj +-40.033 -1.44 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.459 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.847 0 Td +(Management )Tj +5.959 0 Td +(Extensions )Tj +4.849 0 Td +(\(JMX\) )Tj +2.681 0 Td +(it )Tj +0.903 0 Td +(is )Tj +1.014 0 Td +(tri)Tj +0.871 0 Td +(vial )Tj +1.903 0 Td +(to )Tj +1.181 0 Td +(expose )Tj +3.348 0 Td +(useful )Tj +2.904 0 Td +(management )Tj +5.903 0 Td +(information )Tj +5.349 0 Td +(to )Tj +-41.366 -1.44 Td +(an easily accessible management infr)Tj +15.992 0 Td +(astructure, suc)Tj +6.206 0 Td +(h as )Tj +1.909 0 Td +(V)Tj +0.63 0 Td +(isualVM, as type-safe J)Tj +9.658 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a objects. )Tj +ET + +endstream +endobj +190 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 191 0 R>>endobj +191 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(79)Tj +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 615.5999 Tm +(MXBeans\227T)Tj +5.567 0 Td +(he Easy )Tj +3.464 0 Td +(W)Tj +0.963 0 Td +(a)Tj +0.47 0 Td +(y to Expose Cohesi)Tj +8.152 0 Td +(v)Tj +0.488 0 Td +(e Data)Tj +/TT0 1 Tf +10 0 0 10 75 593.2 Tm +(MXBeans )Tj +4.515 0 Td +(are )Tj +1.792 0 Td +(an )Tj +1.515 0 Td +(easy-to-use )Tj +5.293 0 Td +(extension )Tj +4.572 0 Td +(of )Tj +1.293 0 Td +(the )Tj +1.793 0 Td +(standard )Tj +4.127 0 Td +(MBeans. )Tj +4.09 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.571 0 Td +(only )Tj +2.349 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.959 0 Td +(to )Tj +1.293 0 Td +(use )Tj +1.904 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(MXBean )Tj +3.967 0 Td +(ending )Tj +3.246 0 Td +(in )Tj +1.134 0 Td +(the )Tj +1.634 0 Td +(interface )Tj +4.023 0 Td +(instead )Tj +3.357 0 Td +(of )Tj +1.134 0 Td +(MBean )Tj +3.356 0 Td +(\(see )Tj +1.967 0 Td +(Listing )Tj +3.079 0 Td +(39\). )Tj +1.894 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.356 0 Td +(name )Tj +2.689 0 Td +(of )Tj +1.134 0 Td +(the )Tj +1.634 0 Td +(realizing )Tj +4.023 0 Td +(class )Tj +-40.144 -1.44 Td +(does )Tj +2.442 0 Td +(not )Tj +1.831 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.941 0 Td +(a )Tj +/C2_0 1 Tf +0.941 0 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(x. )Tj +2.998 0 Td +(Getters )Tj +3.497 0 Td +(are )Tj +1.774 0 Td +(exposed )Tj +3.998 0 Td +(as )Tj +1.33 0 Td +(read-only )Tj +4.553 0 Td +(properties, )Tj +4.998 0 Td +(and )Tj +2.053 0 Td +(setters )Tj +3.108 0 Td +(are )Tj +1.774 0 Td +(needed )Tj +3.609 0 Td +(to )Tj +-41.366 -1.44 Td +(make )Tj +2.737 0 Td +(the )Tj +1.738 0 Td +(properties )Tj +4.683 0 Td +(c)Tj +0.482 0 Td +(hangeable )Tj +4.85 0 Td +(remotely )Tj +4.182 0 Td +(via )Tj +1.682 0 Td +(the )Tj +1.738 0 Td +(JMX )Tj +2.182 0 Td +(agent. )Tj +3.016 0 Td +(Methods )Tj +4.128 0 Td +(appear )Tj +3.349 0 Td +(as )Tj +1.293 0 Td +(buttons )Tj +3.573 0 Td +(in )Tj +1.238 0 Td +(the )Tj +-40.866 -1.44 Td +(oper)Tj +1.933 0 Td +(ation area and can also be in)Tj +12.438 0 Td +(v)Tj +0.482 0 Td +(oked remotely)Tj +6.076 0 Td +(.)Tj +-19.129 -2.24 Td +(In the context of x-r)Tj +8.436 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(, particularly interesting are the top w)Tj +16.105 0 Td +(orst-performing methods. )Tj +/TT2 1 Tf +-27.219 -1.79 Td +(public interface MonitoringResource)Tj +/TT3 1 Tf +(MXBean)Tj +/TT2 1 Tf +( {)Tj +0 -1.79 TD +( List getSlowestMethods\(\);)Tj +0 -1.79 TD +( Map getDiagnostics\(\);)Tj +0 -1.79 TD +( String getNumberOfExceptions\(\);)Tj +T* +( void clear\(\);)Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 39: MXBean Needed for Exposure to JConsole)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.377 0 Td +(slo)Tj +1.211 0 Td +(west )Tj +2.266 0 Td +(methods )Tj +3.989 0 Td +(are )Tj +1.654 0 Td +(exposed )Tj +3.878 0 Td +(with )Tj +2.211 0 Td +(the )Tj +/TT2 1 Tf +1.655 0 Td +(List )Tj +10.245 0 Td +(getSlowestMethods\(\))Tj +/TT0 1 Tf +( )Tj +-30.798 -1.44 Td +(method. )Tj +3.761 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT2 1 Tf +(Invocation)Tj +/TT0 1 Tf +( class is a typical J)Tj +15.104 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(aBean with read-only properties \(Listing 40\).)Tj +/TT2 1 Tf +-18.522 -2.12 Td +(@XmlRootElement)Tj +-1.8 -1.79 Td +(@XmlAccessorType\(XmlAccessType.FIELD\))Tj +0 -1.79 TD +(public class Invocation implements Comparable{)Tj +0 -1.79 TD +( @XmlAttribute)Tj +0 -1.79 TD +( private String methodName;)Tj +T* +( @XmlAttribute)Tj +0 -1.79 TD +( private Long invocationPerformance;)Tj +0 -3.58 TD +( public Invocation\(String methodName, long invocationPerformance\) {\ )Tj +0 -1.79 TD +( this.methodName = methodName;)Tj +T* +( this.invocationPerformance = invocationPerformance;)Tj +0 -1.79 TD +( })Tj +ET +q +52 72 432 569 re +W n +BT +/TT2 1 Tf +10 0 0 10 57 78.4 Tm +( public Invocation\(\) { /* JAXB...*/})Tj +ET +Q + +endstream +endobj +192 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 193 0 R>>endobj +193 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(80)Tj +/TT1 1 Tf +0 Tc 0 Tw -20.432 55.72 Td +( public String getMethodName\(\) {)Tj +0 -1.79 TD +( return methodName;)Tj +0 -1.79 TD +( })Tj +T* +( public long getInvocationPerformance\(\) {)Tj +T* +( return invocationPerformance;)Tj +T* +( })Tj +T* +( public boolean isSlowerThan\(Invocation invocation\){)Tj +T* +( return this.compareTo\(invocation\) > 0;)Tj +T* +( })Tj +T* +( @Override)Tj +0 -1.79 TD +( public int compareTo\(Invocation anotherInvocation\){)Tj +0 -1.79 TD +( return this.invocationPerformance.compareTo)Tj +0 -0.99 TD +(\(anotherInvocation.invocationPerformance\);)Tj +0 -1.79 TD +( })Tj +T* +(//\205equals, hashCode and toString are not included)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 40: J)Tj +4.991 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(aBean Exposed via JMX)Tj +-4.137 -2.24 Td +(Only )Tj +2.63 0 Td +(the )Tj +1.797 0 Td +(getters )Tj +3.241 0 Td +(are )Tj +1.796 0 Td +(crucial )Tj +3.408 0 Td +(for )Tj +1.63 0 Td +(the )Tj +1.797 0 Td +(JMX )Tj +2.241 0 Td +(exposure. )Tj +4.557 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.519 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.926 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hitecture )Tj +4.242 0 Td +(for )Tj +1.63 0 Td +(XML )Tj +2.463 0 Td +(Binding )Tj +-38.865 -1.44 Td +(\(J)Tj +0.538 0 Td +(AXB\) )Tj +2.521 0 Td +(annotations )Tj +5.357 0 Td +(\(for )Tj +1.799 0 Td +(example, )Tj +/TT1 1 Tf +4.299 0 Td +(@XmlRootElement)Tj +/TT0 1 Tf +(\) )Tj +9.634 0 Td +(are )Tj +1.687 0 Td +(used )Tj +2.355 0 Td +(only )Tj +2.244 0 Td +(for )Tj +1.521 0 Td +(JSON/XML )Tj +5.021 0 Td +(serialization )Tj +-36.976 -1.44 Td +(in )Tj +1.235 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.123 0 Td +(and )Tj +2.013 0 Td +(are )Tj +1.734 0 Td +(irrelev)Tj +2.698 0 Td +(ant )Tj +1.735 0 Td +(in )Tj +1.235 0 Td +(JMX. )Tj +2.383 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.457 0 Td +(class )Tj +/TT1 1 Tf +2.457 0 Td +(Invocation)Tj +/TT0 1 Tf +( )Tj +6.402 0 Td +(is )Tj +1.068 0 Td +(exposed )Tj +3.958 0 Td +(via )Tj +1.679 0 Td +(REST )Tj +2.568 0 Td +(in )Tj +1.235 0 Td +(par)Tj +1.377 0 Td +(allel )Tj +2.235 0 Td +(to)Tj +( )Tj +-41.366 -1.44 Td +(JMX. )Tj +2.355 0 Td +(W)Tj +0.982 0 Td +(ithout )Tj +2.838 0 Td +(MXBeans, )Tj +4.67 0 Td +(the )Tj +1.67 0 Td +(exposure )Tj +4.226 0 Td +(of )Tj +1.17 0 Td +(a )Tj +0.836 0 Td +(Data )Tj +2.318 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansfer )Tj +2.892 0 Td +(Object, )Tj +3.559 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.892 0 Td +(as )Tj +1.225 0 Td +(the )Tj +/TT1 1 Tf +1.67 0 Td +(Invocation)Tj +/TT0 1 Tf +( )Tj +6.337 0 Td +(class, )Tj +-39.866 -1.44 Td +(to )Tj +1.19 0 Td +(the )Tj +1.69 0 Td +(MBean )Tj +3.412 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.189 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.302 0 Td +(not )Tj +1.746 0 Td +(w)Tj +0.766 0 Td +(ork. )Tj +2.023 0 Td +(Only )Tj +2.523 0 Td +(unrelated )Tj +4.413 0 Td +(primiti)Tj +2.816 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.856 0 Td +(data )Tj +2.19 0 Td +(types )Tj +2.579 0 Td +(can )Tj +1.912 0 Td +(be )Tj +1.412 0 Td +(exposed )Tj +3.913 0 Td +(as )Tj +1.245 0 Td +(an)Tj +( )Tj +-41.144 -1.44 Td +(MBean. )Tj +/TT1 1 Tf +1.8 -2.24 Td +(MonitoringResourceMXBean)Tj +/TT0 1 Tf +( )Tj +14.848 0 Td +(is )Tj +1.112 0 Td +(implemented )Tj +6.113 0 Td +(directly )Tj +3.668 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.945 0 Td +(a )Tj +0.945 0 Td +(singleton )Tj +4.336 0 Td +(EJB )Tj +1.834 0 Td +(3.1 )Tj +1.835 0 Td +(bean )Tj +2.557 0 Td +(\(see)Tj +( )Tj +-40.533 -1.44 Td +(Listing 41\). It turns out that singletons are perfectly suited as an MX\ Bean implementation.)Tj +/TT1 1 Tf +0 -1.79 TD +(@Singleton)Tj +0 -1.79 TD +(@Startup)Tj +0 -1.79 TD +(@LocalBean)Tj +T* +(@Path\("monitoring"\))Tj +0 -1.79 TD +(@ConcurrencyManagement\(ConcurrencyManagementType.BEAN\))Tj +0 -1.79 TD +(public class MonitoringResource implements MonitoringResourceMXBean {)Tj +T* +( private MBeanServer platformMBeanServer;)Tj +ET + +endstream +endobj +194 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 196 0 R>>endobj +195 0 obj<>endobj +196 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(81)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( private ObjectName objectName = null;)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( private ConcurrentHashMap methods = new )Tj +0 -0.99 TD +(ConcurrentHashMap\(\);)Tj +0 -1.79 TD +( private ConcurrentHashMap diagnostics = new )Tj +0 -0.99 TD +(ConcurrentHashMap\(\);)Tj +0 -1.79 TD +( private AtomicLong exceptionCount;)Tj +0 -3.58 TD +( @PostConstruct)Tj +0 -1.79 TD +( public void registerInJMX\(\) {)Tj +0 -1.79 TD +( this.exceptionCount = new AtomicLong\(\);)Tj +0 -1.79 TD +( try{)Tj +T* +( objectName = new ObjectName)Tj +0 -0.99 TD +(\("XRayMonitoring:type="+this.getClass\(\).getName\(\)\);)Tj +0 -1.79 TD +( platformMBeanServer = )Tj +0 -0.99 TD +(ManagementFactory.getPlatformMBeanServer\(\);)Tj +0 -1.79 TD +( platformMBeanServer.registerMBean\(this,objectName\);)Tj +0 -1.79 TD +( }catch\(Exception e\){)Tj +0 -1.79 TD +( throw new IllegalStateException\("Problem during )Tj +0 -0.99 TD +(registration of Monitoring into JMX:" +e\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( @GET)Tj +0 -1.79 TD +( @Path\("exceptionCount"\))Tj +0 -1.79 TD +( @Produces\(MediaType.TEXT_PLAIN\))Tj +T* +( @Override)Tj +0 -1.79 TD +( public String getNumberOfExceptions\(\){)Tj +0 -1.79 TD +( return String.valueOf\(exceptionCount.get\(\)\);)Tj +0 -1.79 TD +( })Tj +0 -5.37 TD +( @Override)Tj +0 -1.79 TD +( public Map getDiagnostics\(\) {)Tj +0 -1.79 TD +( return diagnostics;)Tj +0 -1.79 TD +( })Tj +ET + +endstream +endobj +197 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 198 0 R>>endobj +198 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(82)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( @Override)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( @DELETE)Tj +0 -1.79 TD +( public void clear\(\){)Tj +T* +( methods.clear\(\);)Tj +T* +( })Tj +T* +( @PreDestroy)Tj +0 -1.79 TD +( public void unregisterFromJMX\(\){)Tj +0 -1.79 TD +( try{)Tj +0 -1.79 TD +( platformMBeanServer.unregisterMBean\(this.objectName\);)Tj +0 -1.79 TD +( }catch \(Exception e\){)Tj +0 -1.79 TD +( throw new IllegalStateException\("Problem during )Tj +0 -0.99 TD +(unregistration of Monitoring into JMX:" +e\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( })Tj +T* +(//bookkeeping methods omitted)Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 41: MX Bean/J)Tj +9.208 0 Td +(AX-RS Monitoring Hybrid)Tj +-7.408 -2.24 Td +(An )Tj +1.906 0 Td +(EJB )Tj +2.072 0 Td +(3.1 )Tj +2.073 0 Td +(singleton )Tj +4.574 0 Td +(exists )Tj +3.017 0 Td +(only )Tj +2.573 0 Td +(once )Tj +2.795 0 Td +(in )Tj +1.517 0 Td +(a )Tj +1.183 0 Td +(JVM. )Tj +2.721 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.739 0 Td +(@PostConstruct)Tj +/TT0 1 Tf +( )Tj +9.085 0 Td +(method )Tj +3.962 0 Td +(is )Tj +-41.533 -1.44 Td +(automatically )Tj +6.158 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.435 0 Td +(b)Tj +0.538 0 Td +(y )Tj +/TT1 1 Tf +0.823 0 Td +(@Startup )Tj +5.446 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +6.324 0 Td +(at )Tj +1.101 0 Td +(startup )Tj +3.213 0 Td +(or )Tj +1.212 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +2.99 0 Td +(time. )Tj +2.416 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.546 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +-40.533 -1.44 Td +(solv)Tj +1.711 0 Td +(es )Tj +1.542 0 Td +(the )Tj +1.987 0 Td +(MBean )Tj +3.709 0 Td +(registr)Tj +2.599 0 Td +(ation )Tj +2.821 0 Td +(problem. )Tj +4.506 0 Td +(A )Tj +1.32 0 Td +(JMX )Tj +2.431 0 Td +(bean )Tj +2.765 0 Td +(can )Tj +2.209 0 Td +(be )Tj +1.709 0 Td +(registered )Tj +4.82 0 Td +(only )Tj +2.543 0 Td +(once )Tj +2.765 0 Td +(at )Tj +1.431 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(M)Tj +0.668 0 Td +(B)Tj +0.668 0 Td +(e)Tj +0.668 0 Td +(a)Tj +0.668 0 Td +(n)Tj +0.668 0 Td +(S)Tj +0.668 0 Td +(e)Tj +0.668 0 Td +(r)Tj +0.668 0 Td +(v)Tj +0.668 0 Td +(e)Tj +0.668 0 Td +(r)Tj +/TT0 1 Tf +0.668 0 Td +(. )Tj +1.053 0 Td +(A)Tj +0.735 0 Td +(n )Tj +1.368 0 Td +(a)Tj +0.568 0 Td +(t)Tj +0.346 0 Td +(t)Tj +0.346 0 Td +(e)Tj +0.568 0 Td +(m)Tj +0.901 0 Td +(p)Tj +0.624 0 Td +(t )Tj +1.09 0 Td +(t)Tj +0.346 0 Td +(o )Tj +1.368 0 Td +(r)Tj +0.401 0 Td +(e)Tj +0.568 0 Td +(g)Tj +0.568 0 Td +(i)Tj +0.346 0 Td +(s)Tj +0.457 0 Td +(t)Tj +0.346 0 Td +(e)Tj +0.568 0 Td +(r )Tj +1.145 0 Td +(a)Tj +0.568 0 Td +(n )Tj +1.368 0 Td +(a)Tj +0.568 0 Td +(l)Tj +0.346 0 Td +(r)Tj +0.401 0 Td +(e)Tj +0.568 0 Td +(a)Tj +0.568 0 Td +(d)Tj +0.6 0 Td +(y )Tj +1.312 0 Td +(r)Tj +0.401 0 Td +(e)Tj +0.568 0 Td +(g)Tj +0.568 0 Td +(i)Tj +0.346 0 Td +(s)Tj +0.457 0 Td +(t)Tj +0.346 0 Td +(e)Tj +0.568 0 Td +(r)Tj +0.401 0 Td +(e)Tj +0.568 0 Td +(d )Tj +1.368 0 Td +(M)Tj +0.957 0 Td +(B)Tj +0.679 0 Td +(e)Tj +0.568 0 Td +(a)Tj +0.568 0 Td +(n )Tj +1.368 0 Td +(c)Tj +0.568 0 Td +(a)Tj +0.568 0 Td +(u)Tj +0.624 0 Td +(s)Tj +0.457 0 Td +(e)Tj +0.568 0 Td +(s )Tj +1.201 0 Td +(a)Tj +0.568 0 Td +(n )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(javax.management.InstanceAlreadyExistsException)Tj +/TT0 1 Tf +(. )Tj +28.805 0 Td +(It )Tj +0.879 0 Td +(is )Tj +0.99 0 Td +(impossible )Tj +4.936 0 Td +(to )Tj +1.157 0 Td +(implement )Tj +4.935 0 Td +(a )Tj +-41.7 -1.44 Td +(robust )Tj +3.156 0 Td +(MBean )Tj +3.544 0 Td +(registr)Tj +2.599 0 Td +(ation )Tj +2.656 0 Td +(with )Tj +2.378 0 Td +(stateless )Tj +3.989 0 Td +(session )Tj +3.545 0 Td +(beans )Tj +2.989 0 Td +(without )Tj +3.768 0 Td +(violating )Tj +4.212 0 Td +(the )Tj +/C2_0 1 Tf +1.822 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +5.935 0 Td +(and )Tj +-40.588 -1.44 Td +(progr)Tj +2.266 0 Td +(amming )Tj +3.809 0 Td +(restrictions, )Tj +5.255 0 Td +(in )Tj +1.143 0 Td +(particular)Tj +4.038 0 Td +(. )Tj +0.587 0 Td +(Upon )Tj +2.755 0 Td +(increasing )Tj +4.699 0 Td +(load, )Tj +2.477 0 Td +(the )Tj +1.643 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.142 0 Td +(creates )Tj +3.309 0 Td +(multiple )Tj +3.866 0 Td +(stateless )Tj +-38.699 -1.44 Td +(session )Tj +3.498 0 Td +(bean )Tj +2.553 0 Td +(instances. )Tj +4.591 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.497 0 Td +(@PostConstruct)Tj +/TT0 1 Tf +( )Tj +8.842 0 Td +(method )Tj +3.72 0 Td +(is )Tj +1.108 0 Td +(executed )Tj +4.331 0 Td +(once )Tj +2.553 0 Td +(per )Tj +1.83 0 Td +(created )Tj +3.608 0 Td +(instance )Tj +-38.643 -1.44 Td +(and the MXBean w)Tj +8.213 0 Td +(ould be registered multiple times.)Tj +-6.413 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.377 0 Td +(MonitoringResource)Tj +/TT0 1 Tf +( )Tj +11.123 0 Td +(bean )Tj +2.433 0 Td +(\(Listing )Tj +3.378 0 Td +(41\) )Tj +1.711 0 Td +(registers )Tj +3.821 0 Td +(itself )Tj +2.322 0 Td +(in )Tj +1.155 0 Td +(the )Tj +/TT1 1 Tf +1.655 0 Td +(MBeanServer)Tj +/TT0 1 Tf +( )Tj +6.922 0 Td +(at )Tj +1.099 0 Td +(startup)Tj +( )Tj +-39.31 -1.44 Td +(\()Tj +0.283 0 Td +(m)Tj +0.838 0 Td +(e)Tj +0.505 0 Td +(t)Tj +0.283 0 Td +(h)Tj +0.561 0 Td +(o)Tj +0.561 0 Td +(d )Tj +/TT1 1 Tf +1.336 0 Td +(r)Tj +0.605 0 Td +(e)Tj +0.605 0 Td +(g)Tj +0.605 0 Td +(i)Tj +0.605 0 Td +(s)Tj +0.605 0 Td +(t)Tj +0.605 0 Td +(e)Tj +0.605 0 Td +(r)Tj +0.605 0 Td +(I)Tj +0.605 0 Td +(n)Tj +0.605 0 Td +(J)Tj +0.605 0 Td +(M)Tj +0.605 0 Td +(X )Tj +/TT0 1 Tf +1.703 0 Td +(i)Tj +0.283 0 Td +(n )Tj +1.336 0 Td +(L)Tj +0.505 0 Td +(i)Tj +0.283 0 Td +(s)Tj +0.394 0 Td +(t)Tj +0.283 0 Td +(i)Tj +0.283 0 Td +(n)Tj +0.561 0 Td +(g )Tj +1.28 0 Td +(4)Tj +0.561 0 Td +(1)Tj +0.561 0 Td +(\) )Tj +1.058 0 Td +(a)Tj +0.505 0 Td +(n)Tj +0.561 0 Td +(d )Tj +1.336 0 Td +(u)Tj +0.561 0 Td +(n)Tj +0.561 0 Td +(r)Tj +0.338 0 Td +(e)Tj +0.505 0 Td +(g)Tj +0.505 0 Td +(i)Tj +0.283 0 Td +(s)Tj +0.394 0 Td +(t)Tj +0.283 0 Td +(e)Tj +0.505 0 Td +(r)Tj +0.338 0 Td +(s )Tj +1.169 0 Td +(a)Tj +0.505 0 Td +(t )Tj +1.058 0 Td +(s)Tj +0.394 0 Td +(h)Tj +0.561 0 Td +(u)Tj +0.561 0 Td +(t)Tj +0.283 0 Td +(d)Tj +0.561 0 Td +(o)Tj +0.549 0 Td +(w)Tj +0.783 0 Td +(n )Tj +1.336 0 Td +(i)Tj +0.283 0 Td +(n )Tj +1.336 0 Td +(t)Tj +0.283 0 Td +(h)Tj +0.561 0 Td +(e )Tj +1.28 0 Td +(m)Tj +0.838 0 Td +(e)Tj +0.505 0 Td +(t)Tj +0.283 0 Td +(h)Tj +0.561 0 Td +(o)Tj +0.561 0 Td +(d)Tj +( )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(unregisterFromJMX)Tj +/TT0 1 Tf +(.)Tj +1.8 -2.24 Td +(Singleton )Tj +4.424 0 Td +(EJB )Tj +1.811 0 Td +(3.1 )Tj +/TT1 1 Tf +1.812 0 Td +(MonitoringResource)Tj +/TT0 1 Tf +( )Tj +11.224 0 Td +(is )Tj +1.089 0 Td +(an )Tj +1.478 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.922 0 Td +(resour)Tj +2.655 0 Td +(ce, )Tj +1.7 0 Td +(and )Tj +2.034 0 Td +(it )Tj +0.978 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.7 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.922 0 Td +(to )Tj +1.256 0 Td +(be )Tj +-41.144 -1.44 Td +(managed )Tj +4.251 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.806 0 Td +(other )Tj +2.529 0 Td +(components. )Tj +5.79 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.862 0 Td +(the )Tj +1.64 0 Td +(contr)Tj +2.211 0 Td +(ary)Tj +1.241 0 Td +(, )Tj +0.584 0 Td +(it )Tj +0.862 0 Td +(can )Tj +1.862 0 Td +(be )Tj +1.362 0 Td +(easily )Tj +2.751 0 Td +(injected )Tj +3.752 0 Td +(to )Tj +1.14 0 Td +(other )Tj +2.529 0 Td +(components, )Tj +5.864 0 Td +(for )Tj +-41.033 -1.44 Td +(example, inter)Tj +6.156 0 Td +(ceptors. )Tj +/TT1 1 Tf +-4.356 -2.24 Td +(MonitoringResource)Tj +/TT0 1 Tf +( )Tj +11.106 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.193 0 Td +(injected )Tj +3.75 0 Td +(to )Tj +1.138 0 Td +(the )Tj +/TT1 1 Tf +1.638 0 Td +(PerformanceAuditor)Tj +/TT0 1 Tf +( )Tj +11.106 0 Td +(inter)Tj +1.933 0 Td +(ceptor )Tj +3.027 0 Td +(\(see )Tj +1.971 0 Td +(Listing )Tj +-39.421 -1.44 Td +(42\), )Tj +1.963 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.851 0 Td +(forw)Tj +1.927 0 Td +(ards )Tj +2.073 0 Td +(the )Tj +1.629 0 Td +(method )Tj +3.574 0 Td +(name, )Tj +2.962 0 Td +(measured )Tj +4.462 0 Td +(performance, )Tj +6.018 0 Td +(and )Tj +1.907 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.795 0 Td +(exceptions )Tj +4.908 0 Td +(that )Tj +1.907 0 Td +(occurred. )Tj +ET + +endstream +endobj +199 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 200 0 R>>endobj +200 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(83)Tj +0 Tc 0 Tw -20.432 57.06 Td +(So, I completely remo)Tj +9.435 0 Td +(v)Tj +0.488 0 Td +(ed logging statements in fa)Tj +11.419 0 Td +(v)Tj +0.482 0 Td +(or of JMX for performance analytics.)Tj +/TT1 1 Tf +-21.824 -1.79 Td +(public class PerformanceAuditor {)Tj +0 -1.79 TD +( private static final Logger LOG = Logger.getLogger)Tj +0 -0.99 TD +(\(PerformanceAuditor.class.getName\(\)\);)Tj +/TT2 1 Tf +0 -1.79 TD +( @EJB)Tj +T* +( MonitoringResource monitoring;)Tj +/TT1 1 Tf +0 -3.58 TD +( @AroundTimeout)Tj +0 -1.79 TD +( @AroundInvoke)Tj +T* +( public Object measurePerformance\(InvocationContext context\) throws\ )Tj +0 -0.99 TD +(Exception{)Tj +0 -1.79 TD +( String methodName = context.getMethod\(\).toString\(\);)Tj +0 -1.79 TD +( long start = System.currentTimeMillis\(\);)Tj +T* +( try{)Tj +T* +( return context.proceed\(\);)Tj +T* +( }catch\(Exception e\){)Tj +T* +( LOG.log\(Level.SEVERE, "!!!During invocation of: {0} )Tj +0 -0.99 TD +(exception occured: {1}", new Object[]{methodName,e}\);)Tj +0 -1.79 TD +( monitoring.exceptionOccurred\(methodName,e\);)Tj +T* +( throw e;)Tj +T* +( }finally{)Tj +T* +( long duration = System.currentTimeMillis\(\) - start;)Tj +T* +( monitoring.add\(methodName,duration\);)Tj +T* +( })Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 42: F)Tj +5.18 0 Td +(orw)Tj +1.649 0 Td +(arding Data to a JMX Bean)Tj +/TT3 1 Tf +12 0 0 12 57 154.5001 Tm +(Distributing Ev)Tj +6.49 0 Td +(ents )Tj +2.019 0 Td +(W)Tj +0.982 0 Td +(ithout JMS\227Leaner )Tj +8.761 0 Td +(T)Tj +0.511 0 Td +(han an Observ)Tj +6.379 0 Td +(er)Tj +/TT1 1 Tf +10 0 0 10 75 132.1001 Tm +(PerformanceAuditor)Tj +/TT0 1 Tf +( )Tj +11.259 0 Td +(is )Tj +1.125 0 Td +(an )Tj +1.514 0 Td +(inter)Tj +1.933 0 Td +(ceptor )Tj +3.181 0 Td +(and )Tj +2.07 0 Td +(can )Tj +2.014 0 Td +(be )Tj +1.514 0 Td +(applied )Tj +3.682 0 Td +(to )Tj +1.292 0 Td +(EJB )Tj +1.847 0 Td +(beans )Tj +2.959 0 Td +(and )Tj +2.07 0 Td +(managed )Tj +-38.255 -1.44 Td +(beans declar)Tj +5.434 0 Td +(ati)Tj +1.038 0 Td +(v)Tj +0.488 0 Td +(ely:)Tj +/TT1 1 Tf +-6.96 -1.79 Td +(@Startup)Tj +0 -1.79 TD +(@Singleton)Tj +ET + +endstream +endobj +201 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 202 0 R>>endobj +202 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(84)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +(@ConcurrencyManagement\(ConcurrencyManagementType.BEAN\))Tj +ET +Q +BT +/TT2 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +(@Interceptors\(PerformanceAuditor.class\))Tj +/TT1 1 Tf +0 -1.79 TD +(public class Hits {})Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.468 0 Td +(inter)Tj +1.933 0 Td +(cepted )Tj +3.302 0 Td +(beans )Tj +2.913 0 Td +(kno)Tj +1.6 0 Td +(w )Tj +1.19 0 Td +(only )Tj +2.302 0 Td +(the )Tj +1.746 0 Td +(inter)Tj +1.933 0 Td +(ceptor)Tj +2.649 0 Td +(, )Tj +0.69 0 Td +(not )Tj +1.802 0 Td +(the )Tj +/TT1 1 Tf +1.746 0 Td +(MonitorResource)Tj +/TT0 1 Tf +(. )Tj +9.617 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.301 0 Td +(is )Tj +1.079 0 Td +(no )Tj +-41.088 -1.44 Td +(direct )Tj +2.784 0 Td +(coupling )Tj +4.119 0 Td +(between )Tj +4.007 0 Td +(the )Tj +1.673 0 Td +(business )Tj +3.952 0 Td +(logic )Tj +2.451 0 Td +(and )Tj +1.951 0 Td +(the )Tj +1.673 0 Td +(monitoring )Tj +5.063 0 Td +(cross-cutting )Tj +5.785 0 Td +(aspect. )Tj +3.34 0 Td +(P)Tj +0.511 0 Td +(erformance )Tj +-37.311 -1.44 Td +(metrics )Tj +3.492 0 Td +(at )Tj +1.159 0 Td +(the )Tj +1.715 0 Td +(method )Tj +3.66 0 Td +(lev)Tj +1.266 0 Td +(el )Tj +1.159 0 Td +(are )Tj +1.714 0 Td +(useful, )Tj +3.216 0 Td +(but )Tj +1.771 0 Td +(they )Tj +2.215 0 Td +(are )Tj +1.714 0 Td +(not )Tj +/C2_0 1 Tf +1.771 0 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(cient )Tj +4.272 0 Td +(for )Tj +1.548 0 Td +(detailed )Tj +3.827 0 Td +(monitoring. )Tj +5.383 0 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +-40.867 -1.44 Td +(component )Tj +5.621 0 Td +(can )Tj +2.286 0 Td +(produce )Tj +4.287 0 Td +(monitoring )Tj +5.454 0 Td +(data )Tj +2.564 0 Td +(bey)Tj +1.538 0 Td +(ond )Tj +2.398 0 Td +(method )Tj +4.009 0 Td +(performance, )Tj +6.453 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.286 0 Td +(might )Tj +3.175 0 Td +(be )Tj +-41.144 -1.44 Td +(interesting )Tj +4.804 0 Td +(for )Tj +1.525 0 Td +(JMX )Tj +2.136 0 Td +(exposure. )Tj +4.526 0 Td +(But )Tj +1.803 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.136 0 Td +(can )Tj +1.914 0 Td +(the )Tj +1.692 0 Td +(data )Tj +2.192 0 Td +(be )Tj +1.414 0 Td +(pushed )Tj +3.471 0 Td +(from )Tj +2.358 0 Td +(the )Tj +1.692 0 Td +(business )Tj +3.971 0 Td +(components )Tj +5.638 0 Td +(to )Tj +/TT1 1 Tf +-41.366 -1.44 Td +(MonitoringResource)Tj +/TT0 1 Tf +( )Tj +11.247 0 Td +(without )Tj +3.726 0 Td +(injecting )Tj +4.17 0 Td +(it? )Tj +1.391 0 Td +(Direct )Tj +3.113 0 Td +(coupling )Tj +4.226 0 Td +(between )Tj +4.114 0 Td +(arbitr)Tj +2.266 0 Td +(ary )Tj +1.779 0 Td +(business )Tj +4.059 0 Td +(logic )Tj +-40.088 -1.44 Td +(and )Tj +/TT1 1 Tf +2.124 0 Td +(MonitoringResource)Tj +/TT0 1 Tf +( )Tj +11.314 0 Td +(increases )Tj +4.457 0 Td +(the )Tj +1.846 0 Td +(complexity )Tj +5.291 0 Td +(and )Tj +2.124 0 Td +(decreases )Tj +4.679 0 Td +(testability)Tj +4.021 0 Td +(. )Tj +0.79 0 Td +(Furthermore, )Tj +-36.644 -1.44 Td +(e)Tj +0.552 0 Td +(v)Tj +0.54 0 Td +(e)Tj +0.552 0 Td +(r)Tj +0.385 0 Td +(y )Tj +1.304 0 Td +(E)Tj +0.552 0 Td +(J)Tj +0.33 0 Td +(B )Tj +1.415 0 Td +(b)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(a)Tj +0.552 0 Td +(n )Tj +1.36 0 Td +(i)Tj +0.33 0 Td +(n)Tj +0.608 0 Td +(t)Tj +0.33 0 Td +(e)Tj +0.552 0 Td +(r)Tj +0.385 0 Td +(e)Tj +0.552 0 Td +(s)Tj +0.441 0 Td +(t)Tj +0.33 0 Td +(e)Tj +0.552 0 Td +(d )Tj +1.36 0 Td +(i)Tj +0.33 0 Td +(n )Tj +1.36 0 Td +(e)Tj +0.552 0 Td +(x)Tj +0.552 0 Td +(p)Tj +0.608 0 Td +(o)Tj +0.608 0 Td +(s)Tj +0.441 0 Td +(i)Tj +0.33 0 Td +(n)Tj +0.608 0 Td +(g )Tj +1.304 0 Td +(m)Tj +0.885 0 Td +(o)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(i)Tj +0.33 0 Td +(t)Tj +0.33 0 Td +(o)Tj +0.608 0 Td +(r)Tj +0.385 0 Td +(i)Tj +0.33 0 Td +(n)Tj +0.608 0 Td +(g )Tj +1.304 0 Td +(d)Tj +0.608 0 Td +(a)Tj +0.552 0 Td +(t)Tj +0.33 0 Td +(a )Tj +1.304 0 Td +(w)Tj +0.818 0 Td +(o)Tj +0.608 0 Td +(u)Tj +0.608 0 Td +(l)Tj +0.33 0 Td +(d )Tj +1.36 0 Td +(b)Tj +0.608 0 Td +(e )Tj +1.304 0 Td +(d)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(p)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(n)Tj +0.608 0 Td +(d)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(n)Tj +0.608 0 Td +(t )Tj +1.082 0 Td +(o)Tj +0.608 0 Td +(n )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(MonitoringResource)Tj +/TT0 1 Tf +(.)Tj +1.8 -2.24 Td +(Built-in )Tj +3.677 0 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.843 0 Td +(distribution )Tj +5.401 0 Td +(in )Tj +1.343 0 Td +(the )Tj +1.843 0 Td +(CDI )Tj +/C2_0 1 Tf +2.232 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +5.956 0 Td +(elegantly )Tj +4.399 0 Td +(solv)Tj +1.711 0 Td +(es )Tj +1.398 0 Td +(this )Tj +2.01 0 Td +(issue. )Tj +2.862 0 Td +(An )Tj +/TT1 1 Tf +1.732 0 Td +(Event)Tj +/TT0 1 Tf +( )Tj +-39.2 -1.44 Td +(instance is injected instead of )Tj +/TT1 1 Tf +(MonitoringResource)Tj +/TT0 1 Tf +(:)Tj +/TT1 1 Tf +T* +( @Inject)Tj +0 -1.79 TD +( Event monitoring;)Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.409 0 Td +(class )Tj +/TT1 1 Tf +2.409 0 Td +(Diagnostics)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +6.954 0 Td +<004B00410045004800440041005D>Tj +/TT0 1 Tf +(es )Tj +4.41 0 Td +(the )Tj +1.687 0 Td +(construction )Tj +5.689 0 Td +(of )Tj +/TT1 1 Tf +1.187 0 Td +(java.util.Map)Tj +/TT0 1 Tf +( )Tj +8.155 0 Td +(and )Tj +1.965 0 Td +(represents )Tj +4.687 0 Td +(the )Tj +-40.866 -1.44 Td +(actual message being distributed \(see Listing 43\).)Tj +/TT1 1 Tf +0 -1.79 TD +(public class Diagnostics {)Tj +T* +( private Map parameters = null;)Tj +0 -1.79 TD +( private Diagnostics\(String name,Object value\){)Tj +0 -1.79 TD +( this.parameters = new HashMap\(\);)Tj +0 -1.79 TD +( this.parameters.put\(name, String.valueOf\(value\)\);)Tj +0 -1.79 TD +( })Tj +T* +( public static Diagnostics with\(String name,Object value\){)Tj +0 -1.79 TD +( return new Diagnostics\(name, value\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( public Diagnostics and\(String name,Object value\){)Tj +0 -1.79 TD +( this.parameters.put\(name, String.valueOf\(value\)\);)Tj +0 -1.79 TD +( return this;)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( public Map asMap\(\){)Tj +0 -1.79 TD +( return this.parameters;)Tj +ET + +endstream +endobj +203 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 204 0 R>>endobj +204 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(85)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( })Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 43: Diagnostics: )Tj +10.209 0 Td +(T)Tj +0.511 0 Td +(he CDI Message)Tj +-8.92 -2.24 Td +(Apparently)Tj +4.632 0 Td +(, )Tj +0.71 0 Td +(there )Tj +2.599 0 Td +(are )Tj +1.765 0 Td +(no )Tj +/C2_0 1 Tf +1.544 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +3.711 0 Td +(requirements )Tj +6.044 0 Td +(for )Tj +1.599 0 Td +(a )Tj +0.932 0 Td +(\223CDI )Tj +2.599 0 Td +(message.)Tj +3.834 0 Td +(\224 )Tj +0.876 0 Td +(It )Tj +0.988 0 Td +(can )Tj +1.988 0 Td +(be )Tj +1.488 0 Td +(an )Tj +1.488 0 Td +(arbitr)Tj +2.266 0 Td +(ary )Tj +-40.867 -1.44 Td +(POJO )Tj +2.846 0 Td +(or )Tj +1.234 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.402 0 Td +(a )Tj +0.846 0 Td +(primiti)Tj +2.816 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.846 0 Td +(wr)Tj +1.099 0 Td +(apper )Tj +2.791 0 Td +(type. )Tj +2.421 0 Td +(A )Tj +1.013 0 Td +(CDI )Tj +2.069 0 Td +(message )Tj +3.957 0 Td +(is )Tj +1.013 0 Td +(sent )Tj +2.069 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.846 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oking )Tj +2.736 0 Td +(the )Tj +/TT1 1 Tf +1.68 0 Td +(fire)Tj +/TT0 1 Tf +( )Tj +2.746 0 Td +(method )Tj +3.625 0 Td +(of)Tj +( )Tj +-41.366 -1.44 Td +(the injected )Tj +/TT1 1 Tf +(Event)Tj +/TT0 1 Tf +( instance:)Tj +/TT1 1 Tf +0 -1.79 TD +( void sendMonitoringData\(\){)Tj +T* +( int hitCacheSize = this.hitStatistics.getCacheSize\(\);)Tj +0 -1.79 TD +( int hitDirtyEntriesCount = )Tj +0 -0.99 TD +(this.hitStatistics.getDirtyEntriesCount\(\);)Tj +0 -1.79 TD +( int refererCacheSize = this.refererStatistics.getCacheSize\(\);)Tj +0 -1.79 TD +( int refererDirtyEntriesCount = )Tj +0 -0.99 TD +(this.refererStatistics.getDirtyEntriesCount\(\);)Tj +0 -1.79 TD +( Diagnostics diagnostics = Diagnostics.with)Tj +0 -0.99 TD +(\("hitCacheSize",hitCacheSize\).)Tj +0 -1.79 TD +( and\("hitDirtyEntriesCount",hitDirtyEntriesCount\).)Tj +0 -1.79 TD +( and\(\223refererCacheSize\224,refererCacheSize\).)Tj +0 -1.79 TD +( and\("refererDirtyEntriesCount",refererDirtyEntriesCount\).)Tj +T* +( and\("numberOfRejectedRequests",this.numberOfRejectedRequests\);)Tj +/TT2 1 Tf +0 -1.79 TD +( monitoring.fire\(diagnostics\);)Tj +/TT1 1 Tf +0 -1.79 TD +( })Tj +/TT0 1 Tf +1.8 -4.48 Td +(T)Tj +0.513 0 Td +(h)Tj +0.558 0 Td +(e)Tj +0.502 0 Td +(r)Tj +0.335 0 Td +(e)Tj +0.502 0 Td +(f)Tj +0.28 0 Td +(o)Tj +0.558 0 Td +(r)Tj +0.335 0 Td +(e)Tj +0.502 0 Td +(, )Tj +/TT1 1 Tf +1.057 0 Td +(M)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(t)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(r)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(R)Tj +0.602 0 Td +(e)Tj +0.602 0 Td +(s)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(u)Tj +0.602 0 Td +(r)Tj +0.602 0 Td +(c)Tj +0.602 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.379 0 Td +(r)Tj +0.335 0 Td +(e)Tj +0.502 0 Td +(c)Tj +0.502 0 Td +(e)Tj +0.502 0 Td +(i)Tj +0.262 0 Td +(v)Tj +0.49 0 Td +(e)Tj +0.502 0 Td +(s )Tj +1.168 0 Td +(t)Tj +0.28 0 Td +(h)Tj +0.558 0 Td +(e )Tj +/TT1 1 Tf +1.279 0 Td +(D)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(a)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(s)Tj +0.602 0 Td +(t)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(c)Tj +/TT0 1 Tf +( )Tj +1.379 0 Td +(i)Tj +0.28 0 Td +(n)Tj +0.558 0 Td +(s)Tj +0.391 0 Td +(t)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(n)Tj +0.558 0 Td +(c)Tj +0.502 0 Td +(e )Tj +1.279 0 Td +(c)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(s)Tj +0.391 0 Td +(s )Tj +1.168 0 Td +(w)Tj +0.78 0 Td +(i)Tj +0.28 0 Td +(t)Tj +0.28 0 Td +(h)Tj +0.558 0 Td +(o)Tj +0.558 0 Td +(u)Tj +0.558 0 Td +(t )Tj +-41.922 -1.44 Td +(kno)Tj +1.6 0 Td +(wing its origin:)Tj +/TT1 1 Tf +-1.6 -1.79 Td +(public void onNewDiagnostics\()Tj +/TT2 1 Tf +(@Observes)Tj +/TT1 1 Tf +( Diagnostics diagnostics\){)Tj +T* +( Map map = diagnostics.asMap\(\);)Tj +0 -1.79 TD +( if\(map != null\){)Tj +0 -1.79 TD +( this.diagnostics.putAll\(map\);)Tj +0 -1.79 TD +( })Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.509 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.397 0 Td +(type )Tj +2.287 0 Td +(behind )Tj +3.455 0 Td +(the )Tj +1.787 0 Td +(annotation )Tj +/TT1 1 Tf +5.067 0 Td +(@Observes)Tj +/TT0 1 Tf +( )Tj +5.854 0 Td +(has )Tj +1.898 0 Td +(to )Tj +1.287 0 Td +(matc)Tj +2.093 0 Td +(h )Tj +1.009 0 Td +(the )Tj +1.787 0 Td +(type )Tj +2.287 0 Td +(of )Tj +1.287 0 Td +(the )Tj +1.787 0 Td +(sent )Tj +-40.477 -1.44 Td +(ev)Tj +0.988 0 Td +(ent. )Tj +2.122 0 Td +(If )Tj +1.066 0 Td +(the )Tj +1.844 0 Td +(types )Tj +2.733 0 Td +(do )Tj +1.622 0 Td +(not )Tj +1.9 0 Td +(matc)Tj +2.093 0 Td +(h, )Tj +1.344 0 Td +(the )Tj +1.844 0 Td +(message )Tj +4.121 0 Td +(simply )Tj +3.344 0 Td +(disappears. )Tj +5.345 0 Td +(In )Tj +1.344 0 Td +(contr)Tj +2.211 0 Td +(ast )Tj +1.677 0 Td +(to )Tj +1.344 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +-41.7 -1.44 Td +(injection, )Tj +4.373 0 Td +(an )Tj +/C2_0 1 Tf +1.371 0 Td +<004D0046004B0039004C0041004B005D>Tj +/TT0 1 Tf +(ed )Tj +4.873 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.815 0 Td +(between )Tj +3.983 0 Td +(the )Tj +/C2_0 1 Tf +1.649 0 Td +<005D>Tj +/TT0 1 Tf +(red )Tj +2.26 0 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.649 0 Td +(and )Tj +1.927 0 Td +(the )Tj +1.649 0 Td +(corresponding )Tj +6.484 0 Td +(listener )Tj +3.427 0 Td +(does )Tj +ET + +endstream +endobj +205 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 207 0 R>>endobj +206 0 obj<>endobj +207 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(86)Tj +0 Tc 0 Tw -20.432 57.06 Td +(not cause errors or deplo)Tj +10.714 0 Td +(yment problems.)Tj +-8.914 -2.24 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.632 0 Td +(CDI )Tj +2.243 0 Td +(ev)Tj +0.988 0 Td +(ents, )Tj +2.521 0 Td +(arbitr)Tj +2.266 0 Td +(ary )Tj +1.853 0 Td +(data )Tj +2.354 0 Td +(can )Tj +2.076 0 Td +(be )Tj +1.576 0 Td +(sent )Tj +2.243 0 Td +(between )Tj +4.188 0 Td +(business )Tj +4.133 0 Td +(logic )Tj +2.632 0 Td +(and )Tj +2.132 0 Td +(the )Tj +1.854 0 Td +(monitoring )Tj +-37.476 -1.44 Td +(component. )Tj +5.462 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.423 0 Td +(actual )Tj +2.979 0 Td +(pa)Tj +1.026 0 Td +(yload )Tj +2.757 0 Td +(is )Tj +1.034 0 Td +(a )Tj +/TT1 1 Tf +0.867 0 Td +(Map)Tj +/TT0 1 Tf +(, )Tj +11.447 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.923 0 Td +(can )Tj +1.923 0 Td +(be )Tj +1.423 0 Td +(directly )Tj +3.59 0 Td +(exposed )Tj +3.924 0 Td +(to )Tj +-41.366 -1.44 Td +(JMX. )Tj +2.419 0 Td +(Merging )Tj +3.919 0 Td +(tw)Tj +1.044 0 Td +(o )Tj +/TT1 1 Tf +0.919 0 Td +(HashMap)Tj +/TT0 1 Tf +( )Tj +4.563 0 Td +(instances )Tj +4.309 0 Td +(with )Tj +/TT1 1 Tf +2.253 0 Td +(putAll)Tj +/TT0 1 Tf +( )Tj +3.963 0 Td +(is )Tj +1.03 0 Td +(a )Tj +0.863 0 Td +(fast )Tj +1.808 0 Td +(enough )Tj +3.587 0 Td +(oper)Tj +1.933 0 Td +(ation )Tj +2.531 0 Td +(to )Tj +1.197 0 Td +(be )Tj +1.419 0 Td +(performed )Tj +-37.755 -1.44 Td +(sync)Tj +1.927 0 Td +(hronously)Tj +4.188 0 Td +(. )Tj +-4.315 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.474 0 Td +(Diagnostic)Tj +/TT0 1 Tf +( )Tj +6.419 0 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.752 0 Td +(could )Tj +2.864 0 Td +(also )Tj +2.141 0 Td +(be )Tj +1.474 0 Td +(deli)Tj +1.594 0 Td +(v)Tj +0.488 0 Td +(ered )Tj +2.307 0 Td +(easily )Tj +2.863 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.918 0 Td +(annotating )Tj +4.976 0 Td +(the )Tj +1.752 0 Td +(method )Tj +3.697 0 Td +(with )Tj +2.308 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(@)Tj +0.626 0 Td +(A)Tj +0.626 0 Td +(s)Tj +0.626 0 Td +(y)Tj +0.626 0 Td +(n)Tj +0.626 0 Td +(c)Tj +0.626 0 Td +(h)Tj +0.626 0 Td +(r)Tj +0.626 0 Td +(o)Tj +0.626 0 Td +(n)Tj +0.626 0 Td +(o)Tj +0.626 0 Td +(u)Tj +0.626 0 Td +(s)Tj +/TT0 1 Tf +( )Tj +1.391 0 Td +(a)Tj +0.526 0 Td +(n)Tj +0.582 0 Td +(n)Tj +0.582 0 Td +(o)Tj +0.582 0 Td +(t)Tj +0.304 0 Td +(a)Tj +0.526 0 Td +(t)Tj +0.304 0 Td +(i)Tj +0.304 0 Td +(o)Tj +0.582 0 Td +(n)Tj +0.582 0 Td +(: )Tj +/TT2 1 Tf +1.069 0 Td +(@)Tj +0.626 0 Td +(A)Tj +0.626 0 Td +(s)Tj +0.626 0 Td +(y)Tj +0.626 0 Td +(n)Tj +0.626 0 Td +(c)Tj +0.626 0 Td +(h)Tj +0.626 0 Td +(r)Tj +0.626 0 Td +(o)Tj +0.626 0 Td +(n)Tj +0.626 0 Td +(o)Tj +0.626 0 Td +(u)Tj +0.626 0 Td +(s)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +1.391 0 Td +(p)Tj +0.626 0 Td +(u)Tj +0.626 0 Td +(b)Tj +0.626 0 Td +(l)Tj +0.626 0 Td +(i)Tj +0.626 0 Td +(c )Tj +1.713 0 Td +(v)Tj +0.626 0 Td +(o)Tj +0.626 0 Td +(i)Tj +0.626 0 Td +(d )Tj +1.713 0 Td +(o)Tj +0.626 0 Td +(n)Tj +0.626 0 Td +(N)Tj +0.626 0 Td +(e)Tj +0.626 0 Td +(w)Tj +0.626 0 Td +(D)Tj +0.626 0 Td +(i)Tj +0.626 0 Td +(a)Tj +0.626 0 Td +(g)Tj +0.626 0 Td +(n)Tj +0.626 0 Td +(o)Tj +0.626 0 Td +(s)Tj +0.626 0 Td +(t)Tj +0.626 0 Td +(i)Tj +0.626 0 Td +(c)Tj +0.626 0 Td +(s)Tj +-41.6 -1.44 Td +(\()Tj +/TT2 1 Tf +(@Observes)Tj +/TT1 1 Tf +( Diagnostics diagnostics\){})Tj +/TT0 1 Tf +(.)Tj +/TT3 1 Tf +12 0 0 12 57 476.3999 Tm +(REST for Monitoring)Tj +/TT0 1 Tf +10 0 0 10 75 454 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.357 0 Td +(singleton )Tj +4.192 0 Td +(session )Tj +3.358 0 Td +(bean)Tj +/TT1 1 Tf +( )Tj +2.735 0 Td +(MonitoringResource)Tj +/TT0 1 Tf +( )Tj +11.102 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.19 0 Td +(exposed )Tj +3.858 0 Td +(as )Tj +1.19 0 Td +(an )Tj +1.357 0 Td +(MXBean )Tj +3.968 0 Td +(and )Tj +1.913 0 Td +(can )Tj +1.857 0 Td +(be )Tj +-41.144 -1.44 Td +(directly )Tj +3.589 0 Td +(accessed )Tj +4.2 0 Td +(via )Tj +1.644 0 Td +(JMX. )Tj +2.422 0 Td +(It )Tj +0.922 0 Td +(is )Tj +1.033 0 Td +(also )Tj +2.089 0 Td +(a )Tj +0.866 0 Td +(singleton )Tj +4.257 0 Td +(bean )Tj +2.478 0 Td +(and )Tj +1.978 0 Td +(can )Tj +1.922 0 Td +(expose )Tj +3.367 0 Td +(the )Tj +1.7 0 Td +(monitoring )Tj +5.09 0 Td +(data )Tj +2.2 0 Td +(easily )Tj +-39.755 -1.44 Td +(via )Tj +1.63 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.074 0 Td +(\(REST\). )Tj +3.353 0 Td +(See )Tj +1.852 0 Td +(Listing )Tj +3.131 0 Td +(44. )Tj +1.705 0 Td +(Accessing )Tj +4.631 0 Td +(data )Tj +2.186 0 Td +(via )Tj +1.63 0 Td +(HTTP )Tj +2.798 0 Td +(is )Tj +1.019 0 Td +(especially )Tj +4.631 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.02 0 Td +(for )Tj +1.519 0 Td +(scripting )Tj +-38.532 -1.44 Td +(and terminal access. )Tj +8.984 0 Td +(T)Tj +0.456 0 Td +(ools suc)Tj +3.484 0 Td +(h as )Tj +/TT1 1 Tf +(curl)Tj +/TT0 1 Tf +( or )Tj +/TT1 1 Tf +(wget)Tj +/TT0 1 Tf +( can directly consume the monitoring data. )Tj +/TT1 1 Tf +-12.924 -1.79 Td +(@Singleton)Tj +0 -1.79 TD +(@Startup)Tj +T* +(@LocalBean)Tj +/TT2 1 Tf +T* +(@Path\("monitoring"\))Tj +/TT1 1 Tf +T* +(@ConcurrencyManagement\(ConcurrencyManagementType.BEAN\))Tj +T* +(public class MonitoringResource implements MonitoringResourceMXBean {)Tj +0 -3.58 TD +( private ConcurrentHashMap methods = new )Tj +0 -0.99 TD +(ConcurrentHashMap\(\);)Tj +0 -1.79 TD +( private ConcurrentHashMap diagnostics = new )Tj +0 -0.99 TD +(ConcurrentHashMap\(\);)Tj +0 -1.79 TD +( private AtomicLong exceptionCount;)Tj +0 -3.58 TD +( )Tj +/TT2 1 Tf +( @GET)Tj +0 -1.79 TD +( @Produces\({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}\))Tj +/TT1 1 Tf +0 -1.79 TD +( public List getSlowestMethods\()Tj +7.2 -1.79 Td +(@QueryParam\("max"\) @DefaultValue\("50"\) int maxResult\){)Tj +-7.2 -1.79 Td +( List list = new ArrayList)Tj +0 -0.99 TD +(\(methods.values\(\)\);)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 76.8 Tm +( Collections.sort\(list\);)Tj +ET +Q + +endstream +endobj +208 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 209 0 R>>endobj +209 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(87)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( Collections.reverse\(list\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( if\(list.size\(\) > maxResult\))Tj +0 -1.79 TD +( return list.subList\(0,maxResult\);)Tj +T* +( else)Tj +T* +( return list;)Tj +T* +( })Tj +/TT2 1 Tf +0 -3.58 TD +( @GET)Tj +0 -1.79 TD +( @Path\("exceptionCount"\))Tj +0 -1.79 TD +( @Produces\(MediaType.TEXT_PLAIN\))Tj +/TT1 1 Tf +0 -1.79 TD +( @Override)Tj +T* +( public String getNumberOfExceptions\(\){)Tj +0 -1.79 TD +( return String.valueOf\(exceptionCount.get\(\)\);)Tj +0 -1.79 TD +( })Tj +/TT2 1 Tf +0 -3.58 TD +( @GET)Tj +0 -1.79 TD +( @Path\("diagnostics"\))Tj +0 -1.79 TD +( @Produces\(MediaType.TEXT_PLAIN\))Tj +/TT1 1 Tf +0 -1.79 TD +( public String getDiagnosticsAsString\(\){)Tj +T* +( return getDiagnostics\(\).toString\(\);)Tj +0 -1.79 TD +( })Tj +/TT2 1 Tf +0 -3.58 TD +( @GET)Tj +0 -1.79 TD +( @Path\("diagnostics/{key}"\))Tj +T* +( @Produces\(MediaType.TEXT_PLAIN\))Tj +/TT1 1 Tf +0 -1.79 TD +( public String getDiagnosticsAsString\(@PathParam\("key"\) String key\ \))Tj +0 -0.99 TD +({)Tj +0 -1.79 TD +( return getDiagnostics\(\).get\(key\);)Tj +0 -1.79 TD +( })Tj +T* +( @Override)Tj +0 -1.79 TD +( @DELETE)Tj +0 -1.79 TD +( public void clear\(\){)Tj +ET + +endstream +endobj +210 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 211 0 R>>endobj +211 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(88)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( methods.clear\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( exceptionCount.set\(0\);)Tj +0 -1.79 TD +( diagnostics.clear\(\);)Tj +T* +( })Tj +3.6 -1.79 Td +(//REST irrelevant methods omitted)Tj +-3.6 -1.79 Td +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 44: Exposing Management Data via REST)Tj +1.8 -2.24 Td +(It )Tj +0.861 0 Td +(is )Tj +0.972 0 Td +(a )Tj +0.805 0 Td +(lot )Tj +1.417 0 Td +(easier )Tj +2.805 0 Td +(for )Tj +1.472 0 Td +(the )Tj +1.639 0 Td +(administr)Tj +3.989 0 Td +(ators )Tj +2.361 0 Td +(and )Tj +1.917 0 Td +(oper)Tj +1.933 0 Td +(ators )Tj +2.361 0 Td +(to )Tj +1.139 0 Td +(access )Tj +3.083 0 Td +(monitoring )Tj +5.029 0 Td +(data )Tj +2.139 0 Td +(via )Tj +1.583 0 Td +(HTTP/REST )Tj +-37.309 -1.44 Td +(than )Tj +2.334 0 Td +(via )Tj +1.722 0 Td +(JMX. )Tj +2.426 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.5 0 Td +(getSlowestMethods)Tj +/TT0 1 Tf +( )Tj +10.646 0 Td +(method )Tj +3.723 0 Td +(in )Tj +1.278 0 Td +(Listing )Tj +3.223 0 Td +(44 )Tj +1.556 0 Td +(returns )Tj +3.389 0 Td +(a )Tj +0.944 0 Td +(list )Tj +1.667 0 Td +(of )Tj +/TT1 1 Tf +1.278 0 Td +(Invocation)Tj +/TT0 1 Tf +( )Tj +-36.199 -1.44 Td +(instances \(see Listing 45\). )Tj +/TT1 1 Tf +0 -1.79 TD +(@XmlRootElement)Tj +T* +(@XmlAccessorType\(XmlAccessType.FIELD\))Tj +T* +(public class Invocation implements Comparable{)Tj +T* +( @XmlAttribute)Tj +T* +( private String methodName;)Tj +T* +( @XmlAttribute)Tj +T* +( private Long invocationPerformance;)Tj +0 -3.58 TD +( public Invocation\(String methodName, long invocationPerformance\) {\ )Tj +0 -1.79 TD +( this.methodName = methodName;)Tj +T* +( this.invocationPerformance = invocationPerformance;)Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 45: Using J)Tj +7.764 0 Td +(AXB )Tj +2.13 0 Td +(Annotations for XML and JSON Serialization)Tj +-8.094 -2.24 Td +(Class )Tj +/TT1 1 Tf +2.566 0 Td +(Invocation)Tj +/TT0 1 Tf +( )Tj +6.344 0 Td +(together )Tj +3.844 0 Td +(with )Tj +2.233 0 Td +(J)Tj +0.26 0 Td +(AXB )Tj +2.232 0 Td +(annotations )Tj +5.346 0 Td +(pro)Tj +1.433 0 Td +(vides )Tj +/C2_0 1 Tf +2.566 0 Td +<004B004D003E005D>Tj +/TT0 1 Tf +(cient )Tj +4.234 0 Td +(metadata )Tj +4.288 0 Td +(for )Tj +1.51 0 Td +(the )Tj +1.677 0 Td +(J)Tj +0.26 0 Td +(AX-)Tj +-40.589 -1.44 Td +(RS )Tj +1.6 0 Td +(implementation )Tj +7.269 0 Td +(J)Tj +0.266 0 Td +(ersey )Tj +2.711 0 Td +(to )Tj +1.323 0 Td +(gener)Tj +2.377 0 Td +(ate )Tj +1.767 0 Td +(either )Tj +2.934 0 Td +(JSON )Tj +2.878 0 Td +(or )Tj +1.378 0 Td +(XML )Tj +2.489 0 Td +(from )Tj +2.489 0 Td +(the )Tj +1.823 0 Td +(class )Tj +2.545 0 Td +(structure. )Tj +4.49 0 Td +(Ev)Tj +0.988 0 Td +(en )Tj +1.545 0 Td +(the )Tj +-40.866 -1.44 Td +(serialization )Tj +5.724 0 Td +(w)Tj +0.766 0 Td +(orks )Tj +2.278 0 Td +(with )Tj +2.39 0 Td +(respect )Tj +3.556 0 Td +(to )Tj +1.334 0 Td +(the )Tj +1.834 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.224 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.333 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +2.668 0 Td +(principle. )Tj +4.576 0 Td +(W)Tj +0.982 0 Td +(ithout )Tj +3.002 0 Td +(an)Tj +1.038 0 Td +(y )Tj +/C2_0 1 Tf +-41.7 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation, )Tj +2.787 0 Td +(the )Tj +1.675 0 Td +(names )Tj +3.119 0 Td +(of )Tj +1.175 0 Td +(the )Tj +1.675 0 Td +(XML )Tj +2.341 0 Td +(and )Tj +1.953 0 Td +(JSON )Tj +2.73 0 Td +(tags )Tj +2.008 0 Td +(are )Tj +1.674 0 Td +(directly )Tj +3.564 0 Td +(deri)Tj +1.649 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.397 0 Td +(from )Tj +2.341 0 Td +(the )Tj +1.675 0 Td +(class )Tj +2.397 0 Td +(structure. )Tj +-38.199 -1.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.502 0 Td +(default )Tj +3.392 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +2.669 0 Td +(can )Tj +2.002 0 Td +(be )Tj +1.502 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erridden )Tj +4.058 0 Td +(at )Tj +1.224 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.946 0 Td +(time )Tj +2.335 0 Td +(with )Tj +2.336 0 Td +(annotations. )Tj +5.653 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.502 0 Td +(output )Tj +3.226 0 Td +(format )Tj +3.224 0 Td +(can )Tj +2.002 0 Td +(be )Tj +/C2_0 1 Tf +-41.144 -1.44 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed with the )Tj +/TT1 1 Tf +(Accept)Tj +/TT0 1 Tf +( HTTP header)Tj +17.367 0 Td +(. )Tj +-15.567 -2.24 Td +(Here is a )Tj +/TT1 1 Tf +(curl)Tj +/TT0 1 Tf +( command:)Tj +/TT1 1 Tf +-1.8 -1.79 Td +(curl -H "Accept: application/json\224 http://localhost:8080/x-ray/)Tj +0 -0.99 TD +(resources/monitoring)Tj +ET + +endstream +endobj +212 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 213 0 R>>endobj +213 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(89)Tj +0 Tc 0 Tw -18.632 57.06 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +(curl)Tj +/TT0 1 Tf +( command returns the )Tj +/TT1 1 Tf +(Invocation)Tj +/TT0 1 Tf +( instances as a JSON string:)Tj +/TT1 1 Tf +-2.311 -1.79 Td +({"invocation":[{"@methodName":"public java.util.Map )Tj +0 -0.99 TD +(com.abien.xray.business.store.control.PersistentRefererStore.getRefere)Tj +T* +(rs\(\)","@invocationPerformance":"399"},)Tj +0 -1.79 TD +({"@methodName":"public void )Tj +0 -0.99 TD +(com.abien.xray.business.store.boundary.Hits.persistReferersCache)Tj +T* +(\(\)\224,\224@invocationPerformance\224:\224305\224},\(\205\)]})Tj +/TT0 1 Tf +1.8 -2.24 Td +(Here\222)Tj +2.297 0 Td +(s a )Tj +/TT1 1 Tf +(curl)Tj +/TT0 1 Tf +( command that sets the HTTP header to \223application/xml\224:)Tj +/TT1 1 Tf +-4.097 -1.79 Td +(curl -H "Accept: application/xml" http://localhost:5380/x-ray/)Tj +T* +(resources/monitoring)Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(hen it initiates the deli)Tj +9.543 0 Td +(v)Tj +0.488 0 Td +(ery of a XML document:)Tj +/TT1 1 Tf +-12.342 -1.79 Td +()Tj +0 -1.79 TD +()Tj +T* +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +(\(\205\))Tj +T* +()Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.595 0 Td +(signature )Tj +/TT1 1 Tf +4.429 0 Td +(getSlowestMethods\(@QueryParam\("max"\) )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 364.9814 312.2001 Tm +(@DefaultValue\("50"\) )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 297.8001 Tm +(int )Tj +2.514 0 Td +(maxResult\))Tj +/TT0 1 Tf +( )Tj +6.392 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.558 0 Td +(the )Tj +/C2_0 1 Tf +1.725 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +5.838 0 Td +(of )Tj +1.225 0 Td +(an )Tj +1.447 0 Td +(optional )Tj +3.949 0 Td +(query )Tj +2.836 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +/TT1 1 Tf +3.335 0 Td +(max)Tj +/TT0 1 Tf +(. )Tj +2.396 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.447 0 Td +(follo)Tj +1.934 0 Td +(wing )Tj +-40.088 -1.44 Td +(existing query par)Tj +7.657 0 Td +(ameter is automatically con)Tj +11.88 0 Td +(v)Tj +0.488 0 Td +(erted into an int and passed as par)Tj +14.717 0 Td +(ameter: )Tj +/TT1 1 Tf +-34.742 -2.12 Td +(curl -H "Accept: application/xml" http://localhost:5380/x-ray/)Tj +0 -1.44 TD +(resources/monitoring?max=2)Tj +/TT0 1 Tf +( )Tj +1.8 -2.24 Td +(Also interesting is the follo)Tj +11.383 0 Td +(wing signature from Listing 44: )Tj +/TT1 1 Tf +-11.383 -2.12 Td +( @GET)Tj +-1.8 -1.79 Td +( @Path\("diagnostics/{key}"\))Tj +0 -1.79 TD +( @Produces\(MediaType.TEXT_PLAIN\))Tj +T* +( public String getDiagnosticsForKey\(@PathParam\(\223key\224\) String\ key\){)Tj +T* +( return getDiagnostics\(\).get\(key\);)Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(I)Tj +0.304 0 Td +(n )Tj +1.347 0 Td +(c)Tj +0.526 0 Td +(o)Tj +0.582 0 Td +(n)Tj +0.582 0 Td +(t)Tj +0.304 0 Td +(r)Tj +0.347 0 Td +(a)Tj +0.526 0 Td +(s)Tj +0.415 0 Td +(t )Tj +1.069 0 Td +(t)Tj +0.304 0 Td +(o )Tj +1.347 0 Td +(a )Tj +/TT1 1 Tf +1.291 0 Td +(Q)Tj +0.627 0 Td +(u)Tj +0.627 0 Td +(e)Tj +0.627 0 Td +(r)Tj +0.627 0 Td +(y)Tj +0.627 0 Td +(P)Tj +0.627 0 Td +(a)Tj +0.627 0 Td +(r)Tj +0.627 0 Td +(a)Tj +0.627 0 Td +(m)Tj +0.627 0 Td +(e)Tj +0.627 0 Td +(t)Tj +0.627 0 Td +(e)Tj +0.627 0 Td +(r)Tj +/TT0 1 Tf +0.627 0 Td +(, )Tj +1.069 0 Td +(t)Tj +0.304 0 Td +(h)Tj +0.582 0 Td +(e )Tj +/TT1 1 Tf +1.291 0 Td +(S)Tj +0.627 0 Td +(t)Tj +0.627 0 Td +(r)Tj +0.627 0 Td +(i)Tj +0.627 0 Td +(n)Tj +0.627 0 Td +(g)Tj +/TT0 1 Tf +( )Tj +1.391 0 Td +(k)Tj +0.526 0 Td +(e)Tj +0.526 0 Td +(y )Tj +1.291 0 Td +(p)Tj +0.582 0 Td +(a)Tj +0.526 0 Td +(r)Tj +0.347 0 Td +(a)Tj +0.526 0 Td +(m)Tj +0.859 0 Td +(e)Tj +0.526 0 Td +(t)Tj +0.304 0 Td +(e)Tj +0.526 0 Td +(r )Tj +1.124 0 Td +(o)Tj +0.582 0 Td +(f )Tj +1.069 0 Td +(t)Tj +0.304 0 Td +(h)Tj +0.582 0 Td +(e )Tj +1.291 0 Td +(m)Tj +0.859 0 Td +(e)Tj +0.526 0 Td +(t)Tj +0.304 0 Td +(h)Tj +0.582 0 Td +(o)Tj +0.582 0 Td +(d)Tj +( )Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 77.9 Tm +(getDiagnosticsForKey)Tj +ET +Q +BT +/TT0 1 Tf +10 0 0 10 177.0195 77.9 Tm +( is extr)Tj +2.822 0 Td +(acted from the last segment of the URL: )Tj +ET + +endstream +endobj +214 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 215 0 R>>endobj +215 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(90)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 630.8 Tm +(http://localhost:8080/x-ray/resources/monitoring/diagnostics/)Tj +ET +Q +BT +/TT2 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.4 Tm +(hitCacheSize)Tj +/TT0 1 Tf +( )Tj +1.8 -2.24 Td +(It )Tj +0.981 0 Td +(is )Tj +1.092 0 Td +(natur)Tj +2.211 0 Td +(al )Tj +1.203 0 Td +(and )Tj +2.037 0 Td +(RESTful )Tj +3.704 0 Td +(to )Tj +1.259 0 Td +(use )Tj +1.87 0 Td +(the )Tj +1.759 0 Td +(last )Tj +1.87 0 Td +(segment )Tj +3.981 0 Td +(as )Tj +1.314 0 Td +(an )Tj +/C2_0 1 Tf +1.481 0 Td +<0041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(er )Tj +4.26 0 Td +(of )Tj +1.259 0 Td +(the )Tj +1.759 0 Td +(addressed )Tj +4.704 0 Td +(resour)Tj +2.655 0 Td +(ce )Tj +-41.2 -1.44 Td +(\(object\). )Tj +3.791 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.419 0 Td +(URL )Tj +2.252 0 Td +(can )Tj +1.919 0 Td +(be )Tj +1.419 0 Td +(read )Tj +/C2_0 1 Tf +2.252 0 Td +<005E>Tj +/TT0 1 Tf +(uently )Tj +3.587 0 Td +(as )Tj +1.252 0 Td +(\223GET )Tj +2.641 0 Td +(diagnostics )Tj +5.143 0 Td +(with )Tj +2.253 0 Td +(the )Tj +/C2_0 1 Tf +1.697 0 Td +<0041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(er )Tj +/TT1 1 Tf +4.198 0 Td +(hitCacheSize)Tj +/TT0 1 Tf +(.)Tj +7.424 0 Td +(\224 )Tj +-41.756 -1.44 Td +(Consequently)Tj +5.8 0 Td +(, )Tj +0.562 0 Td +(a )Tj +0.784 0 Td +(GET )Tj +2.118 0 Td +(with )Tj +2.174 0 Td +(a )Tj +0.784 0 Td +(full )Tj +1.674 0 Td +(URL )Tj +2.173 0 Td +(without )Tj +3.564 0 Td +(the )Tj +1.618 0 Td +(key )Tj +1.784 0 Td +(\(for )Tj +1.729 0 Td +(example, )Tj +/TT1 1 Tf +4.229 0 Td +(http://localhost:5380/)Tj +-28.998 -1.44 Td +(x)Tj +0.675 0 Td +(-)Tj +0.675 0 Td +(r)Tj +0.675 0 Td +(a)Tj +0.675 0 Td +(y)Tj +0.675 0 Td +(/)Tj +0.675 0 Td +(r)Tj +0.675 0 Td +(e)Tj +0.675 0 Td +(s)Tj +0.675 0 Td +(o)Tj +0.675 0 Td +(u)Tj +0.675 0 Td +(r)Tj +0.675 0 Td +(c)Tj +0.675 0 Td +(e)Tj +0.675 0 Td +(s)Tj +0.675 0 Td +(/)Tj +0.675 0 Td +(m)Tj +0.675 0 Td +(o)Tj +0.675 0 Td +(n)Tj +0.675 0 Td +(i)Tj +0.675 0 Td +(t)Tj +0.675 0 Td +(o)Tj +0.675 0 Td +(r)Tj +0.675 0 Td +(i)Tj +0.675 0 Td +(n)Tj +0.675 0 Td +(g)Tj +0.675 0 Td +(/)Tj +0.675 0 Td +(d)Tj +0.675 0 Td +(i)Tj +0.675 0 Td +(a)Tj +0.675 0 Td +(g)Tj +0.675 0 Td +(n)Tj +0.675 0 Td +(o)Tj +0.675 0 Td +(s)Tj +0.675 0 Td +(t)Tj +0.675 0 Td +(i)Tj +0.675 0 Td +(c)Tj +0.675 0 Td +(s)Tj +/TT0 1 Tf +0.675 0 Td +(\) )Tj +1.093 0 Td +(w)Tj +0.841 0 Td +(o)Tj +0.631 0 Td +(u)Tj +0.631 0 Td +(l)Tj +0.353 0 Td +(d )Tj +1.371 0 Td +(r)Tj +0.408 0 Td +(e)Tj +0.575 0 Td +(t)Tj +0.353 0 Td +(u)Tj +0.631 0 Td +(r)Tj +0.408 0 Td +(n )Tj +1.371 0 Td +(a)Tj +0.575 0 Td +(l)Tj +0.353 0 Td +(l )Tj +1.093 0 Td +(d)Tj +0.631 0 Td +(i)Tj +0.353 0 Td +(a)Tj +0.575 0 Td +(g)Tj +0.575 0 Td +(n)Tj +0.631 0 Td +(o)Tj +0.631 0 Td +(s)Tj +0.464 0 Td +(t)Tj +0.353 0 Td +(i)Tj +0.353 0 Td +(c)Tj +0.575 0 Td +(s)Tj +0.464 0 Td +(: )Tj +/TT1 1 Tf +-41.922 -1.44 Td +({)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(f)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(D)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(y)Tj +0.603 0 Td +(E)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(s)Tj +0.603 0 Td +(C)Tj +0.603 0 Td +(o)Tj +0.603 0 Td +(u)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(=)Tj +0.603 0 Td +(0)Tj +/TT0 1 Tf +0.603 0 Td +(, )Tj +/TT1 1 Tf +1.058 0 Td +(r)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(f)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(C)Tj +0.603 0 Td +(a)Tj +0.603 0 Td +(c)Tj +0.603 0 Td +(h)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(S)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(z)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(=)Tj +0.603 0 Td +(2)Tj +0.603 0 Td +(6)Tj +0.603 0 Td +(6)Tj +0.603 0 Td +(7)Tj +0.603 0 Td +(1)Tj +/TT0 1 Tf +0.603 0 Td +(, )Tj +/TT1 1 Tf +1.058 0 Td +(h)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(C)Tj +0.603 0 Td +(a)Tj +0.603 0 Td +(c)Tj +0.603 0 Td +(h)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(S)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(z)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(=)Tj +0.603 0 Td +(3)Tj +0.603 0 Td +(1)Tj +0.603 0 Td +(9)Tj +0.603 0 Td +(6)Tj +/TT0 1 Tf +0.603 0 Td +(,)Tj +( )Tj +/TT1 1 Tf +-41.922 -1.44 Td +(hitDirtyEntriesCount=0})Tj +/TT0 1 Tf +(. )Tj +1.8 -2.24 Td +(All diagnostics are returned b)Tj +12.598 0 Td +(y the )Tj +/TT1 1 Tf +(getDiagnosticsAsString)Tj +/TT0 1 Tf +( method: )Tj +/TT1 1 Tf +-14.398 -1.79 Td +( @GET)Tj +0 -1.79 TD +( @Path\("diagnostics"\))Tj +T* +( @Produces\(MediaType.TEXT_PLAIN\))Tj +T* +( public String getDiagnosticsAsString\(\){)Tj +T* +( return getDiagnostics\(\).toString\(\);)Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(Diagnostics can be reset b)Tj +11.264 0 Td +(y a DELETE request: )Tj +/TT1 1 Tf +-13.064 -2.12 Td +(curl -X DELETE )Tj +(http://localhost:8080/x-ray/resources/monitoring/)Tj +/TT0 1 Tf +1.8 -2.24 Td +(A method denoted with )Tj +/TT1 1 Tf +(@DELETE)Tj +/TT0 1 Tf +( annotation is bound to DELETE HTTP: )Tj +/TT1 1 Tf +-1.8 -1.79 Td +( @Override)Tj +T* +( @DELETE)Tj +T* +( public void clear\(\){)Tj +T* +( methods.clear\(\);)Tj +T* +( exceptionCount.set\(0\);)Tj +T* +( diagnostics.clear\(\);)Tj +0 -1.79 TD +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.547 0 Td +(clear)Tj +/TT0 1 Tf +( )Tj +3.492 0 Td +(method )Tj +3.77 0 Td +(can )Tj +2.047 0 Td +(be )Tj +1.547 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.603 0 Td +(via )Tj +1.769 0 Td +(JMX )Tj +2.269 0 Td +(and )Tj +2.103 0 Td +(REST)Tj +2.056 0 Td +(, )Tj +0.769 0 Td +(pro)Tj +1.433 0 Td +(viding )Tj +3.159 0 Td +(a )Tj +0.991 0 Td +(true )Tj +2.158 0 Td +(\223multi-c)Tj +3.482 0 Td +(hannel\224 )Tj +-38.81 -1.44 Td +(monitoring ar)Tj +5.823 0 Td +(c)Tj +0.482 0 Td +(hitecture. )Tj +/TT3 1 Tf +12 0 0 12 57 127.7001 Tm +(XML o)Tj +2.822 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.13 0 Td +(Annotations?)Tj +/TT0 1 Tf +10 0 0 10 75 105.3 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.385 0 Td +(inter)Tj +1.933 0 Td +(ception, )Tj +3.831 0 Td +(as )Tj +1.218 0 Td +(well )Tj +2.163 0 Td +(as )Tj +1.218 0 Td +(major )Tj +2.829 0 Td +(parts )Tj +2.385 0 Td +(of )Tj +1.163 0 Td +(the )Tj +1.663 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.829 0 Td +(EE )Tj +1.329 0 Td +(functionality)Tj +5.3 0 Td +(, )Tj +0.607 0 Td +(could )Tj +2.775 0 Td +(also )Tj +2.052 0 Td +(be )Tj +/C2_0 1 Tf +1.385 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +-37.587 -1.44 Td +(in )Tj +1.263 0 Td +(XML. )Tj +2.615 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.541 0 Td +(could )Tj +2.875 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +/C2_0 1 Tf +1.485 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gure )Tj +4.486 0 Td +(the )Tj +1.763 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.319 0 Td +(application )Tj +5.265 0 Td +(with )Tj +2.319 0 Td +(XML )Tj +2.429 0 Td +(and )Tj +2.041 0 Td +(get )Tj +1.707 0 Td +(rid )Tj +1.596 0 Td +(of )Tj +1.263 0 Td +(annotations )Tj +-37.197 -1.44 Td +(entirely)Tj +3.131 0 Td +(. )Tj +0.835 0 Td +(Especially )Tj +4.836 0 Td +(\223i)Tj +0.704 0 Td +(v)Tj +0.482 0 Td +(ory )Tj +1.946 0 Td +(to)Tj +0.822 0 Td +(wer\224 )Tj +2.612 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitects )Tj +3.336 0 Td +(lo)Tj +0.822 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.057 0 Td +(the )Tj +1.891 0 Td +(clear )Tj +2.668 0 Td +(separ)Tj +2.266 0 Td +(ation )Tj +2.725 0 Td +(of )Tj +1.391 0 Td +(concerns. )Tj +4.651 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.613 0 Td +(code )Tj +ET + +endstream +endobj +216 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 218 0 R>>endobj +217 0 obj<>endobj +218 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(91)Tj +/C2_0 1 Tf +0 Tc 0 Tw -20.432 57.06 Td +<003B00470046004B0041004B004C004B00010047003E00010048004D004A003D0001003A004D004B00410046003D004B004B000100440047003F0041003B000100390046003C0001004C0040003D0001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +20.276 0 Td +(ation resides in XML. )Tj +-18.476 -2.24 Td +(Ho)Tj +1.322 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.572 0 Td +(in )Tj +1.128 0 Td +(pr)Tj +0.877 0 Td +(actice)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.1 0 Td +(the )Tj +1.628 0 Td +(clear )Tj +2.405 0 Td +(separ)Tj +2.266 0 Td +(ation )Tj +2.462 0 Td +(is )Tj +0.961 0 Td +(not )Tj +1.684 0 Td +(as )Tj +1.183 0 Td +(elegant )Tj +3.406 0 Td +(as )Tj +1.183 0 Td +(it )Tj +0.85 0 Td +(appears )Tj +3.628 0 Td +(on )Tj +1.406 0 Td +(P)Tj +0.511 0 Td +(o)Tj +0.544 0 Td +(werP)Tj +2.122 0 Td +(oint )Tj +1.962 0 Td +(slides. )Tj +-39.532 -1.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.408 0 Td +(XML )Tj +2.352 0 Td +(has )Tj +1.797 0 Td +(to )Tj +1.186 0 Td +(refer )Tj +2.296 0 Td +(to )Tj +1.186 0 Td +(the )Tj +1.686 0 Td +(existing )Tj +3.631 0 Td +(code )Tj +2.464 0 Td +(and )Tj +1.964 0 Td +(this )Tj +1.853 0 Td +(cannot )Tj +3.298 0 Td +(be )Tj +1.408 0 Td +(accomplished )Tj +6.354 0 Td +(without )Tj +3.632 0 Td +(duplication. )Tj +-37.03 -1.44 Td +(Fully )Tj +/C2_0 1 Tf +2.409 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(ed )Tj +4.077 0 Td +(class )Tj +2.353 0 Td +(names )Tj +3.075 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.797 0 Td +(to )Tj +1.131 0 Td +(be )Tj +1.353 0 Td +(included )Tj +4.077 0 Td +(in )Tj +1.131 0 Td +(XML )Tj +2.297 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +2.964 0 Td +(descriptors )Tj +4.965 0 Td +(and )Tj +/C2_0 1 Tf +1.909 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +/C2_0 1 Tf +-40.032 -1.44 Td +<005D>Tj +/TT0 1 Tf +0.561 0 Td +(l)Tj +0.283 0 Td +(e)Tj +0.505 0 Td +(s)Tj +0.394 0 Td +(. )Tj +0.984 0 Td +(T)Tj +0.516 0 Td +(h)Tj +0.561 0 Td +(e )Tj +1.28 0 Td +(r)Tj +0.338 0 Td +(e)Tj +0.505 0 Td +(q)Tj +0.561 0 Td +(u)Tj +0.561 0 Td +(i)Tj +0.283 0 Td +(r)Tj +0.338 0 Td +(e)Tj +0.505 0 Td +(d )Tj +1.336 0 Td +(r)Tj +0.338 0 Td +(e)Tj +0.505 0 Td +(p)Tj +0.561 0 Td +(e)Tj +0.505 0 Td +(t)Tj +0.283 0 Td +(i)Tj +0.283 0 Td +(t)Tj +0.283 0 Td +(i)Tj +0.283 0 Td +(o)Tj +0.561 0 Td +(n )Tj +1.336 0 Td +(i)Tj +0.283 0 Td +(n )Tj +1.336 0 Td +(X)Tj +0.616 0 Td +(M)Tj +0.894 0 Td +(L )Tj +/C2_0 1 Tf +1.28 0 Td +<005D>Tj +/TT0 1 Tf +0.561 0 Td +(l)Tj +0.283 0 Td +(e)Tj +0.505 0 Td +(s )Tj +1.169 0 Td +(i)Tj +0.283 0 Td +(s )Tj +/TT2 1 Tf +1.169 0 Td +(n)Tj +0.561 0 Td +(o)Tj +0.561 0 Td +(t)Tj +/TT0 1 Tf +( )Tj +1.076 0 Td +(D)Tj +0.783 0 Td +(R)Tj +0.579 0 Td +(Y )Tj +1.391 0 Td +(\()Tj +0.283 0 Td +(h)Tj +0.561 0 Td +(t)Tj +0.283 0 Td +(t)Tj +0.283 0 Td +(p)Tj +0.561 0 Td +(:)Tj +0.283 0 Td +(/)Tj +0.283 0 Td +(/)Tj +0.283 0 Td +(e)Tj +0.505 0 Td +(n)Tj +0.561 0 Td +(.)Tj +0.283 0 Td +(w)Tj +0.783 0 Td +(i)Tj +0.283 0 Td +(k)Tj +0.505 0 Td +(i)Tj +0.283 0 Td +(p)Tj +0.561 0 Td +(e)Tj +0.505 0 Td +(d)Tj +0.561 0 Td +(i)Tj +0.283 0 Td +(a)Tj +0.505 0 Td +(.)Tj +0.283 0 Td +(o)Tj +0.561 0 Td +(r)Tj +0.338 0 Td +(g)Tj +0.505 0 Td +(/)Tj +0.283 0 Td +(w)Tj +0.783 0 Td +(i)Tj +0.283 0 Td +(k)Tj +0.505 0 Td +(i)Tj +0.283 0 Td +(/)Tj +0.283 0 Td +(D)Tj +0.783 0 Td +(o)Tj +0.561 0 Td +(n)Tj +-41.644 -1.44 Td +(%27t_repeat_y)Tj +6.428 0 Td +(ourself)Tj +(\) )Tj +3.609 0 Td +(and )Tj +2.053 0 Td +(causes )Tj +3.275 0 Td +(problems )Tj +4.442 0 Td +(the )Tj +1.775 0 Td +(pr)Tj +0.877 0 Td +(actice. )Tj +3.275 0 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +1.774 0 Td +(structur)Tj +3.211 0 Td +(al )Tj +1.219 0 Td +(refactoring )Tj +5.053 0 Td +(has )Tj +1.886 0 Td +(to )Tj +1.275 0 Td +(be )Tj +-41.144 -1.44 Td +(performed )Tj +4.777 0 Td +(tr)Tj +0.599 0 Td +(ansactionally; )Tj +6.279 0 Td +(the )Tj +1.666 0 Td +(class )Tj +2.388 0 Td +(name )Tj +2.721 0 Td +(and )Tj +1.944 0 Td +(the )Tj +1.666 0 Td +(corresponding )Tj +6.501 0 Td +(XML )Tj +/C2_0 1 Tf +2.332 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.666 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.832 0 Td +(to )Tj +1.166 0 Td +(be )Tj +1.388 0 Td +(c)Tj +0.482 0 Td +(hanged )Tj +3.5 0 Td +(at )Tj +-41.422 -1.44 Td +(the same time consistently)Tj +11.245 0 Td +(.)Tj +-9.445 -2.24 Td +(Annotations )Tj +5.632 0 Td +(might )Tj +2.907 0 Td +(be )Tj +1.518 0 Td +(not )Tj +1.852 0 Td +(the )Tj +1.796 0 Td +(best )Tj +2.185 0 Td +(c)Tj +0.482 0 Td +(hoice )Tj +2.852 0 Td +(in )Tj +1.296 0 Td +(theory)Tj +2.631 0 Td +(, )Tj +0.74 0 Td +(but )Tj +1.852 0 Td +(they )Tj +2.296 0 Td +(are )Tj +1.795 0 Td +(extremely )Tj +4.684 0 Td +(producti)Tj +3.595 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.962 0 Td +(in )Tj +-41.366 -1.44 Td +(pr)Tj +0.877 0 Td +(actice. )Tj +3.195 0 Td +(Annotations )Tj +5.568 0 Td +(are )Tj +1.731 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.898 0 Td +(associated )Tj +4.844 0 Td +(with )Tj +2.288 0 Td +(the )Tj +1.732 0 Td +(class, )Tj +2.732 0 Td +(method)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.927 0 Td +(or )Tj +/C2_0 1 Tf +1.287 0 Td +<005D>Tj +/TT0 1 Tf +(eld, )Tj +2.566 0 Td +(so )Tj +1.343 0 Td +(DR)Tj +1.352 0 Td +(Yness )Tj +2.843 0 Td +(nev)Tj +1.544 0 Td +(er )Tj +-41.367 -1.44 Td +(w)Tj +0.76 0 Td +(as )Tj +1.367 0 Td +(an )Tj +1.534 0 Td +(issue. )Tj +2.794 0 Td +(T)Tj +0.456 0 Td +(o )Tj +1.034 0 Td +(dev)Tj +1.544 0 Td +(elop )Tj +2.368 0 Td +(an )Tj +1.534 0 Td +(annotation)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(dri)Tj +6.096 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.534 0 Td +(application)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.564 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.59 0 Td +(only )Tj +2.368 0 Td +(need )Tj +2.59 0 Td +(a )Tj +0.978 0 Td +(typical )Tj +3.368 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.978 0 Td +(IDE )Tj +-40.644 -1.44 Td +(without )Tj +3.585 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.805 0 Td +(support )Tj +3.529 0 Td +(for )Tj +1.472 0 Td +(XML )Tj +2.305 0 Td +(refactoring. )Tj +5.195 0 Td +(Ev)Tj +0.988 0 Td +(en )Tj +1.361 0 Td +(in )Tj +1.139 0 Td +(the )Tj +1.639 0 Td +(unlikely )Tj +3.751 0 Td +(case )Tj +2.194 0 Td +(that )Tj +1.917 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.75 0 Td +(IDE )Tj +1.861 0 Td +(is )Tj +0.972 0 Td +(not )Tj +1.695 0 Td +(capable )Tj +3.695 0 Td +(of )Tj +-41.366 -1.44 Td +(refactoring an annotation, in the end, during the compilation)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( y)Tj +27.134 0 Td +(ou will notice the problem)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +-25.334 -2.24 Td +(T)Tj +0.511 0 Td +(here )Tj +2.246 0 Td +(are )Tj +1.69 0 Td +(also )Tj +2.08 0 Td +(no )Tj +1.469 0 Td +(surprises )Tj +4.08 0 Td +(w)Tj +0.766 0 Td +(orking )Tj +3.08 0 Td +(with )Tj +2.247 0 Td +(annotations. )Tj +5.546 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.469 0 Td +(can )Tj +1.913 0 Td +(clic)Tj +1.538 0 Td +(k )Tj +0.857 0 Td +(on )Tj +1.469 0 Td +(an )Tj +1.413 0 Td +(annotation )Tj +4.971 0 Td +(to )Tj +1.191 0 Td +(see )Tj +-40.811 -1.44 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.651 0 Td +(elements )Tj +4.151 0 Td +(are )Tj +1.65 0 Td +(expected. )Tj +4.485 0 Td +(Most )Tj +2.429 0 Td +(of )Tj +1.151 0 Td +(the )Tj +1.651 0 Td +(annotations )Tj +5.32 0 Td +(are )Tj +1.65 0 Td +(well-documented, )Tj +8.153 0 Td +(so )Tj +1.262 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.429 0 Td +(will )Tj +1.929 0 Td +(get )Tj +1.595 0 Td +(inline )Tj +-39.754 -1.44 Td +(documentation )Tj +6.848 0 Td +(as )Tj +1.234 0 Td +(well. )Tj +2.457 0 Td +(Furthermore)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.873 0 Td +(annotations )Tj +5.348 0 Td +(are )Tj +1.678 0 Td +(type)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(safe)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.429 0 Td +(so )Tj +1.29 0 Td +(misspelling )Tj +5.18 0 Td +(with )Tj +2.235 0 Td +(modern )Tj +3.679 0 Td +(IDEs)Tj +( )Tj +-40.255 -1.44 Td +(is )Tj +1.365 0 Td +(nearly )Tj +3.365 0 Td +(impossible. )Tj +5.552 0 Td +(A )Tj +1.365 0 Td +(major )Tj +3.198 0 Td +(dr)Tj +0.877 0 Td +(a)Tj +0.482 0 Td +(wbac)Tj +2.316 0 Td +(k )Tj +1.198 0 Td +(of )Tj +1.532 0 Td +(using )Tj +2.977 0 Td +(annotations )Tj +5.701 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.531 0 Td +(XML )Tj +2.698 0 Td +(is )Tj +1.365 0 Td +(the )Tj +2.032 0 Td +(required )Tj +-38.588 -1.44 Td +(recompilation )Tj +6.636 0 Td +(for )Tj +1.801 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.967 0 Td +(c)Tj +0.482 0 Td +(hange. )Tj +3.45 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.857 0 Td +(shortcoming )Tj +5.969 0 Td +(loses )Tj +2.746 0 Td +(its )Tj +1.579 0 Td +(weight )Tj +3.524 0 Td +(if )Tj +1.19 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.746 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.134 0 Td +(a )Tj +1.134 0 Td +(w)Tj +0.766 0 Td +(orking )Tj +-39.477 -1.44 Td +(continuous )Tj +5.201 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.588 0 Td +(\(CI\) )Tj +1.921 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.81 0 Td +(in )Tj +1.254 0 Td +(place. )Tj +3.032 0 Td +(In )Tj +1.254 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.976 0 Td +(a )Tj +0.92 0 Td +(scenario, )Tj +4.31 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.753 0 Td +(commit )Tj +3.698 0 Td +(triggers )Tj +3.531 0 Td +(an )Tj +-41.144 -1.44 Td +(entire build and results in a deplo)Tj +14.44 0 Td +(y)Tj +0.476 0 Td +(able application. )Tj +-13.116 -2.24 Td +(I )Tj +0.666 0 Td +(built )Tj +2.334 0 Td +(x)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 121.2348 309.6002 Tm +(y )Tj +0.888 0 Td +(with )Tj +2.278 0 Td +(only )Tj +2.278 0 Td +(the )Tj +1.722 0 Td +(absolutely )Tj +4.779 0 Td +(necessary )Tj +4.555 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.055 0 Td +(descriptors: )Tj +5.334 0 Td +(empty )Tj +/TT3 1 Tf +3.055 0 Td +(beans.xml)Tj +/TT0 1 Tf +( )Tj +-36.799 -1.44 Td +(and )Tj +/TT3 1 Tf +(persistence.xml)Tj +/TT1 1 Tf +(.)Tj +/TT4 1 Tf +12 0 0 12 57 260.0002 Tm +(Ev)Tj +0.988 0 Td +(ents...And the )Tj +6.262 0 Td +(T)Tj +0.482 0 Td +(ype Is Not Enough)Tj +/TT0 1 Tf +10 0 0 10 75 237.6002 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.351 0 Td +(class )Tj +/TT3 1 Tf +2.351 0 Td +(Trend)Tj +/TT0 1 Tf +( )Tj +3.295 0 Td +(manages )Tj +4.073 0 Td +(a )Tj +0.795 0 Td +(history )Tj +3.185 0 Td +(of )Tj +1.129 0 Td +(minutely )Tj +4.074 0 Td +(and )Tj +1.907 0 Td +(hourly )Tj +/TT3 1 Tf +3.074 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.695 0 Td +(and )Tj +1.907 0 Td +(exposes )Tj +3.685 0 Td +(them )Tj +2.462 0 Td +(via )Tj +1.573 0 Td +(REST)Tj +2.056 0 Td +(.)Tj +( )Tj +-41.922 -1.44 Td +(Interestingly)Tj +5.132 0 Td +(, )Tj +/TT3 1 Tf +0.738 0 Td +(Trend)Tj +/TT0 1 Tf +( )Tj +3.461 0 Td +(is )Tj +1.127 0 Td +(not )Tj +1.85 0 Td +(dependent )Tj +5.018 0 Td +(on )Tj +1.572 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.96 0 Td +(other )Tj +2.683 0 Td +(class )Tj +2.516 0 Td +(and )Tj +2.072 0 Td +(just )Tj +1.961 0 Td +(exposes )Tj +3.85 0 Td +(the )Tj +1.794 0 Td +(history )Tj +3.35 0 Td +(via )Tj +1.738 0 Td +(the )Tj +/TT3 1 Tf +-40.866 -1.44 Td +(trend/hourly)Tj +/TT0 1 Tf +( )Tj +7.611 0 Td +(and )Tj +/TT3 1 Tf +2.022 0 Td +(trend/minutely)Tj +/TT0 1 Tf +( )Tj +8.811 0 Td +(URIs )Tj +2.466 0 Td +(\(see )Tj +2.077 0 Td +(Listing )Tj +3.189 0 Td +(46\). )Tj +/TT3 1 Tf +2.078 0 Td +(Trend)Tj +/TT0 1 Tf +( )Tj +3.411 0 Td +(is )Tj +1.077 0 Td +(also )Tj +2.133 0 Td +(not )Tj +1.8 0 Td +(injected )Tj +3.856 0 Td +(into )Tj +-40.532 -1.44 Td +(an)Tj +1.038 0 Td +(y other component; ho)Tj +9.826 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, it is still able to recei)Tj +9.431 0 Td +(v)Tj +0.488 0 Td +(e minutely and hourly updates.)Tj +/TT3 1 Tf +-23.308 -1.79 Td +(@Path\("trend"\))Tj +0 -1.79 TD +(@Singleton)Tj +0 -1.79 TD +(@AccessTimeout\(2000\))Tj +0 -1.79 TD +(@Produces\({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}\))Tj +0 -1.79 TD +(public class Trend {)Tj +ET + +endstream +endobj +219 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 220 0 R>>endobj +220 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(92)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( private LinkedList hourly = new LinkedList)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 624.2001 Tm +(\(\);)Tj +0 -1.79 TD +( private LinkedList minutely = new LinkedList)Tj +0 -0.99 TD +(\(\);)Tj +0 -3.58 TD +( @GET)Tj +0 -1.79 TD +( @Path\("hourly"\))Tj +0 -1.79 TD +( @Lock\(LockType.READ\))Tj +0 -1.79 TD +( public List hourly\(@QueryParam\("lastHours"\) )Tj +0 -0.99 TD +(@DefaultValue\("24"\) int hours\) {)Tj +0 -1.79 TD +( int size = hourly.size\(\);)Tj +T* +( if \(size <= hours\) {)Tj +T* +( return hourly;)Tj +T* +( })Tj +T* +( return hourly.subList\(0, hours\);)Tj +T* +( })Tj +0 -3.58 TD +( @GET)Tj +0 -1.79 TD +( @Path\("minutely"\))Tj +T* +( @Lock\(LockType.READ\))Tj +T* +( public List minutely\(@QueryParam\("lastHours"\) )Tj +0 -0.99 TD +(@DefaultValue\("60"\) int minutes\) {)Tj +0 -1.79 TD +( int size = minutely.size\(\);)Tj +T* +( if \(size <= minutes\) {)Tj +T* +( return minutely;)Tj +T* +( })Tj +0 -1.79 TD +( return minutely.subList\(0, minutes\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( @Lock\(LockType.WRITE\))Tj +0 -1.79 TD +( )Tj +/TT2 1 Tf +(public void onHourlyStatistic\(@Observes @HitsPer\(HOUR\) long )Tj +0 -0.99 TD +(hitPerMinute\))Tj +/TT1 1 Tf +( {)Tj +0 -1.79 TD +( hourly.addFirst\(new Statistic\(hitPerMinute\)\);)Tj +0 -1.79 TD +( })Tj +ET + +endstream +endobj +221 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 222 0 R>>endobj +222 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(93)Tj +/TT1 1 Tf +0 Tc 0 Tw -20.432 55.72 Td +( @Lock\(LockType.WRITE\))Tj +0 -1.79 TD +( public void onMinutelyStatistic\(@Observes @HitsPer\(MINUTE\) long )Tj +0 -0.99 TD +(hitPerMinute\) {)Tj +0 -1.79 TD +( minutely.addFirst\(new Statistic\(hitPerMinute\)\);)Tj +0 -1.79 TD +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 46: Hourly and Minutely History of Hits)Tj +1.8 -2.24 Td +(Statistics )Tj +4.297 0 Td +(are )Tj +1.962 0 Td +(indirectly )Tj +4.686 0 Td +(passed )Tj +3.519 0 Td +(to )Tj +/TT1 1 Tf +1.463 0 Td +(onMinutelyStatistic)Tj +/TT0 1 Tf +( )Tj +12.031 0 Td +(and )Tj +/TT1 1 Tf +2.241 0 Td +(onHourlyStatistic)Tj +/TT0 1 Tf +( )Tj +-31.998 -1.44 Td +(using )Tj +2.624 0 Td +(the )Tj +1.679 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.845 0 Td +(introduced )Tj +5.014 0 Td +(CDI )Tj +2.068 0 Td +(ev)Tj +0.988 0 Td +(ents. )Tj +2.346 0 Td +(Both )Tj +2.346 0 Td +(methods )Tj +4.013 0 Td +(are )Tj +1.678 0 Td +(expecting )Tj +4.513 0 Td +(a )Tj +0.845 0 Td +(long )Tj +2.235 0 Td +(as )Tj +1.234 0 Td +(a )Tj +0.845 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.289 0 Td +(and )Tj +-40.588 -1.44 Td +(w)Tj +0.766 0 Td +(ould recei)Tj +4.317 0 Td +(v)Tj +0.488 0 Td +(e all ev)Tj +3.1 0 Td +(ents of type long in par)Tj +9.882 0 Td +(allel. )Tj +-16.753 -2.24 Td +(A )Tj +/C2_0 1 Tf +0.949 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(er )Tj +3.839 0 Td +(is )Tj +0.949 0 Td +(used )Tj +2.283 0 Td +(to )Tj +1.116 0 Td +(distinguish )Tj +4.896 0 Td +(between )Tj +3.95 0 Td +(different )Tj +3.839 0 Td +(logical )Tj +3.172 0 Td +(ev)Tj +0.988 0 Td +(ents )Tj +2.005 0 Td +(of )Tj +1.116 0 Td +(the )Tj +1.616 0 Td +(same )Tj +2.504 0 Td +(type. )Tj +2.394 0 Td +(In )Tj +1.116 0 Td +(the )Tj +1.616 0 Td +(class)Tj +( )Tj +/TT1 1 Tf +-40.144 -1.44 Td +(Trend)Tj +/TT0 1 Tf +(, )Tj +3.641 0 Td +(the )Tj +/C2_0 1 Tf +1.696 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(er )Tj +/TT1 1 Tf +3.919 0 Td +(@HitsPer\(HOUR\))Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +9.041 0 Td +(@HitsPer\(MINUTE\))Tj +/TT0 1 Tf +( )Tj +9.964 0 Td +(annotates )Tj +4.475 0 Td +(the )Tj +1.696 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.306 0 Td +(as )Tj +1.251 0 Td +(well )Tj +-40.366 -1.44 Td +(as )Tj +1.236 0 Td +(the )Tj +1.681 0 Td +(injection )Tj +4.127 0 Td +(point )Tj +2.571 0 Td +(of )Tj +1.181 0 Td +(the )Tj +/TT1 1 Tf +1.681 0 Td +(Event)Tj +/TT0 1 Tf +( )Tj +3.347 0 Td +(class. )Tj +2.681 0 Td +(If )Tj +0.903 0 Td +(both )Tj +2.293 0 Td +(annotations )Tj +5.35 0 Td +(with )Tj +2.237 0 Td +(the )Tj +1.681 0 Td +(included )Tj +4.127 0 Td +(elements )Tj +4.181 0 Td +(matc)Tj +2.093 0 Td +(h, )Tj +-41.366 -1.44 Td +(the )Tj +1.973 0 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.973 0 Td +(will )Tj +2.251 0 Td +(be )Tj +1.695 0 Td +(deli)Tj +1.594 0 Td +(v)Tj +0.488 0 Td +(ered; )Tj +2.806 0 Td +(otherwise )Tj +4.807 0 Td +(it )Tj +1.195 0 Td +(will )Tj +2.251 0 Td +(just )Tj +2.14 0 Td +(disappear)Tj +4.094 0 Td +(. )Tj +0.88 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.751 0 Td +(the )Tj +1.973 0 Td +(custom )Tj +3.751 0 Td +(annotation )Tj +/TT1 1 Tf +-37.586 -1.44 Td +(HitsPer)Tj +/TT0 1 Tf +(, )Tj +4.768 0 Td +(the )Tj +1.623 0 Td +(minutely )Tj +4.068 0 Td +(and )Tj +1.901 0 Td +(hourly )Tj +3.068 0 Td +(deli)Tj +1.594 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.622 0 Td +(of )Tj +1.123 0 Td +(the )Tj +1.623 0 Td +(long )Tj +2.179 0 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.623 0 Td +(can )Tj +1.845 0 Td +(be )Tj +1.345 0 Td +(distinguished )Tj +5.959 0 Td +(in )Tj +1.123 0 Td +(a )Tj +/C2_0 1 Tf +0.789 0 Td +<005E>Tj +/TT0 1 Tf +(uent )Tj +2.735 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(\(see Listing 47\).)Tj +/TT1 1 Tf +0 -1.79 TD +(import static java.lang.annotation.ElementType.FIELD;)Tj +T* +(import static java.lang.annotation.ElementType.PARAMETER;)Tj +0 -1.79 TD +(import static java.lang.annotation.RetentionPolicy.RUNTIME;)Tj +0 -1.79 TD +(import java.lang.annotation.Retention;)Tj +T* +(import java.lang.annotation.Target;)Tj +T* +(import javax.inject.Qualifier;)Tj +0 -3.58 TD +(@Qualifier)Tj +0 -1.79 TD +(@Retention\(RUNTIME\))Tj +T* +(@Target\({FIELD, PARAMETER}\))Tj +T* +(public @interface HitsPer {)Tj +T* +( Frequency value\(\);)Tj +T* +( enum Frequency {)Tj +T* +( MINUTE, HOUR)Tj +T* +( })Tj +T* +(})Tj +ET + +endstream +endobj +223 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 224 0 R>>endobj +224 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(94)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 633.2001 Tm +(Listing 47: HitsP)Tj +/C2_0 1 Tf +6.959 0 Td +<003D004A0001001F004D004B004C004700450001002D004D003900440041005D>Tj +/TT0 1 Tf +(er)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 610.8002 Tm +(HitsPer)Tj +/TT0 1 Tf +( )Tj +4.565 0 Td +(is )Tj +1.031 0 Td +(not )Tj +1.754 0 Td +(just )Tj +1.865 0 Td +(a )Tj +0.864 0 Td +(marker )Tj +3.363 0 Td +(annotation. )Tj +5.256 0 Td +(It )Tj +0.92 0 Td +(contains )Tj +3.977 0 Td +(an )Tj +1.42 0 Td +(embedded )Tj +4.921 0 Td +(enum )Tj +/TT1 1 Tf +2.809 0 Td +(Frequency)Tj +/TT0 1 Tf +( )Tj +5.765 0 Td +(with )Tj +-40.31 -1.44 Td +(the )Tj +1.713 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +/TT1 1 Tf +2.602 0 Td +(MINUTE)Tj +/TT0 1 Tf +( )Tj +3.98 0 Td +(and )Tj +/TT1 1 Tf +1.991 0 Td +(HOUR)Tj +/TT0 1 Tf +(. )Tj +2.983 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.435 0 Td +(only )Tj +2.269 0 Td +(element )Tj +3.824 0 Td +(of )Tj +1.213 0 Td +(the )Tj +/TT1 1 Tf +1.713 0 Td +(HitsPer)Tj +/TT0 1 Tf +( )Tj +4.58 0 Td +(annotation )Tj +4.993 0 Td +(that )Tj +1.991 0 Td +(has )Tj +1.824 0 Td +(the )Tj +1.713 0 Td +(name )Tj +/TT1 1 Tf +-39.811 -1.44 Td +(value)Tj +/TT0 1 Tf +( )Tj +3.458 0 Td +(is )Tj +/TT1 1 Tf +1.125 0 Td +(Frequency)Tj +/TT0 1 Tf +(. )Tj +6.137 0 Td +(No )Tj +1.792 0 Td +(default )Tj +3.404 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.292 0 Td +(is )Tj +1.125 0 Td +(declared, )Tj +4.459 0 Td +(so )Tj +1.403 0 Td +(a )Tj +0.958 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.292 0 Td +(has )Tj +1.903 0 Td +(to )Tj +1.292 0 Td +(be )Tj +1.514 0 Td +(pro)Tj +1.433 0 Td +(vided )Tj +2.848 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.958 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +-40.867 -1.44 Td +(declar)Tj +2.655 0 Td +(ation. )Tj +2.764 0 Td +(T)Tj +0.456 0 Td +(ogether )Tj +3.615 0 Td +(with )Tj +2.282 0 Td +(the )Tj +1.726 0 Td +(pro)Tj +1.433 0 Td +(vided )Tj +2.782 0 Td +(v)Tj +0.476 0 Td +(alue, )Tj +2.504 0 Td +(the )Tj +1.726 0 Td +(annotation )Tj +/TT1 1 Tf +5.006 0 Td +(HitsPer)Tj +/TT0 1 Tf +( )Tj +4.593 0 Td +(is )Tj +1.059 0 Td +(far )Tj +1.503 0 Td +(more )Tj +2.614 0 Td +(readable )Tj +4.115 0 Td +(as )Tj +/TT1 1 Tf +-41.311 -1.44 Td +(@HitsPer\(MINUTE\))Tj +/TT0 1 Tf +(, as sho)Tj +12.814 0 Td +(wn in Listing 48:)Tj +/TT1 1 Tf +-12.814 -1.79 Td +(@Singleton)Tj +0 -1.79 TD +(public class HourlyStatisticsCalculator {)Tj +0 -3.58 TD +( @Inject)Tj +0 -1.79 TD +( @HitsPer\(HOUR\))Tj +T* +( Event hourlyEvent;)Tj +0 -3.58 TD +( @Schedule\(hour = "*/1", persistent = false\))Tj +0 -1.79 TD +( public void computeStatistics\(\) {)Tj +3.6 -1.79 Td +(//\205)Tj +-3.6 -1.79 Td +(hourlyEvent.fire\(currentRate\);)Tj +T* +( })Tj +0 -3.58 TD +(})Tj +T* +(@Singleton)Tj +0 -1.79 TD +(public class MinutelyStatisticsCalculator {)Tj +0 -3.58 TD +( @Inject)Tj +0 -1.79 TD +( @HitsPer\(MINUTE\))Tj +T* +( Event minutelyEvent;)Tj +0 -3.58 TD +( @Schedule\(minute = "*/1", hour = "*", persistent = false\))Tj +0 -1.79 TD +( public void computeStatistics\(\) {)Tj +7.2 -1.79 Td +(//...)Tj +T* +(minutelyEvent.fire\(currentRate\);)Tj +ET + +endstream +endobj +225 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 226 0 R>>endobj +226 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(95)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +(})Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +(})Tj +/C2_0 1 Tf +0 -1.88 TD +<00280041004B004C00410046003F00010011001500170001002D004D003900440041005D>Tj +/TT0 1 Tf +(cation of the Ev)Tj +14.384 0 Td +(ent Injection)Tj +-12.584 -2.24 Td +(Both )Tj +2.717 0 Td +(the )Tj +/TT1 1 Tf +2.05 0 Td +(Minutely)Tj +/TT0 1 Tf +( )Tj +5.516 0 Td +(and )Tj +/TT1 1 Tf +2.328 0 Td +(HourlyStatisticCalculator)Tj +/TT0 1 Tf +( )Tj +15.718 0 Td +(classes )Tj +3.661 0 Td +(use )Tj +2.161 0 Td +(the )Tj +/TT1 1 Tf +2.05 0 Td +(HitsPer)Tj +/TT0 1 Tf +( )Tj +-37.999 -1.44 Td +(annotation )Tj +4.913 0 Td +(to )Tj +1.133 0 Td +(inject )Tj +2.689 0 Td +(the )Tj +/TT1 1 Tf +1.633 0 Td +(Event)Tj +/TT0 1 Tf +( )Tj +3.299 0 Td +(instance. )Tj +4.134 0 Td +(Eac)Tj +1.482 0 Td +(h )Tj +0.855 0 Td +(class )Tj +2.355 0 Td +(is )Tj +0.966 0 Td +(able )Tj +2.133 0 Td +(to )Tj +1.133 0 Td +(send )Tj +2.3 0 Td +(the )Tj +1.633 0 Td +(recently )Tj +3.744 0 Td +(computed )Tj +4.634 0 Td +(statistic )Tj +-39.032 -1.44 Td +(to the corresponding c)Tj +9.653 0 Td +(hannel separ)Tj +5.49 0 Td +(ately just b)Tj +4.651 0 Td +(y c)Tj +1.26 0 Td +(hoosing the right v)Tj +7.98 0 Td +(alue of the )Tj +/TT1 1 Tf +(HitsPer)Tj +/C2_0 1 Tf +<00010049004D003900440041005D>Tj +/TT0 1 Tf +(er)Tj +12.798 0 Td +(.)Tj +-40.032 -2.24 Td +(CDI )Tj +2.438 0 Td +(ev)Tj +0.988 0 Td +(ents )Tj +2.438 0 Td +(together )Tj +4.216 0 Td +(with )Tj +2.605 0 Td +(custom )Tj +/C2_0 1 Tf +3.827 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(ers )Tj +4.661 0 Td +(and )Tj +2.327 0 Td +(async)Tj +2.427 0 Td +(hronous )Tj +4.217 0 Td +(methods )Tj +4.383 0 Td +(are )Tj +2.048 0 Td +(a )Tj +1.215 0 Td +(viable )Tj +-39.588 -1.44 Td +(replacement for JMS )Tj +/TT1 1 Tf +(javax.jms.Topic)Tj +/TT0 1 Tf +( for a local publish/subscribe \(pub/sub\) implementation.)Tj +/TT2 1 Tf +12 0 0 12 57 473.0002 Tm +(REST and HTML Serialization)Tj +/TT0 1 Tf +10 0 0 10 75 450.6002 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.352 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.018 0 Td +(implementation )Tj +7.076 0 Td +(J)Tj +0.266 0 Td +(ersey )Tj +2.518 0 Td +(\()Tj +(http://jersey)Tj +5.188 0 Td +(.ja)Tj +1.026 0 Td +(v)Tj +0.476 0 Td +(a.net)Tj +(\) )Tj +2.686 0 Td +(supports )Tj +3.909 0 Td +(JSON )Tj +2.685 0 Td +(and )Tj +1.908 0 Td +(XML )Tj +2.296 0 Td +(serialization )Tj +-36.976 -1.44 Td +(of )Tj +1.188 0 Td +(J)Tj +0.26 0 Td +(AXB )Tj +2.243 0 Td +(annotated )Tj +4.634 0 Td +(objects. )Tj +3.689 0 Td +(Neither )Tj +3.577 0 Td +(JSON )Tj +2.743 0 Td +(nor )Tj +1.799 0 Td +(XML )Tj +2.354 0 Td +(can )Tj +1.91 0 Td +(be )Tj +1.41 0 Td +(directly )Tj +3.577 0 Td +(consumed )Tj +4.8 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.854 0 Td +(a )Tj +0.817 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.41 0 Td +(bro)Tj +1.433 0 Td +(wser )Tj +-40.2 -1.44 Td +(without )Tj +3.679 0 Td +(further )Tj +3.233 0 Td +(preprocessing. )Tj +6.623 0 Td +(Because )Tj +3.955 0 Td +(of )Tj +1.233 0 Td +(built-in )Tj +3.512 0 Td +(content )Tj +3.623 0 Td +(negotiation, )Tj +5.513 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.121 0 Td +(is )Tj +1.066 0 Td +(able )Tj +2.233 0 Td +(to )Tj +1.233 0 Td +(deli)Tj +1.594 0 Td +(v)Tj +0.488 0 Td +(er )Tj +-41.367 -1.44 Td +(multiple )Tj +4.029 0 Td +(representations )Tj +6.974 0 Td +(of )Tj +1.306 0 Td +(the )Tj +1.806 0 Td +(same )Tj +2.694 0 Td +(data )Tj +2.306 0 Td +(\(see )Tj +2.139 0 Td +(Listing )Tj +3.251 0 Td +(49\). )Tj +2.066 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.528 0 Td +(client )Tj +/C2_0 1 Tf +2.862 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(es )Tj +4.14 0 Td +(the )Tj +1.806 0 Td +(anticipated )Tj +-37.42 -1.44 Td +(format with the )Tj +/TT1 1 Tf +(Accept)Tj +/TT0 1 Tf +( header)Tj +13.586 0 Td +(.)Tj +/TT1 1 Tf +-11.786 -2.12 Td +(@Stateless)Tj +0 -2.12 TD +(@Path\("mostpopular"\))Tj +T* +(public class MostPopular extends TitleFilter{)Tj +T* +( @EJB)Tj +T* +( PersistentHitStore hits;)Tj +T* +( @GET)Tj +T* +( @Produces)Tj +-1.8 -1.32 Td +(\({)Tj +/TT3 1 Tf +(APPLICATION_XHTML_XML)Tj +/TT1 1 Tf +(,APPLICATION_JSON,APPLICATION_XML}\))Tj +1.8 -2.12 Td +( public List totalHitsAsString\(@QueryParam\("max"\) )Tj +-1.8 -1.32 Td +(@DefaultValue\("10"\) int max\){)Tj +1.8 -2.12 Td +( List mostPopularPosts = new LinkedList\(\);)Tj +T* +( List mostPopularPostsWithoutTitle = )Tj +-1.8 -1.32 Td +(hits.getMostPopularPosts\(max\);)Tj +1.8 -2.12 Td +( for \(Hit hit : mostPopularPostsWithoutTitle\) {)Tj +T* +( mostPopularPosts.add\(convert\(hit\)\);)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 75 77.8001 Tm +( })Tj +ET +Q + +endstream +endobj +227 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 229 0 R>>endobj +228 0 obj<>endobj +229 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(96)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 630.8002 Tm +( return getPostsWithExistingTitle\(mostPopularPosts,max\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 609.6002 Tm +( })Tj +0 -4.24 TD +( Post convert\(Hit hit\){)Tj +0 -2.12 TD +( long count = hit.getCount\(\);)Tj +T* +( String uri = hit.getActionId\(\);)Tj +0 -2.12 TD +( return new Post\(uri, count\);)Tj +0 -2.12 TD +( })Tj +0 -2.12 TD +(})Tj +/TT0 1 Tf +-1.77 -2.24 Td +(Listing 49: Declar)Tj +7.602 0 Td +(ation of Multiple Representations of P)Tj +16.13 0 Td +(ost Object)Tj +-21.962 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +1.429 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.208 0 Td +(content )Tj +3.597 0 Td +(of )Tj +1.207 0 Td +(the )Tj +/TT1 1 Tf +1.707 0 Td +(Accept)Tj +/TT0 1 Tf +( )Tj +3.974 0 Td +(header )Tj +3.318 0 Td +(has )Tj +1.818 0 Td +(to )Tj +1.207 0 Td +(matc)Tj +2.093 0 Td +(h )Tj +0.929 0 Td +(one )Tj +1.985 0 Td +(of )Tj +1.207 0 Td +(the )Tj +1.707 0 Td +(declared )Tj +/TT1 1 Tf +4.096 0 Td +(MediaType)Tj +/TT0 1 Tf +( )Tj +-36.799 -1.44 Td +(constants )Tj +4.702 0 Td +(on )Tj +1.812 0 Td +(the )Tj +2.034 0 Td +(corresponding )Tj +6.869 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.422 0 Td +(methods, )Tj +4.646 0 Td +(as )Tj +1.589 0 Td +(sho)Tj +1.489 0 Td +(wn )Tj +2.034 0 Td +(in )Tj +1.534 0 Td +(Listing )Tj +3.479 0 Td +(49. )Tj +2.016 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.756 0 Td +(follo)Tj +1.934 0 Td +(wing )Tj +/TT1 1 Tf +-40.088 -1.44 Td +(M)Tj +0.664 0 Td +(e)Tj +0.664 0 Td +(d)Tj +0.664 0 Td +(i)Tj +0.664 0 Td +(a)Tj +0.664 0 Td +(T)Tj +0.664 0 Td +(y)Tj +0.664 0 Td +(p)Tj +0.664 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.41 0 Td +(c)Tj +0.563 0 Td +(o)Tj +0.619 0 Td +(n)Tj +0.619 0 Td +(s)Tj +0.452 0 Td +(t)Tj +0.341 0 Td +(a)Tj +0.563 0 Td +(n)Tj +0.619 0 Td +(t)Tj +0.341 0 Td +(s )Tj +1.199 0 Td +(a)Tj +0.563 0 Td +(r)Tj +0.396 0 Td +(e )Tj +1.31 0 Td +(s)Tj +0.452 0 Td +(u)Tj +0.619 0 Td +(p)Tj +0.619 0 Td +(p)Tj +0.619 0 Td +(o)Tj +0.619 0 Td +(r)Tj +0.396 0 Td +(t)Tj +0.341 0 Td +(e)Tj +0.563 0 Td +(d )Tj +1.366 0 Td +(o)Tj +0.619 0 Td +(u)Tj +0.619 0 Td +(t )Tj +1.088 0 Td +(o)Tj +0.619 0 Td +(f )Tj +1.088 0 Td +(t)Tj +0.341 0 Td +(h)Tj +0.619 0 Td +(e )Tj +1.31 0 Td +(b)Tj +0.619 0 Td +(o)Tj +0.619 0 Td +(x)Tj +0.563 0 Td +(: )Tj +/TT1 1 Tf +1.088 0 Td +(A)Tj +0.664 0 Td +(P)Tj +0.664 0 Td +(P)Tj +0.664 0 Td +(L)Tj +0.664 0 Td +(I)Tj +0.664 0 Td +(C)Tj +0.664 0 Td +(A)Tj +0.664 0 Td +(T)Tj +0.664 0 Td +(I)Tj +0.664 0 Td +(O)Tj +0.664 0 Td +(N)Tj +0.664 0 Td +(_)Tj +0.664 0 Td +(J)Tj +0.664 0 Td +(S)Tj +0.664 0 Td +(O)Tj +0.664 0 Td +(N)Tj +/TT0 1 Tf +( )Tj +1.41 0 Td +(a)Tj +0.563 0 Td +(n)Tj +0.619 0 Td +(d)Tj +( )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(APPLICATION_XML)Tj +/TT0 1 Tf +(. )Tj +1.8 -2.24 Td +(HTML )Tj +3.017 0 Td +(serialization )Tj +5.518 0 Td +(is )Tj +0.961 0 Td +(not )Tj +1.684 0 Td +(supported )Tj +4.574 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.794 0 Td +(J)Tj +0.266 0 Td +(ersey)Tj +2.13 0 Td +(. )Tj +0.572 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.183 0 Td +(the )Tj +/TT1 1 Tf +1.628 0 Td +(APPLICATION_XHTML_XML)Tj +/TT0 1 Tf +(, )Tj +13.174 0 Td +(a )Tj +0.794 0 Td +(custom )Tj +-39.088 -1.44 Td +(implementation )Tj +7.223 0 Td +(of )Tj +1.277 0 Td +(the )Tj +1.777 0 Td +(interface )Tj +/TT1 1 Tf +4.166 0 Td +(MessageBodyWriter)Tj +/TT0 1 Tf +( )Tj +10.645 0 Td +(has )Tj +1.888 0 Td +(to )Tj +1.277 0 Td +(be )Tj +1.499 0 Td +(implemented )Tj +6.111 0 Td +(and )Tj +2.055 0 Td +(annotated )Tj +-37.92 -1.44 Td +(with the corresponding )Tj +/TT1 1 Tf +(MediaType)Tj +/TT0 1 Tf +( \(see Listing 50\). )Tj +/TT2 1 Tf +0 -1.79 TD +(@Provider)Tj +0 -1.79 TD +(@Produces\(MediaType.APPLICATION_XHTML_XML\))Tj +/TT1 1 Tf +0 -1.79 TD +(public class PostHtmlWriter implements)Tj +T* +( MessageBodyWriter> {)Tj +T* +( @Override)Tj +0 -1.79 TD +( public boolean isWriteable\(Class type, Type genericType, )Tj +0 -0.99 TD +(Annotation[] annotations, MediaType mediaType\) {)Tj +0 -1.79 TD +( return \(List.class.isAssignableFrom\(type\)\);)Tj +T* +( })Tj +T* +( @Override)Tj +0 -1.79 TD +( public long getSize\(List t, Class type, Type genericType, \ )Tj +0 -0.99 TD +(Annotation[] annotations, MediaType mediaType\) {)Tj +0 -1.79 TD +( String serialized = serialize\(t\);)Tj +0 -1.79 TD +( return serialized.length\(\);)Tj +ET + +endstream +endobj +230 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 231 0 R>>endobj +231 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(97)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( })Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( @Override)Tj +0 -1.79 TD +( public void writeTo\(List t, Class type, Type genericType, \ )Tj +0 -0.99 TD +(Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream\) throws IOException, )Tj +T* +(WebApplicationException {)Tj +0 -1.79 TD +( String serialized = serialize\(t\);)Tj +T* +( entityStream.write\(serialized.getBytes\(\)\);)Tj +T* +( })Tj +T* +( public String serialize\(List posts\){)Tj +T* +( StringBuilder result = new StringBuilder\(\);)Tj +T* +( result.append\("
    "\);)Tj +T* +( for \(int i = 0; i < posts.size\(\); i++\) {)Tj +T* +( Post post = posts.get\(i\);)Tj +T* +( result.append\("
  1. "\);)Tj +T* +( result.append\(serialize\(post\)\);)Tj +T* +( result.append\("
  2. "\);)Tj +T* +( result.append\("\\n"\);)Tj +T* +( })Tj +T* +( result.append\("
"\);)Tj +0 -1.79 TD +( return result.toString\(\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public String serialize\(Post post\){)Tj +0 -1.79 TD +( StringBuilder serialized = new StringBuilder\(\);)Tj +T* +( serialized.append\(""\);)Tj +T* +( serialized.append\(post.getShortenedTitle\(80\)\);)Tj +T* +( serialized.append\(""\);)Tj +T* +( serialized.append\("
"\);)Tj +0 -1.79 TD +( serialized.append\(post.getNumberOfHits\(\)\);)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 75.4002 Tm +( serialized.append\("
"\);)Tj +ET +Q + +endstream +endobj +232 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 233 0 R>>endobj +233 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(98)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( return serialized.toString\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 50: Custom HTML Serializer)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.413 0 Td +(serialization )Tj +5.581 0 Td +(itself )Tj +2.358 0 Td +(is )Tj +1.024 0 Td +(str)Tj +0.988 0 Td +(aightforw)Tj +4.039 0 Td +(ard. )Tj +1.95 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.413 0 Td +(List)Tj +/TT0 1 Tf +( )Tj +6.358 0 Td +(from )Tj +2.357 0 Td +(the )Tj +/TT1 1 Tf +1.691 0 Td +(totalHitsAsString)Tj +/TT0 1 Tf +( )Tj +-31.998 -1.44 Td +(method )Tj +3.599 0 Td +(is )Tj +0.987 0 Td +(passed )Tj +3.21 0 Td +(to )Tj +1.154 0 Td +(the )Tj +1.654 0 Td +(method )Tj +/TT1 1 Tf +3.599 0 Td +(writeTo)Tj +/TT0 1 Tf +( )Tj +4.521 0 Td +(of )Tj +1.154 0 Td +(the )Tj +/TT1 1 Tf +1.654 0 Td +(MessageBodyWriter)Tj +/TT0 1 Tf +( )Tj +10.522 0 Td +(implementation )Tj +7.1 0 Td +(as )Tj +1.209 0 Td +(well )Tj +-40.366 -1.44 Td +(as )Tj +1.432 0 Td +(the )Tj +1.877 0 Td +(corresponding )Tj +6.712 0 Td +(context, )Tj +3.989 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.099 0 Td +(as )Tj +1.432 0 Td +(the )Tj +/TT1 1 Tf +1.877 0 Td +(MediaType)Tj +/TT0 1 Tf +(, )Tj +6.222 0 Td +(annotations, )Tj +/TT1 1 Tf +5.824 0 Td +(HttpHeader)Tj +/TT0 1 Tf +(, )Tj +6.822 0 Td +(and )Tj +2.155 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(OutputStream)Tj +/TT0 1 Tf +(. )Tj +7.799 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.469 0 Td +(the )Tj +1.691 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.247 0 Td +(par)Tj +1.377 0 Td +(ameters)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.94 0 Td +(the )Tj +1.691 0 Td +(list )Tj +1.58 0 Td +(of )Tj +/TT1 1 Tf +1.191 0 Td +(Post)Tj +/TT0 1 Tf +( )Tj +2.757 0 Td +(instances )Tj +4.303 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.857 0 Td +(to )Tj +1.191 0 Td +(be )Tj +1.413 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(erted )Tj +-40.033 -1.44 Td +(into )Tj +1.962 0 Td +(the )Tj +1.628 0 Td +(desired )Tj +3.406 0 Td +(format )Tj +3.072 0 Td +(serializing )Tj +4.684 0 Td +(the )Tj +/TT1 1 Tf +1.628 0 Td +(List)Tj +/TT0 1 Tf +( )Tj +6.295 0 Td +(into )Tj +1.962 0 Td +(the )Tj +/TT1 1 Tf +1.628 0 Td +(OutputStream)Tj +/TT0 1 Tf +(. )Tj +7.773 0 Td +(In )Tj +1.128 0 Td +(our )Tj +1.739 0 Td +(case)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.433 0 Td +(it )Tj +0.85 0 Td +(is )Tj +0.961 0 Td +(an )Tj +-41.144 -1.44 Td +(ordered )Tj +3.856 0 Td +(list )Tj +1.745 0 Td +(of )Tj +1.356 0 Td +(posts )Tj +2.69 0 Td +(with )Tj +2.412 0 Td +(links )Tj +2.523 0 Td +(and )Tj +2.134 0 Td +(a )Tj +1.022 0 Td +(hit )Tj +1.634 0 Td +(number)Tj +3.26 0 Td +(. )Tj +0.726 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.578 0 Td +(HTML )Tj +3.245 0 Td +(representation )Tj +6.635 0 Td +(also )Tj +2.245 0 Td +(contains )Tj +4.135 0 Td +(a )Tj +-41.7 -1.44 Td +(reference to a CSS class, w)Tj +11.485 0 Td +(hic)Tj +1.316 0 Td +(h makes it skinnable.)Tj +/C2_0 1 Tf +12 0 0 12 57 434.3002 Tm +<0019003E003D004C>Tj +/TT3 1 Tf +(gur)Tj +3.823 0 Td +(ation o)Tj +3.045 0 Td +(v)Tj +0.488 0 Td +(er Con)Tj +2.934 0 Td +(v)Tj +0.488 0 Td +(ention with In)Tj +6.157 0 Td +(v)Tj +0.488 0 Td +(ersion of Control)Tj +/TT0 1 Tf +10 0 0 10 75 411.9002 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.64 0 Td +(principle )Tj +4.419 0 Td +(of )Tj +1.418 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.308 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_1 1 Tf +1.417 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +2.752 0 Td +(is )Tj +1.251 0 Td +(applicable )Tj +5.086 0 Td +(to )Tj +1.418 0 Td +(most )Tj +2.64 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitectur)Tj +3.267 0 Td +(al )Tj +1.362 0 Td +(and )Tj +-40.588 -1.44 Td +(infr)Tj +1.433 0 Td +(astructur)Tj +3.711 0 Td +(al )Tj +1.076 0 Td +(settings. )Tj +3.744 0 Td +(In )Tj +1.132 0 Td +(the )Tj +1.632 0 Td +(v)Tj +0.476 0 Td +(ast )Tj +1.465 0 Td +(majority )Tj +3.854 0 Td +(of )Tj +1.132 0 Td +(cases, )Tj +2.854 0 Td +(there )Tj +2.465 0 Td +(is )Tj +0.965 0 Td +(only )Tj +2.188 0 Td +(one )Tj +1.91 0 Td +(suitable )Tj +3.633 0 Td +(option, )Tj +3.356 0 Td +(so )Tj +1.243 0 Td +(it )Tj +0.854 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +-41.922 -1.44 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.846 0 Td +(to )Tj +1.18 0 Td +(be )Tj +/C2_1 1 Tf +1.402 0 Td +<004C003D004B004C0041005D>Tj +/TT0 1 Tf +(ed )Tj +3.681 0 Td +(and )Tj +1.958 0 Td +(repeated )Tj +4.069 0 Td +(in )Tj +1.18 0 Td +(a )Tj +/C2_1 1 Tf +0.846 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +/C2_1 1 Tf +2.514 0 Td +<005D>Tj +/TT0 1 Tf +(le. )Tj +1.958 0 Td +(Gi)Tj +1.038 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.402 0 Td +(a )Tj +0.846 0 Td +(w)Tj +0.766 0 Td +(orking )Tj +3.069 0 Td +(Continuous )Tj +5.294 0 Td +(Integr)Tj +2.433 0 Td +(ation )Tj +-40.032 -1.44 Td +(en)Tj +1.044 0 Td +(vironment, )Tj +5.021 0 Td +(a )Tj +0.853 0 Td +(system )Tj +3.243 0 Td +(can )Tj +1.909 0 Td +(be )Tj +/C2_1 1 Tf +1.409 0 Td +<004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +5.799 0 Td +(on )Tj +1.466 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.687 0 Td +(\223commit\224 )Tj +4.519 0 Td +(\(or )Tj +1.52 0 Td +(push\) )Tj +2.689 0 Td +(directly )Tj +3.576 0 Td +(in )Tj +1.187 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.353 0 Td +(code )Tj +-40.088 -1.44 Td +(or external resour)Tj +7.545 0 Td +(ces.)Tj +-5.745 -2.24 Td +(F)Tj +0.463 0 Td +(rom )Tj +2.279 0 Td +(the )Tj +1.891 0 Td +(usability )Tj +4.17 0 Td +(perspecti)Tj +3.872 0 Td +(v)Tj +0.488 0 Td +(e, )Tj +1.335 0 Td +(it )Tj +1.113 0 Td +(is )Tj +1.224 0 Td +(more )Tj +2.779 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.225 0 Td +(to )Tj +1.391 0 Td +(keep )Tj +2.613 0 Td +(the )Tj +1.891 0 Td +(v)Tj +0.476 0 Td +(arious )Tj +3.169 0 Td +(parts )Tj +2.613 0 Td +(of )Tj +1.391 0 Td +(y)Tj +0.482 0 Td +(our)Tj +( )Tj +/C2_1 1 Tf +-40.755 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.543 0 Td +(in )Tj +1.209 0 Td +(a )Tj +0.875 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.153 0 Td +(location. )Tj +4.155 0 Td +(Regardless )Tj +4.931 0 Td +(of )Tj +1.209 0 Td +(w)Tj +0.76 0 Td +(hether )Tj +3.098 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.931 0 Td +(par)Tj +1.377 0 Td +(ameters )Tj +3.708 0 Td +(are )Tj +1.708 0 Td +(stored )Tj +2.987 0 Td +(directly )Tj +3.598 0 Td +(in )Tj +-41.366 -1.44 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.314 0 Td +(code, )Tj +2.704 0 Td +(in )Tj +1.148 0 Td +(a )Tj +/C2_1 1 Tf +0.814 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +/C2_1 1 Tf +2.482 0 Td +<005D>Tj +/TT0 1 Tf +(le, )Tj +1.926 0 Td +(or )Tj +1.203 0 Td +(in )Tj +1.148 0 Td +(a )Tj +0.814 0 Td +(database, )Tj +4.371 0 Td +(a )Tj +0.814 0 Td +(single )Tj +2.815 0 Td +(point )Tj +2.538 0 Td +(of )Tj +/C2_1 1 Tf +1.148 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.482 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(es )Tj +1.203 0 Td +(the )Tj +1.334 0 Td +( )Tj +-42.2 -1.44 Td +(maintainability)Tj +6.355 0 Td +(.)Tj +-4.555 -2.24 Td +(Flushing )Tj +4.038 0 Td +(of )Tj +1.259 0 Td +(the )Tj +1.759 0 Td +(hits )Tj +1.926 0 Td +(and )Tj +2.037 0 Td +(referer )Tj +3.202 0 Td +(cac)Tj +1.482 0 Td +(hes )Tj +1.87 0 Td +(in )Tj +1.259 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.925 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.314 0 Td +(implemented )Tj +6.093 0 Td +(in )Tj +1.259 0 Td +(the )Tj +/C2_1 1 Tf +1.759 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.981 0 Td +(iter)Tj +1.377 0 Td +(ation )Tj +2.593 0 Td +(with )Tj +/TT1 1 Tf +-40.31 -1.44 Td +(@Schedule)Tj +/TT0 1 Tf +( expression:)Tj +/TT1 1 Tf +0 -1.79 TD +( @Schedule\(minute = "*/5", hour = "*", persistent = false\))Tj +T* +( public void persistHitsCache\(\) {)Tj +T* +( hitStore.store\(hitStatistics.getChangedEntriesAndClear\(\)\);)Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.701 0 Td +(timeout )Tj +3.924 0 Td +(period )Tj +3.424 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.534 0 Td +(directly )Tj +3.868 0 Td +(hard-coded )Tj +5.591 0 Td +(in )Tj +1.479 0 Td +(the )Tj +/TT1 1 Tf +1.979 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +3.045 0 Td +(class. )Tj +2.905 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.701 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +3.045 0 Td +(class )Tj +2.701 0 Td +(also)Tj +( )Tj +-40.477 -1.44 Td +(maintained )Tj +5.371 0 Td +(a )Tj +1.036 0 Td +(referer )Tj +3.313 0 Td +(and )Tj +2.148 0 Td +(trend )Tj +2.759 0 Td +(timer\227all )Tj +4.814 0 Td +(with )Tj +2.426 0 Td +(hard-coded )Tj +5.482 0 Td +(v)Tj +0.476 0 Td +(alues. )Tj +3.037 0 Td +(Because )Tj +4.092 0 Td +(the )Tj +1.87 0 Td +(existence )Tj +4.537 0 Td +(of )Tj +-41.366 -1.44 Td +(referers )Tj +3.555 0 Td +(and )Tj +2.001 0 Td +(trend )Tj +2.612 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +2.612 0 Td +(inside )Tj +2.946 0 Td +(a )Tj +0.889 0 Td +(class )Tj +2.445 0 Td +(named )Tj +/TT1 1 Tf +3.334 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.789 0 Td +(is )Tj +1.056 0 Td +(not )Tj +1.779 0 Td +(ob)Tj +1.1 0 Td +(vious, )Tj +2.946 0 Td +(the )Tj +/C2_1 1 Tf +1.723 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.557 0 Td +(becomes)Tj +( )Tj +-38.366 -1.44 Td +(harder )Tj +3.203 0 Td +(to )Tj +1.259 0 Td +(maintain. )Tj +4.445 0 Td +(Although )Tj +4.372 0 Td +(the )Tj +1.759 0 Td +(EJB )Tj +/TT1 1 Tf +1.814 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.825 0 Td +(bean )Tj +2.537 0 Td +(can )Tj +1.981 0 Td +(be )Tj +1.481 0 Td +(still )Tj +1.926 0 Td +(considered )Tj +5.149 0 Td +(cohesi)Tj +2.761 0 Td +(v)Tj +0.488 0 Td +(e, )Tj +1.203 0 Td +(information )Tj +-37.198 -1.44 Td +(about )Tj +2.805 0 Td +(referers )Tj +3.525 0 Td +(and )Tj +1.971 0 Td +(trends )Tj +2.971 0 Td +(is )Tj +1.026 0 Td +(deri)Tj +1.649 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +1.415 0 Td +(from )Tj +2.359 0 Td +(a )Tj +0.859 0 Td +(request )Tj +3.471 0 Td +(\(hit\), )Tj +2.305 0 Td +(so )Tj +1.304 0 Td +(this )Tj +1.86 0 Td +(is )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 347.3879 100.3002 Tm +(not )Tj +1.749 0 Td +(the )Tj +1.693 0 Td +(best )Tj +2.082 0 Td +(place )Tj +2.693 0 Td +(to )Tj +1.193 0 Td +(store )Tj +2.415 0 Td +(the)Tj +( )Tj +/C2_1 1 Tf +-40.866 -1.44 Td +<004C00410045003D004A0001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +6.045 0 Td +(ation. )Tj +ET + +endstream +endobj +234 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 235 0 R>>endobj +235 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(99)Tj +0 Tc 0 Tw -18.632 57.06 Td +(T)Tj +0.511 0 Td +(he )Tj +1.386 0 Td +(dur)Tj +1.433 0 Td +(ation )Tj +2.498 0 Td +(between )Tj +3.998 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +/C2_0 1 Tf +1.386 0 Td +<005E>Tj +/TT0 1 Tf +(ushes )Tj +3.276 0 Td +(is )Tj +0.997 0 Td +(an )Tj +1.386 0 Td +(interesting )Tj +4.776 0 Td +(tuning )Tj +3.054 0 Td +(option. )Tj +3.388 0 Td +(Long )Tj +2.442 0 Td +(periods )Tj +3.498 0 Td +(for )Tj +1.497 0 Td +(the )Tj +1.664 0 Td +(Hits )Tj +-40.477 -1.44 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.385 0 Td +(could )Tj +2.775 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.829 0 Td +(the )Tj +1.663 0 Td +(database )Tj +4.108 0 Td +(performance )Tj +/C2_0 1 Tf +5.774 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly)Tj +5.077 0 Td +(. )Tj +0.533 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.385 0 Td +(number )Tj +3.663 0 Td +(of )Tj +1.163 0 Td +(affected )Tj +3.719 0 Td +(URIs )Tj +2.385 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +-40.254 -1.44 Td +(not )Tj +1.841 0 Td +(gro)Tj +1.377 0 Td +(w )Tj +/C2_0 1 Tf +1.229 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly; )Tj +5.898 0 Td +(r)Tj +0.321 0 Td +(ather)Tj +2.093 0 Td +(, )Tj +0.729 0 Td +(only )Tj +2.341 0 Td +(the )Tj +1.785 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.285 0 Td +(of )Tj +1.285 0 Td +(their )Tj +2.396 0 Td +(hits )Tj +1.952 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.397 0 Td +(increase. )Tj +4.285 0 Td +(On )Tj +1.84 0 Td +(the )Tj +1.785 0 Td +(other )Tj +2.674 0 Td +(hand, )Tj +-39.754 -1.44 Td +(longer )Tj +3.116 0 Td +(periods )Tj +3.561 0 Td +(for )Tj +1.56 0 Td +(the )Tj +1.727 0 Td +(referer )Tj +3.17 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.449 0 Td +(could )Tj +2.839 0 Td +(lead )Tj +2.227 0 Td +(to )Tj +1.227 0 Td +(slo)Tj +1.211 0 Td +(wer )Tj +2.004 0 Td +(tr)Tj +0.599 0 Td +(ansactions, )Tj +5.173 0 Td +(because )Tj +3.894 0 Td +(it )Tj +0.949 0 Td +(is )Tj +1.06 0 Td +(more )Tj +2.615 0 Td +(likely)Tj +( )Tj +-39.866 -1.44 Td +(that )Tj +1.999 0 Td +(the )Tj +1.721 0 Td +(number )Tj +3.721 0 Td +(of )Tj +1.221 0 Td +(records )Tj +3.554 0 Td +(\(blog )Tj +2.555 0 Td +(visitors\) )Tj +3.666 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.333 0 Td +(also )Tj +2.11 0 Td +(increase. )Tj +4.221 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.276 0 Td +(both )Tj +2.333 0 Td +(cases, )Tj +2.943 0 Td +(the )Tj +1.721 0 Td +(length )Tj +3.055 0 Td +(of )Tj +1.221 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(period )Tj +3.161 0 Td +(between )Tj +/C2_0 1 Tf +4.05 0 Td +<005E>Tj +/TT0 1 Tf +(ushes )Tj +3.328 0 Td +(is )Tj +1.049 0 Td +(directly )Tj +3.605 0 Td +(related )Tj +3.327 0 Td +(to )Tj +1.216 0 Td +(the )Tj +1.716 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.106 0 Td +(of )Tj +1.216 0 Td +(the )Tj +1.716 0 Td +(data. )Tj +2.494 0 Td +(In )Tj +1.216 0 Td +(the )Tj +1.716 0 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.716 0 Td +(of )Tj +1.216 0 Td +(a )Tj +0.882 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +-41.367 -1.44 Td +(cr)Tj +0.821 0 Td +(ash or restart, all data between cac)Tj +/C2_0 1 Tf +14.931 0 Td +<0040003D0001005E>Tj +/TT0 1 Tf +(ushes w)Tj +5.324 0 Td +(ould be lost.)Tj +-19.276 -2.24 Td +(I )Tj +0.677 0 Td +(factored )Tj +3.9 0 Td +(out )Tj +1.789 0 Td +(the )Tj +1.733 0 Td +(hard-coded )Tj +5.345 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +2.622 0 Td +(in )Tj +1.233 0 Td +(the )Tj +/TT1 1 Tf +1.733 0 Td +(@Schedule)Tj +/TT0 1 Tf +( )Tj +5.8 0 Td +(annotation )Tj +5.013 0 Td +(into )Tj +2.067 0 Td +(standalone )Tj +5.068 0 Td +(classes )Tj +-39.255 -1.44 Td +(and con)Tj +3.49 0 Td +(v)Tj +0.488 0 Td +(erted them to progr)Tj +8.268 0 Td +(ammatic timers \(see Listing 51\).)Tj +/TT1 1 Tf +-12.246 -4.03 Td +(@Singleton)Tj +0 -1.79 TD +(@Startup)Tj +T* +(public class HitsFlushTimer {)Tj +/TT2 1 Tf +0 -3.58 TD +( @Inject)Tj +0 -1.79 TD +( private int hitsFlushRate;)Tj +/TT1 1 Tf +0 -3.58 TD +( @EJB)Tj +0 -1.79 TD +( Hits hits;)Tj +0 -3.58 TD +( @Resource)Tj +0 -1.79 TD +( TimerService timerService;)Tj +0 -3.58 TD +( @PostConstruct)Tj +0 -1.79 TD +( public void initializeTimer\(\) {)Tj +T* +( ScheduleExpression expression = new ScheduleExpression\(\);)Tj +T* +( expression.minute\("*/" + this.hitsFlushRate\).hour\("*"\);)Tj +T* +( TimerConfig timerConfig = new TimerConfig\(\);)Tj +T* +( timerConfig.setPersistent\(false\);)Tj +T* +( timerService.createCalendarTimer\(expression, timerConfig\);)Tj +T* +( })Tj +ET + +endstream +endobj +236 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 237 0 R>>endobj +237 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(100)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( @Timeout)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( public void initiateFlush\(\) {)Tj +0 -1.79 TD +( this.hits.persistHitsCache\(\);)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 51: Progr)Tj +/C2_0 1 Tf +6.991 0 Td +<0039004500450039004C0041003B000100390046003C0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +9.602 0 Td +(able )Tj +2.038 0 Td +(T)Tj +/C2_0 1 Tf +0.482 0 Td +<00410045003D004A0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +5.934 0 Td +(ation)Tj +/TT1 1 Tf +-23.247 -2.24 Td +(HitsFlushTimer)Tj +/TT0 1 Tf +( )Tj +8.767 0 Td +(in )Tj +1.2 0 Td +(Listing )Tj +3.145 0 Td +(51 )Tj +1.478 0 Td +(performs )Tj +4.144 0 Td +(the )Tj +1.7 0 Td +(timer )Tj +/C2_0 1 Tf +2.588 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.534 0 Td +(in )Tj +1.2 0 Td +(the )Tj +/TT1 1 Tf +1.7 0 Td +(@PostConstruct)Tj +/TT0 1 Tf +( )Tj +-33.799 -1.44 Td +(hook. )Tj +2.706 0 Td +(All )Tj +1.52 0 Td +(par)Tj +1.377 0 Td +(ameters )Tj +3.63 0 Td +(required )Tj +3.909 0 Td +(for )Tj +1.464 0 Td +(the )Tj +1.631 0 Td +(initialization )Tj +5.689 0 Td +(of )Tj +1.131 0 Td +(a )Tj +0.797 0 Td +(progr)Tj +2.266 0 Td +(ammatically )Tj +5.575 0 Td +(created )Tj +3.464 0 Td +(timer )Tj +2.519 0 Td +(are )Tj +1.63 0 Td +(passed )Tj +-39.31 -1.44 Td +(as )Tj +/TT1 1 Tf +1.29 0 Td +(ScheduleExpression)Tj +/TT0 1 Tf +( )Tj +11.203 0 Td +(instances )Tj +4.347 0 Td +(to )Tj +1.235 0 Td +(the )Tj +1.735 0 Td +(injected )Tj +/TT1 1 Tf +3.847 0 Td +(TimerService)Tj +/TT0 1 Tf +(. )Tj +7.88 0 Td +(In )Tj +1.235 0 Td +(contr)Tj +2.211 0 Td +(ast )Tj +1.568 0 Td +(to )Tj +1.235 0 Td +(the )Tj +1.735 0 Td +(use )Tj +1.846 0 Td +(of )Tj +/TT1 1 Tf +-41.366 -1.44 Td +(@Schedule)Tj +/TT0 1 Tf +( )Tj +5.961 0 Td +(annotation, )Tj +5.452 0 Td +(a )Tj +1.06 0 Td +(progr)Tj +2.266 0 Td +(ammatically )Tj +5.838 0 Td +(created )Tj +3.727 0 Td +(timer )Tj +2.782 0 Td +(can )Tj +2.116 0 Td +(be )Tj +/C2_0 1 Tf +1.616 0 Td +<004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +6.006 0 Td +(without )Tj +3.84 0 Td +(an)Tj +1.038 0 Td +(y )Tj +-41.7 -1.44 Td +(recompilation. )Tj +6.815 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.684 0 Td +(the )Tj +1.906 0 Td +(injected )Tj +/C2_0 1 Tf +4.018 0 Td +<005D>Tj +/TT0 1 Tf +(eld )Tj +/TT1 1 Tf +2.462 0 Td +(hitsFlushRate)Tj +/TT0 1 Tf +(, )Tj +8.651 0 Td +(the )Tj +1.906 0 Td +(timer )Tj +2.794 0 Td +(can )Tj +2.128 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.628 0 Td +(be )Tj +/C2_0 1 Tf +1.628 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +-37.587 -1.44 Td +(externally)Tj +4.131 0 Td +(. )Tj +0.623 0 Td +(Dependenc)Tj +4.978 0 Td +(y )Tj +0.845 0 Td +(Injection )Tj +4.125 0 Td +(of )Tj +1.179 0 Td +(primiti)Tj +2.816 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.845 0 Td +(types )Tj +2.568 0 Td +(w)Tj +0.766 0 Td +(orks )Tj +2.123 0 Td +(without )Tj +3.625 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.845 0 Td +(XML )Tj +2.345 0 Td +(or )Tj +1.234 0 Td +(further )Tj +3.179 0 Td +(ceremon)Tj +3.76 0 Td +(y)Tj +0.408 0 Td +(. )Tj +-41.922 -1.44 Td +(Only )Tj +2.477 0 Td +(a )Tj +0.81 0 Td +(producer )Tj +4.2 0 Td +(method, )Tj +3.867 0 Td +(or )Tj +1.199 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.366 0 Td +(just )Tj +1.811 0 Td +(a )Tj +0.81 0 Td +(plain )Tj +/C2_0 1 Tf +2.478 0 Td +<005D>Tj +/TT0 1 Tf +(eld )Tj +2.2 0 Td +(with )Tj +2.2 0 Td +(matc)Tj +2.093 0 Td +(hing )Tj +2.2 0 Td +(type, )Tj +2.422 0 Td +(is )Tj +0.977 0 Td +(required )Tj +3.922 0 Td +(to )Tj +1.144 0 Td +(perform )Tj +3.699 0 Td +(the )Tj +-40.866 -1.44 Td +(injection. )Tj +4.299 0 Td +(A nai)Tj +2.261 0 Td +(v)Tj +0.488 0 Td +(e producer implementation could be like this:)Tj +/TT2 1 Tf +-7.048 -1.79 Td +(@javax.enterprise.inject.Produces)Tj +/TT1 1 Tf +0 -1.79 TD +(public int getHitsFlushIntervallInMinutes\(\) {)Tj +28.8 0 Td +( return 1;)Tj +-28.8 -1.79 Td +(})Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(hankfully)Tj +3.91 0 Td +(, CDI introduces additional meta-information \()Tj +/TT1 1 Tf +(InjectionPoint)Tj +/TT0 1 Tf +( in Listing 52\) )Tj +-6.221 -1.44 Td +(that can be passed to a producer method on demand.)Tj +/TT1 1 Tf +0 -1.79 TD +(@Startup)Tj +0 -1.79 TD +(@Singleton)Tj +T* +(public class Configuration {)Tj +T* +( private Map configuration;)Tj +T* +( @PostConstruct)Tj +T* +( public void fetchConfiguration\(\) {)Tj +T* +( this.configuration = new HashMap\(\) {{)Tj +T* +( put\("version", "0.5"\);)Tj +T* +( put\("hitsFlushRate", "1"\);)Tj +T* +( put\("referersFlushRate", "1"\);)Tj +T* +( }};)Tj +T* +( })Tj +0 -3.58 TD +( @javax.enterprise.inject.Produces)Tj +ET + +endstream +endobj +238 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 240 0 R>>endobj +239 0 obj<>endobj +240 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(101)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( public String getString\()Tj +/TT2 1 Tf +(InjectionPoint point)Tj +/TT1 1 Tf +(\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( String fieldName = point.getMember\(\).getName\(\);)Tj +0 -1.79 TD +( return configuration.get\(fieldName\);)Tj +T* +( })Tj +0 -3.58 TD +( @javax.enterprise.inject.Produces)Tj +0 -1.79 TD +( public long getLong\(InjectionPoint point\) {)Tj +T* +( String stringValue = getString\(point\);)Tj +T* +( return Long.parseLong\(stringValue\);)Tj +T* +( })Tj +0 -3.58 TD +( @javax.enterprise.inject.Produces)Tj +0 -1.79 TD +( public int getInteger\(InjectionPoint point\) {)Tj +T* +( String stringValue = getString\(point\);)Tj +T* +( return Integer.parseInt\(stringValue\);)Tj +T* +( })Tj +0 -3.58 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 52: )Tj +/C2_0 1 Tf +4.688 0 Td +<001D00010023003D0046003D004A0041003B0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +8.38 0 Td +(ation Sour)Tj +4.379 0 Td +(ce)Tj +-15.647 -2.24 Td +(Using )Tj +2.883 0 Td +(a )Tj +0.882 0 Td +(slightly )Tj +/C2_0 1 Tf +3.439 0 Td +<00450047003C0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.217 0 Td +(v)Tj +0.488 0 Td +(ersion )Tj +2.994 0 Td +(of )Tj +1.216 0 Td +(the )Tj +1.716 0 Td +(producer )Tj +4.272 0 Td +(with )Tj +2.272 0 Td +(an )Tj +/TT1 1 Tf +1.438 0 Td +(InjectionPoint)Tj +/TT0 1 Tf +( )Tj +8.784 0 Td +(par)Tj +1.377 0 Td +(ameter)Tj +2.87 0 Td +(, )Tj +0.66 0 Td +(as )Tj +-41.311 -1.44 Td +(demonstr)Tj +3.989 0 Td +(ated )Tj +2.161 0 Td +(with )Tj +2.217 0 Td +(the )Tj +1.661 0 Td +(method )Tj +/TT1 1 Tf +3.606 0 Td +(String )Tj +4.25 0 Td +(getString\(InjectionPoint )Tj +15.052 0 Td +(point)Tj +/TT0 1 Tf +(\) )Tj +3.606 0 Td +(in )Tj +1.161 0 Td +(Listing )Tj +3.106 0 Td +(52, )Tj +-40.81 -1.44 Td +(makes )Tj +3.059 0 Td +(the )Tj +/C2_0 1 Tf +1.671 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(nition )Tj +4.451 0 Td +(of )Tj +1.171 0 Td +(a )Tj +0.837 0 Td +(custom )Tj +/C2_0 1 Tf +3.449 0 Td +<0049004D003900440041005D>Tj +/TT0 1 Tf +(er )Tj +3.894 0 Td +(obsolete. )Tj +4.154 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.393 0 Td +(InjectionPoint)Tj +/TT0 1 Tf +( )Tj +8.738 0 Td +(par)Tj +1.377 0 Td +(ameter )Tj +3.281 0 Td +(wr)Tj +1.099 0 Td +(aps )Tj +1.782 0 Td +(the )Tj +-40.866 -1.44 Td +(meta-information )Tj +7.727 0 Td +(about )Tj +2.727 0 Td +(the )Tj +/C2_0 1 Tf +1.615 0 Td +<005D>Tj +/TT0 1 Tf +(eld, )Tj +2.449 0 Td +(setter)Tj +2.204 0 Td +(, )Tj +0.559 0 Td +(or )Tj +1.17 0 Td +(constructor)Tj +4.761 0 Td +(. )Tj +0.559 0 Td +(It )Tj +0.837 0 Td +(is )Tj +0.948 0 Td +(also )Tj +2.004 0 Td +(possible )Tj +3.783 0 Td +(to )Tj +1.115 0 Td +(obtain )Tj +3.005 0 Td +(the )Tj +1.615 0 Td +(name )Tj +2.67 0 Td +(of )Tj +1.115 0 Td +(the)Tj +( )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<005D>Tj +/TT0 1 Tf +(eld, w)Tj +3.206 0 Td +(hic)Tj +1.316 0 Td +(h can used as a key for the lookup in a )Tj +/TT1 1 Tf +(Map)Tj +/TT0 1 Tf +(. )Tj +-2.722 -2.24 Td +(T)Tj +0.538 0 Td +(h)Tj +0.583 0 Td +(e )Tj +/TT1 1 Tf +1.291 0 Td +(C)Tj +0.627 0 Td +(o)Tj +0.627 0 Td +(n)Tj +0.627 0 Td +(f)Tj +0.627 0 Td +(i)Tj +0.627 0 Td +(g)Tj +0.627 0 Td +(u)Tj +0.627 0 Td +(r)Tj +0.627 0 Td +(a)Tj +0.627 0 Td +(t)Tj +0.627 0 Td +(i)Tj +0.627 0 Td +(o)Tj +0.627 0 Td +(n)Tj +/TT0 1 Tf +( )Tj +1.391 0 Td +(s)Tj +0.416 0 Td +(i)Tj +0.305 0 Td +(n)Tj +0.583 0 Td +(g)Tj +0.527 0 Td +(l)Tj +0.305 0 Td +(e)Tj +0.527 0 Td +(t)Tj +0.305 0 Td +(o)Tj +0.583 0 Td +(n )Tj +1.347 0 Td +(s)Tj +0.416 0 Td +(e)Tj +0.527 0 Td +(s)Tj +0.416 0 Td +(s)Tj +0.416 0 Td +(i)Tj +0.305 0 Td +(o)Tj +0.583 0 Td +(n )Tj +1.347 0 Td +(b)Tj +0.583 0 Td +(e)Tj +0.527 0 Td +(a)Tj +0.527 0 Td +(n )Tj +1.347 0 Td +(p)Tj +0.583 0 Td +(o)Tj +0.583 0 Td +(p)Tj +0.583 0 Td +(u)Tj +0.583 0 Td +(l)Tj +0.305 0 Td +(a)Tj +0.527 0 Td +(t)Tj +0.305 0 Td +(e)Tj +0.527 0 Td +(s )Tj +1.18 0 Td +(t)Tj +0.305 0 Td +(h)Tj +0.583 0 Td +(e )Tj +1.291 0 Td +(c)Tj +0.527 0 Td +(o)Tj +0.583 0 Td +(n)Tj +/C2_0 1 Tf +0.583 0 Td +<005D>Tj +/TT0 1 Tf +0.583 0 Td +(g)Tj +0.527 0 Td +(u)Tj +0.583 0 Td +(r)Tj +0.348 0 Td +(a)Tj +0.527 0 Td +(t)Tj +0.305 0 Td +(i)Tj +0.305 0 Td +(o)Tj +0.583 0 Td +(n )Tj +1.347 0 Td +(i)Tj +0.305 0 Td +(n )Tj +1.347 0 Td +(t)Tj +0.305 0 Td +(h)Tj +0.583 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(@PostConstruct)Tj +/TT0 1 Tf +( )Tj +8.709 0 Td +(method. )Tj +3.828 0 Td +(All )Tj +1.531 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +2.531 0 Td +(are )Tj +1.641 0 Td +(still )Tj +1.809 0 Td +(hard-coded, )Tj +5.532 0 Td +(but )Tj +1.698 0 Td +(they )Tj +2.142 0 Td +(reside )Tj +2.864 0 Td +(in )Tj +1.142 0 Td +(a )Tj +0.808 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.086 0 Td +(class )Tj +2.364 0 Td +(with )Tj +-40.31 -1.44 Td +(a )Tj +0.877 0 Td +(meaningful )Tj +5.212 0 Td +(name. )Tj +3.044 0 Td +(In )Tj +1.211 0 Td +(the )Tj +/TT1 1 Tf +1.711 0 Td +(getString)Tj +/TT0 1 Tf +( )Tj +5.778 0 Td +(method, )Tj +3.934 0 Td +(the )Tj +1.711 0 Td +(name )Tj +2.766 0 Td +(of )Tj +1.211 0 Td +(the )Tj +/TT1 1 Tf +1.711 0 Td +(InjectionPoint)Tj +/TT0 1 Tf +( )Tj +8.778 0 Td +(is )Tj +1.044 0 Td +(used )Tj +2.378 0 Td +(to)Tj +( )Tj +-41.366 -1.44 Td +(look )Tj +2.423 0 Td +(up )Tj +1.645 0 Td +(the )Tj +1.867 0 Td +(corresponding )Tj +6.702 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.367 0 Td +(in )Tj +1.367 0 Td +(the )Tj +1.867 0 Td +(populated )Tj +/C2_0 1 Tf +4.869 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation. )Tj +2.905 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.589 0 Td +(remaining )Tj +4.867 0 Td +(getters )Tj +3.311 0 Td +(only )Tj +-40.31 -1.44 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(ert a string to the desired type.)Tj +ET + +endstream +endobj +241 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 242 0 R>>endobj +242 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(102)Tj +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 593.2002 Tm +(Easy Extensibility for the Unlikely Case)Tj +/TT0 1 Tf +10 0 0 10 75 570.8002 Tm +(Sometimes, )Tj +5.396 0 Td +(it )Tj +1.007 0 Td +(might )Tj +2.896 0 Td +(be )Tj +1.507 0 Td +(necessary )Tj +4.618 0 Td +(to )Tj +1.285 0 Td +(load )Tj +2.341 0 Td +(the )Tj +/C2_0 1 Tf +1.785 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.619 0 Td +(from )Tj +2.451 0 Td +(external )Tj +3.896 0 Td +(data )Tj +2.285 0 Td +(sour)Tj +1.822 0 Td +(ces. )Tj +2.118 0 Td +(In )Tj +-41.366 -1.44 Td +(gener)Tj +2.377 0 Td +(al, )Tj +1.418 0 Td +(en)Tj +1.044 0 Td +(vironment-dependent )Tj +9.643 0 Td +(par)Tj +1.377 0 Td +(ameters, )Tj +3.973 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.918 0 Td +(as )Tj +1.251 0 Td +(IP )Tj +1.196 0 Td +(addresses )Tj +4.474 0 Td +(and )Tj +1.974 0 Td +(pass)Tj +1.822 0 Td +(w)Tj +0.766 0 Td +(ords, )Tj +2.474 0 Td +(should )Tj +3.253 0 Td +(not )Tj +1.752 0 Td +(be )Tj +-41.144 -1.44 Td +(hard-coded. )Tj +5.672 0 Td +(En)Tj +1.044 0 Td +(vironmental )Tj +/C2_0 1 Tf +5.616 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.616 0 Td +(is )Tj +1.115 0 Td +(usually )Tj +3.505 0 Td +(maintained )Tj +5.283 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.948 0 Td +(administr)Tj +3.989 0 Td +(ators )Tj +2.504 0 Td +(or )Tj +1.337 0 Td +(oper)Tj +1.933 0 Td +(ations )Tj +-39.643 -1.44 Td +(without ha)Tj +4.584 0 Td +(ving access to the actual code.)Tj +-2.784 -2.24 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.494 0 Td +(a )Tj +0.882 0 Td +(minor )Tj +2.938 0 Td +(extension)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.745 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.438 0 Td +(external )Tj +3.827 0 Td +(data )Tj +2.216 0 Td +(sour)Tj +1.822 0 Td +(ces )Tj +1.771 0 Td +(can )Tj +1.938 0 Td +(be )Tj +1.438 0 Td +(loaded )Tj +3.328 0 Td +(and )Tj +1.994 0 Td +(merged )Tj +3.604 0 Td +(on )Tj +1.494 0 Td +(demand )Tj +-38.699 -1.44 Td +(with the hard)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(coded defaults: )Tj +/TT3 1 Tf +0 -1.79 TD +(public interface ConfigurationProvider {)Tj +T* +( public Map getConfiguration\(\);)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 53: )Tj +4.688 0 Td +(Abstr)Tj +2.211 0 Td +(act of Implementation for an )Tj +12.468 0 Td +(Arbitr)Tj +/C2_0 1 Tf +2.433 0 Td +<0039004A00510001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +5.323 0 Td +(ation Sour)Tj +4.379 0 Td +(ce )Tj +-29.702 -2.24 Td +(I)Tj +0.411 0 Td +(n )Tj +1.4 0 Td +(L)Tj +0.633 0 Td +(i)Tj +0.411 0 Td +(s)Tj +0.522 0 Td +(t)Tj +0.411 0 Td +(i)Tj +0.411 0 Td +(n)Tj +0.689 0 Td +(g )Tj +1.344 0 Td +(5)Tj +0.689 0 Td +(3)Tj +0.689 0 Td +(, )Tj +1.122 0 Td +(e)Tj +0.633 0 Td +(x)Tj +0.633 0 Td +(t)Tj +0.411 0 Td +(e)Tj +0.633 0 Td +(r)Tj +0.466 0 Td +(n)Tj +0.689 0 Td +(a)Tj +0.633 0 Td +(l )Tj +1.122 0 Td +(c)Tj +0.633 0 Td +(o)Tj +0.689 0 Td +(n)Tj +/C2_0 1 Tf +0.689 0 Td +<005D>Tj +/TT0 1 Tf +0.689 0 Td +(g)Tj +0.633 0 Td +(u)Tj +0.689 0 Td +(r)Tj +0.454 0 Td +(a)Tj +0.633 0 Td +(t)Tj +0.411 0 Td +(i)Tj +0.411 0 Td +(o)Tj +0.689 0 Td +(n )Tj +1.4 0 Td +(s)Tj +0.522 0 Td +(o)Tj +0.689 0 Td +(u)Tj +0.689 0 Td +(r)Tj +0.454 0 Td +(c)Tj +0.633 0 Td +(e)Tj +0.633 0 Td +(s )Tj +1.233 0 Td +(a)Tj +0.633 0 Td +(r)Tj +0.466 0 Td +(e )Tj +1.344 0 Td +(a)Tj +0.633 0 Td +(b)Tj +0.689 0 Td +(s)Tj +0.522 0 Td +(t)Tj +0.411 0 Td +(r)Tj +0.454 0 Td +(a)Tj +0.633 0 Td +(c)Tj +0.633 0 Td +(t)Tj +0.411 0 Td +(e)Tj +0.633 0 Td +(d )Tj +1.4 0 Td +(w)Tj +0.911 0 Td +(i)Tj +0.411 0 Td +(t)Tj +0.411 0 Td +(h )Tj +1.4 0 Td +(t)Tj +0.411 0 Td +(h)Tj +0.689 0 Td +(e )Tj +/TT3 1 Tf +-41.7 -1.44 Td +(ConfigurationProvider)Tj +/TT0 1 Tf +( )Tj +13.146 0 Td +(interface. )Tj +4.452 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.655 0 Td +(only )Tj +2.433 0 Td +(need )Tj +2.655 0 Td +(to )Tj +1.377 0 Td +(make )Tj +2.876 0 Td +(a )Tj +1.043 0 Td +(realization )Tj +5.1 0 Td +(of )Tj +1.377 0 Td +(the )Tj +1.877 0 Td +(interface )Tj +-38.477 -1.44 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.171 0 Td +(in )Tj +1.115 0 Td +(the )Tj +1.615 0 Td +(module )Tj +3.56 0 Td +(and )Tj +1.893 0 Td +(return )Tj +2.837 0 Td +(a )Tj +/TT3 1 Tf +0.781 0 Td +(Map)Tj +/TT0 1 Tf +( )Tj +11.083 0 Td +(from )Tj +2.281 0 Td +(a )Tj +/C2_0 1 Tf +0.781 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.449 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.281 0 Td +(of )Tj +1.115 0 Td +(y)Tj +0.482 0 Td +(our )Tj +-40.755 -1.44 Td +(c)Tj +0.482 0 Td +(hoice. )Tj +2.909 0 Td +(All implementations will be automatically disco)Tj +20.552 0 Td +(v)Tj +0.488 0 Td +(ered and included at startup.)Tj +/TT3 1 Tf +-24.431 -1.79 Td +(@Startup)Tj +0 -1.79 TD +(@Singleton)Tj +T* +(public class Configuration {)Tj +0 -3.58 TD +( private Map configuration;)Tj +0 -1.79 TD +( )Tj +T* +( )Tj +/TT4 1 Tf +(@Inject)Tj +T* +( private Instance configurationProvider;)Tj +/TT3 1 Tf +0 -3.58 TD +( @PostConstruct)Tj +0 -1.79 TD +( public void fetchConfiguration\(\) {)Tj +T* +( this.configuration = new HashMap\(\) {{)Tj +0 -1.79 TD +( put\("version", "0.5"\);)Tj +0 -1.79 TD +( put\("hitsFlushRate", "1"\);)Tj +T* +( put\("referersFlushRate", "1"\);)Tj +ET + +endstream +endobj +243 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 244 0 R>>endobj +244 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(103)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( }};)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( this.unconfiguredFields = new HashSet\(\);)Tj +0 -1.79 TD +( )Tj +/TT2 1 Tf +T* +( mergeWithCustomConfiguration\(\);)Tj +/TT1 1 Tf +T* +( })Tj +T* +( )Tj +/TT2 1 Tf +T* +( void mergeWithCustomConfiguration\(\){)Tj +T* +( for \(ConfigurationProvider provider : configurationProvider\) {\ )Tj +T* +( Map customConfiguration = )Tj +0 -0.99 TD +(provider.getConfiguration\(\);)Tj +0 -1.79 TD +( this.configuration.putAll\(customConfiguration\);)Tj +T* +( })Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 54: Extension Mec)Tj +/C2_0 1 Tf +10.987 0 Td +<0040003900460041004B00450001003E0047004A000100210050004C003D004A0046003900440001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +12.27 0 Td +(ation Sour)Tj +4.379 0 Td +(ces)Tj +-25.836 -2.24 Td +(As )Tj +1.486 0 Td +(sho)Tj +1.489 0 Td +(wn )Tj +1.764 0 Td +(Listing )Tj +3.209 0 Td +(54, )Tj +1.82 0 Td +(the )Tj +1.764 0 Td +(realization )Tj +4.987 0 Td +(is )Tj +1.097 0 Td +(surprisingly )Tj +5.376 0 Td +(simple)Tj +/TT3 1 Tf +(.)Tj +/TT0 1 Tf +( )Tj +3.514 0 Td +(Instead )Tj +3.487 0 Td +(of )Tj +1.264 0 Td +(directly )Tj +3.653 0 Td +(injecting )Tj +4.154 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(ConfigurationInterface)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +14.146 0 Td +(a )Tj +/TT1 1 Tf +1.194 0 Td +(javax.enterprise.inject.Instance)Tj +/TT0 1 Tf +( )Tj +19.897 0 Td +(is )Tj +1.361 0 Td +(injected. )Tj +4.381 0 Td +(An)Tj +( )Tj +/TT1 1 Tf +-40.977 -1.44 Td +(Instance)Tj +/TT0 1 Tf +( )Tj +5.143 0 Td +(can )Tj +1.898 0 Td +(be )Tj +1.398 0 Td +(considered )Tj +5.066 0 Td +(as )Tj +1.231 0 Td +(a )Tj +0.842 0 Td +(proxy)Tj +2.353 0 Td +(, )Tj +0.62 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.898 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.509 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.454 0 Td +(to )Tj +1.176 0 Td +(d)Tj +0.532 0 Td +(ynamically )Tj +5.065 0 Td +(obtain )Tj +3.066 0 Td +(all )Tj +1.398 0 Td +(references )Tj +-37.811 -1.44 Td +(o)Tj +0.574 0 Td +(f )Tj +1.065 0 Td +(t)Tj +0.296 0 Td +(h)Tj +0.574 0 Td +(e )Tj +1.287 0 Td +(s)Tj +0.407 0 Td +(p)Tj +0.574 0 Td +(e)Tj +0.518 0 Td +(c)Tj +0.518 0 Td +(i)Tj +/C2_0 1 Tf +0.296 0 Td +<005D>Tj +/TT0 1 Tf +0.574 0 Td +(e)Tj +0.518 0 Td +(d )Tj +1.343 0 Td +(b)Tj +0.574 0 Td +(e)Tj +0.518 0 Td +(a)Tj +0.518 0 Td +(n)Tj +0.574 0 Td +(. )Tj +/TT1 1 Tf +1.065 0 Td +(j)Tj +0.618 0 Td +(a)Tj +0.618 0 Td +(v)Tj +0.618 0 Td +(a)Tj +0.618 0 Td +(x)Tj +0.618 0 Td +(.)Tj +0.618 0 Td +(e)Tj +0.618 0 Td +(n)Tj +0.618 0 Td +(t)Tj +0.618 0 Td +(e)Tj +0.618 0 Td +(r)Tj +0.618 0 Td +(p)Tj +0.618 0 Td +(r)Tj +0.618 0 Td +(i)Tj +0.618 0 Td +(s)Tj +0.618 0 Td +(e)Tj +0.618 0 Td +(.)Tj +0.618 0 Td +(i)Tj +0.618 0 Td +(n)Tj +0.618 0 Td +(j)Tj +0.618 0 Td +(e)Tj +0.618 0 Td +(c)Tj +0.618 0 Td +(t)Tj +0.618 0 Td +(.)Tj +0.618 0 Td +(I)Tj +0.618 0 Td +(n)Tj +0.618 0 Td +(s)Tj +0.618 0 Td +(t)Tj +0.618 0 Td +(a)Tj +0.618 0 Td +(n)Tj +0.618 0 Td +(c)Tj +0.618 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.387 0 Td +(a)Tj +0.518 0 Td +(l)Tj +0.296 0 Td +(s)Tj +0.407 0 Td +(o )Tj +1.343 0 Td +(i)Tj +0.296 0 Td +(m)Tj +0.851 0 Td +(p)Tj +0.574 0 Td +(l)Tj +0.296 0 Td +(e)Tj +0.518 0 Td +(m)Tj +0.851 0 Td +(e)Tj +0.518 0 Td +(n)Tj +0.574 0 Td +(t)Tj +0.296 0 Td +(s )Tj +1.176 0 Td +(t)Tj +0.296 0 Td +(h)Tj +0.574 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(java.lang.Iterable)Tj +/TT0 1 Tf +( )Tj +11.568 0 Td +(interface, )Tj +4.768 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.323 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.934 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.435 0 Td +(iter)Tj +1.377 0 Td +(ation )Tj +2.935 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.6 0 Td +(all )Tj +1.823 0 Td +(disco)Tj +2.267 0 Td +(v)Tj +0.488 0 Td +(ered )Tj +/TT1 1 Tf +-40.311 -1.44 Td +(ConfigurationProvider)Tj +/TT0 1 Tf +( implementations. )Tj +1.8 -2.24 Td +(Iter)Tj +1.377 0 Td +(ation )Tj +2.723 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.388 0 Td +(all )Tj +1.611 0 Td +(found )Tj +/TT1 1 Tf +3.057 0 Td +(ConfigurationProvider)Tj +/TT0 1 Tf +( )Tj +13.157 0 Td +(instances )Tj +4.501 0 Td +(and )Tj +2.167 0 Td +(merging )Tj +4.055 0 Td +(the )Tj +1.889 0 Td +(external )Tj +-38.755 -1.44 Td +(c)Tj +0.504 0 Td +(o)Tj +0.56 0 Td +(n)Tj +/C2_0 1 Tf +0.56 0 Td +<005D>Tj +/TT0 1 Tf +0.56 0 Td +(g)Tj +0.504 0 Td +(u)Tj +0.56 0 Td +(r)Tj +0.325 0 Td +(a)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(o)Tj +0.56 0 Td +(n )Tj +1.336 0 Td +(w)Tj +0.782 0 Td +(i)Tj +0.282 0 Td +(t)Tj +0.282 0 Td +(h )Tj +1.336 0 Td +(i)Tj +0.282 0 Td +(n)Tj +0.56 0 Td +(t)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(r)Tj +0.337 0 Td +(n)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(l )Tj +/TT1 1 Tf +1.058 0 Td +(M)Tj +0.605 0 Td +(a)Tj +0.605 0 Td +(p)Tj +/TT0 1 Tf +( )Tj +1.38 0 Td +(h)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(p)Tj +0.56 0 Td +(p)Tj +0.56 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(s )Tj +1.169 0 Td +(i)Tj +0.282 0 Td +(n )Tj +1.336 0 Td +(t)Tj +0.282 0 Td +(h)Tj +0.56 0 Td +(e )Tj +/TT1 1 Tf +1.28 0 Td +(m)Tj +0.605 0 Td +(e)Tj +0.605 0 Td +(r)Tj +0.605 0 Td +(g)Tj +0.605 0 Td +(e)Tj +0.605 0 Td +(W)Tj +0.605 0 Td +(i)Tj +0.605 0 Td +(t)Tj +0.605 0 Td +(h)Tj +0.605 0 Td +(C)Tj +0.605 0 Td +(u)Tj +0.605 0 Td +(s)Tj +0.605 0 Td +(t)Tj +0.605 0 Td +(o)Tj +0.605 0 Td +(m)Tj +0.605 0 Td +(C)Tj +0.605 0 Td +(o)Tj +0.605 0 Td +(n)Tj +0.605 0 Td +(f)Tj +0.605 0 Td +(i)Tj +0.605 0 Td +(g)Tj +0.605 0 Td +(u)Tj +0.605 0 Td +(r)Tj +0.605 0 Td +(a)Tj +0.605 0 Td +(t)Tj +0.605 0 Td +(i)Tj +0.605 0 Td +(o)Tj +0.605 0 Td +(n)Tj +0.605 0 Td +(\()Tj +0.605 0 Td +(\))Tj +/TT0 1 Tf +( )Tj +-41.6 -1.44 Td +(m)Tj +0.843 0 Td +(e)Tj +0.51 0 Td +(t)Tj +0.288 0 Td +(h)Tj +0.566 0 Td +(o)Tj +0.566 0 Td +(d)Tj +0.566 0 Td +(. )Tj +0.987 0 Td +(T)Tj +0.521 0 Td +(h)Tj +0.566 0 Td +(i)Tj +0.288 0 Td +(s )Tj +1.172 0 Td +(s)Tj +0.399 0 Td +(i)Tj +0.288 0 Td +(m)Tj +0.843 0 Td +(p)Tj +0.566 0 Td +(l)Tj +0.288 0 Td +(e )Tj +1.283 0 Td +(a)Tj +0.51 0 Td +(p)Tj +0.566 0 Td +(p)Tj +0.566 0 Td +(r)Tj +0.343 0 Td +(o)Tj +0.566 0 Td +(a)Tj +0.51 0 Td +(c)Tj +0.492 0 Td +(h )Tj +1.339 0 Td +(i)Tj +0.288 0 Td +(s )Tj +1.172 0 Td +(a)Tj +0.51 0 Td +(c)Tj +0.51 0 Td +(t)Tj +0.288 0 Td +(u)Tj +0.566 0 Td +(a)Tj +0.51 0 Td +(l)Tj +0.288 0 Td +(l)Tj +0.288 0 Td +(y )Tj +1.283 0 Td +(a)Tj +0.51 0 Td +(n )Tj +1.339 0 Td +(i)Tj +0.288 0 Td +(m)Tj +0.843 0 Td +(p)Tj +0.566 0 Td +(l)Tj +0.288 0 Td +(e)Tj +0.51 0 Td +(m)Tj +0.843 0 Td +(e)Tj +0.51 0 Td +(n)Tj +0.566 0 Td +(t)Tj +0.288 0 Td +(a)Tj +0.51 0 Td +(t)Tj +0.288 0 Td +(i)Tj +0.288 0 Td +(o)Tj +0.566 0 Td +(n )Tj +1.339 0 Td +(o)Tj +0.566 0 Td +(f )Tj +1.061 0 Td +(t)Tj +0.288 0 Td +(h)Tj +0.566 0 Td +(e )Tj +1.283 0 Td +(C)Tj +0.677 0 Td +(o)Tj +0.566 0 Td +(n)Tj +0.554 0 Td +(v)Tj +0.498 0 Td +(e)Tj +0.51 0 Td +(n)Tj +0.566 0 Td +(t)Tj +0.288 0 Td +(i)Tj +0.288 0 Td +(o)Tj +0.566 0 Td +(n )Tj +1.339 0 Td +(o)Tj +0.554 0 Td +(v)Tj +0.498 0 Td +(e)Tj +0.51 0 Td +(r)Tj +( )Tj +/C2_0 1 Tf +-41.867 -1.44 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +2.519 0 Td +(principle. )Tj +4.464 0 Td +(Essential )Tj +/C2_0 1 Tf +4.019 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.519 0 Td +(is )Tj +1.018 0 Td +(hard)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(coded )Tj +5.297 0 Td +(but )Tj +1.741 0 Td +(can )Tj +1.907 0 Td +(be )Tj +1.407 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erridden )Tj +3.963 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.851 0 Td +(shipping )Tj +/TT1 1 Tf +-38.531 -1.44 Td +(ConfigurationProvider)Tj +/TT0 1 Tf +( implementations with the x)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +25.261 0 Td +(a)Tj +0.47 0 Td +(y services )Tj +4.408 0 Td +(W)Tj +/C2_0 1 Tf +0.955 0 Td +<001D002E0001005D>Tj +/TT0 1 Tf +(le)Tj +/TT3 1 Tf +(.)Tj +/C2_1 1 Tf +12 0 0 12 57 198.9002 Tm +<0028001B0029002A00350044003B00010019003E003D004C>Tj +/TT4 1 Tf +(gur)Tj +7.417 0 Td +(ation)Tj +/TT0 1 Tf +10 0 0 10 75 176.5002 Tm +(An )Tj +1.56 0 Td +(important )Tj +4.505 0 Td +(principle )Tj +4.172 0 Td +(in )Tj +1.171 0 Td +(REST )Tj +2.504 0 Td +(is )Tj +1.004 0 Td +(the )Tj +1.671 0 Td +(unique )Tj +/C2_0 1 Tf +3.339 0 Td +<0041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(cation )Tj +6.007 0 Td +(and )Tj +1.949 0 Td +(manipulation )Tj +6.062 0 Td +(of )Tj +1.171 0 Td +(resour)Tj +2.655 0 Td +(ces. )Tj +1.967 0 Td +(A )Tj +-41.533 -1.44 Td +(resour)Tj +2.655 0 Td +(ce )Tj +1.29 0 Td +(is )Tj +0.957 0 Td +(\223something )Tj +5.18 0 Td +(uniquely )Tj +/C2_0 1 Tf +4.07 0 Td +<0041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(able\224 )Tj +5.57 0 Td +(and )Tj +1.902 0 Td +(matc)Tj +2.093 0 Td +(hes )Tj +1.735 0 Td +(perfectly )Tj +4.013 0 Td +(with )Tj +2.18 0 Td +(the )Tj +1.624 0 Td +(concept )Tj +3.736 0 Td +(of )Tj +1.124 0 Td +(a )Tj +0.79 0 Td +(domain )Tj +-38.921 -1.44 Td +(object )Tj +3.06 0 Td +(in )Tj +1.226 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a. )Tj +1.133 0 Td +(A )Tj +/C2_0 1 Tf +1.059 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.56 0 Td +(can )Tj +1.948 0 Td +(be )Tj +1.448 0 Td +(considered )Tj +5.116 0 Td +(to )Tj +1.226 0 Td +(be )Tj +1.448 0 Td +(a )Tj +0.892 0 Td +(resour)Tj +2.655 0 Td +(ce, )Tj +1.67 0 Td +(and )Tj +2.004 0 Td +(J)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 381.6276 147.7003 Tm +(AX-RS )Tj +3.114 0 Td +(can )Tj +1.948 0 Td +(be )Tj +1.448 0 Td +(used )Tj +2.393 0 Td +(to )Tj +-41.366 -1.44 Td +(manipulate the entries inside the )Tj +/TT1 1 Tf +(Configuration)Tj +/TT0 1 Tf +( domain object. )Tj +1.8 -2.24 Td +(Our )Tj +/C2_0 1 Tf +2.417 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.863 0 Td +(implementation )Tj +7.475 0 Td +(consists )Tj +4.03 0 Td +(of )Tj +/C2_0 1 Tf +1.529 0 Td +<005E>Tj +/TT0 1 Tf +(at )Tj +2.029 0 Td +(key-v)Tj +2.309 0 Td +(alue )Tj +2.529 0 Td +(pairs, )Tj +3.029 0 Td +(so )Tj +1.64 0 Td +(the )Tj +2.029 0 Td +(concept )Tj +4.141 0 Td +(of )Tj +-41.366 -1.44 Td +(h)Tj +0.519 0 Td +(yperlinking is not ev)Tj +8.714 0 Td +(en necessary)Tj +5.409 0 Td +(. )Tj +0.482 0 Td +(T)Tj +/C2_0 1 Tf +0.511 0 Td +<0040003D0001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +4.879 0 Td +(ation itself could be mapped to the )Tj +/TT1 1 Tf +-20.514 -1.44 Td +(/configuration/)Tj +/TT0 1 Tf +( )Tj +9.539 0 Td +(URI. )Tj +2.445 0 Td +(A )Tj +1.204 0 Td +(GET )Tj +2.371 0 Td +(request )Tj +3.649 0 Td +(to )Tj +1.371 0 Td +(the )Tj +/TT1 1 Tf +1.871 0 Td +(/configuration/)Tj +/TT0 1 Tf +( )Tj +9.539 0 Td +(URI )Tj +2.204 0 Td +(returns )Tj +3.482 0 Td +(the )Tj +1.871 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +ET + +endstream +endobj +245 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 248 0 R>>endobj +246 0 obj<>endobj +247 0 obj<>endobj +248 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(104)Tj +/C2_0 1 Tf +0 Tc 0 Tw -20.132 57.06 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation content. )Tj +-1.745 -2.24 Td +(In our case, the hard-coded par)Tj +13.493 0 Td +(ameters w)Tj +4.377 0 Td +(ould look like JSON format: )Tj +/TT1 1 Tf +-19.67 -2.12 Td +({hitsFlushRate=1, referersFlushRate=1, version=0.5})Tj +/TT0 1 Tf +1.8 -2.24 Td +(A )Tj +0.993 0 Td +(GET )Tj +2.16 0 Td +(request )Tj +3.438 0 Td +(to )Tj +/TT1 1 Tf +1.16 0 Td +(/configuration/version)Tj +/TT0 1 Tf +( )Tj +13.528 0 Td +(returns )Tj +3.271 0 Td +(the )Tj +1.66 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.16 0 Td +(of )Tj +/TT1 1 Tf +1.16 0 Td +(0.5)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +2.126 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(rmed )Tj +4.716 0 Td +(with )Tj +2.216 0 Td +(the )Tj +-40.866 -1.44 Td +(HTTP )Tj +2.823 0 Td +(code )Tj +2.489 0 Td +(200 )Tj +2.045 0 Td +(\(OK\). )Tj +2.581 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.433 0 Td +(v)Tj +0.488 0 Td +(ersion )Tj +2.989 0 Td +(entry )Tj +2.544 0 Td +(could )Tj +2.823 0 Td +(be )Tj +1.433 0 Td +(deleted )Tj +3.545 0 Td +(with )Tj +2.267 0 Td +(the )Tj +1.711 0 Td +(HTTP )Tj +2.823 0 Td +(DELETE )Tj +3.711 0 Td +(request )Tj +3.489 0 Td +(and )Tj +1.989 0 Td +(a )Tj +-41.7 -1.44 Td +(command suc)Tj +6.039 0 Td +(h as this:)Tj +/TT1 1 Tf +-6.039 -2.12 Td +(curl -i -X DELETE [http://localhost:8080/x-ray/]resources/)Tj +0 -1.32 TD +(configuration/version)Tj +/C2_0 1 Tf +1.8 -2.24 Td +<001D0001004B004D003B003B003D004B004B003E004D004400010020002100280021003000210001003B00390044004400010041004B0001003B00470046005D>Tj +/TT0 1 Tf +(rmed with HTTP code 204 \(No Content\))Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +0 -2.24 TD +(T)Tj +0.456 0 Td +(o )Tj +0.923 0 Td +(manage )Tj +3.756 0 Td +(a )Tj +/C2_0 1 Tf +0.867 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation, )Tj +2.813 0 Td +(there )Tj +2.534 0 Td +(is )Tj +1.034 0 Td +(no )Tj +1.479 0 Td +(need )Tj +2.479 0 Td +(to )Tj +1.201 0 Td +(distinguish )Tj +4.981 0 Td +(between )Tj +4.035 0 Td +(creating )Tj +3.812 0 Td +(a )Tj +0.867 0 Td +(new )Tj +2.201 0 Td +(entry )Tj +2.534 0 Td +(or )Tj +-41.311 -1.44 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erwriting )Tj +4.343 0 Td +(an )Tj +1.565 0 Td +(existing )Tj +3.788 0 Td +(one. )Tj +2.399 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.398 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.065 0 Td +(\223sa)Tj +1.303 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.009 0 Td +(or )Tj +1.398 0 Td +(update\224 )Tj +3.899 0 Td +(semantics)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.982 0 Td +(the )Tj +1.843 0 Td +(HTTP )Tj +2.955 0 Td +(PUT )Tj +2.399 0 Td +(method )Tj +3.788 0 Td +(is )Tj +/C2_0 1 Tf +-41.533 -1.44 Td +<0048003D004A003E003D003B004C004400510001004B004D0041004C003D003C000B00010025004C00010041004B0001003C003D005D>Tj +/TT0 1 Tf +(ned as follo)Tj +15.496 0 Td +(wing: )Tj +-13.696 -2.24 Td +(\223T)Tj +/TT3 1 Tf +(he )Tj +2.819 0 Td +(PUT )Tj +2.653 0 Td +(method )Tj +4.078 0 Td +(requests )Tj +4.3 0 Td +(that )Tj +2.411 0 Td +(the )Tj +2.115 0 Td +(enclosed )Tj +4.579 0 Td +(entity )Tj +3.152 0 Td +(be )Tj +1.837 0 Td +(stored )Tj +3.411 0 Td +(under )Tj +3.282 0 Td +(the )Tj +2.115 0 Td +(supplied )Tj +-38.551 -1.44 Td +(Request)Tj +/TT1 1 Tf +(-)Tj +/TT3 1 Tf +(URI. )Tj +6.547 0 Td +(If )Tj +1.132 0 Td +(the )Tj +1.928 0 Td +(Request-URI )Tj +5.965 0 Td +(refers )Tj +2.909 0 Td +(to )Tj +1.428 0 Td +(an )Tj +1.632 0 Td +(alread)Tj +2.624 0 Td +(y )Tj +1.076 0 Td +(existing )Tj +3.743 0 Td +(resour)Tj +2.655 0 Td +(ce, )Tj +1.854 0 Td +(the )Tj +1.928 0 Td +(enclosed )Tj +4.392 0 Td +(entity )Tj +-39.811 -1.44 Td +(SHOULD )Tj +4.588 0 Td +(be )Tj +1.533 0 Td +(considered )Tj +5.182 0 Td +(as )Tj +1.348 0 Td +(a )Tj +/C2_1 1 Tf +0.959 0 Td +<002F00310026002B003F>Tj +/TT3 1 Tf +(ed )Tj +4.255 0 Td +(v)Tj +0.488 0 Td +(ersion )Tj +3.034 0 Td +(of )Tj +1.293 0 Td +(the )Tj +1.811 0 Td +(one )Tj +2.071 0 Td +(residing )Tj +3.793 0 Td +(on )Tj +1.571 0 Td +(the )Tj +1.811 0 Td +(origin )Tj +2.886 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.737 0 Td +(If )Tj +1.015 0 Td +(the )Tj +-40.848 -1.44 Td +(Request-URI )Tj +5.705 0 Td +(does )Tj +2.335 0 Td +(not )Tj +1.724 0 Td +(point )Tj +2.539 0 Td +(to )Tj +1.168 0 Td +(an )Tj +1.372 0 Td +(existing )Tj +3.483 0 Td +(resour)Tj +2.655 0 Td +(ce, )Tj +1.594 0 Td +(and )Tj +1.946 0 Td +(that )Tj +1.964 0 Td +(URI )Tj +1.983 0 Td +(is )Tj +0.946 0 Td +(capable )Tj +3.705 0 Td +(of )Tj +1.15 0 Td +(being )Tj +/C2_1 1 Tf +2.687 0 Td +<00260027003F>Tj +/TT3 1 Tf +(ned )Tj +3.538 0 Td +(as )Tj +1.205 0 Td +(a )Tj +-41.7 -1.44 Td +(new )Tj +2.114 0 Td +(resour)Tj +2.655 0 Td +(ce )Tj +1.28 0 Td +(b)Tj +0.556 0 Td +(y )Tj +0.779 0 Td +(the )Tj +1.631 0 Td +(requesting )Tj +4.724 0 Td +(user )Tj +2.058 0 Td +(agent, )Tj +2.91 0 Td +(the )Tj +1.631 0 Td +(origin )Tj +2.707 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.112 0 Td +(can )Tj +1.835 0 Td +(create )Tj +2.909 0 Td +(the )Tj +1.631 0 Td +(resour)Tj +2.655 0 Td +(ce )Tj +1.28 0 Td +(with )Tj +2.151 0 Td +(that )Tj +1.927 0 Td +(URI. )Tj +-40.255 -1.44 Td +(If )Tj +0.898 0 Td +(a )Tj +0.842 0 Td +(new )Tj +2.176 0 Td +(resour)Tj +2.655 0 Td +(ce )Tj +1.342 0 Td +(is )Tj +0.972 0 Td +(created, )Tj +3.823 0 Td +(the )Tj +1.694 0 Td +(origin )Tj +2.769 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.175 0 Td +(MUST )Tj +3.065 0 Td +(inform )Tj +3.139 0 Td +(the )Tj +1.694 0 Td +(user )Tj +2.12 0 Td +(agent )Tj +2.694 0 Td +(via )Tj +1.583 0 Td +(the )Tj +1.694 0 Td +(201 )Tj +2.01 0 Td +(\(Created\) )Tj +-38.052 -1.44 Td +(response..)Tj +/TT4 1 Tf +(.)Tj +/TT0 1 Tf +(\224 \()Tj +(http://www)Tj +10.365 0 Td +(.w3.org/Protocols/rfc2616/rfc2616-sec9.html)Tj +(\). )Tj +-8.565 -2.24 Td +(An entry could be created or updated with the follo)Tj +22.11 0 Td +(wing command: )Tj +/TT1 1 Tf +-23.91 -2.12 Td +(curl -i -H "Content-Type: text/plain" -X PUT -d "duke" http://)Tj +0 -1.32 TD +(localhost:5380/x-ray/resources/configuration/java)Tj +/TT0 1 Tf +1.8 -2.24 Td +(A )Tj +1.002 0 Td +(PUT )Tj +2.225 0 Td +(request )Tj +3.447 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.281 0 Td +(either )Tj +2.78 0 Td +(create )Tj +2.946 0 Td +(a )Tj +0.835 0 Td +(new )Tj +2.169 0 Td +(entry )Tj +2.502 0 Td +(or )Tj +1.224 0 Td +(update )Tj +3.281 0 Td +(an )Tj +1.391 0 Td +(existing )Tj +3.614 0 Td +(entry)Tj +2.075 0 Td +(. )Tj +0.576 0 Td +(According )Tj +4.781 0 Td +(to )Tj +1.169 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(HTTP RFC, a successful creation has to return the follo)Tj +23.443 0 Td +(wing response:)Tj +/TT1 1 Tf +-23.443 -1.79 Td +(HTTP/1.1 201 Created)Tj +0 -1.79 TD +(Location: http://localhost:5380/x-ray/resources/configuration/java)Tj +0 -1.79 TD +(Content-Type: text/plain)Tj +/TT0 1 Tf +1.8 -2.24 Td +(On the other hand)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( an update will return only an HTTP 204 \(No Content\):)Tj +/TT1 1 Tf +-1.8 -1.79 Td +(HTTP/1.1 204 No Content)Tj +/TT0 1 Tf +1.8 -2.24 Td +(An HTTP 200 \(OK\) could be also returned with a meaningful pa)Tj +27.483 0 Td +(yload in the response bod)Tj +11.093 0 Td +(y)Tj +0.408 0 Td +(.)Tj +-38.984 -2.24 Td +(F)Tj +0.455 0 Td +(ortunately)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.106 0 Td +(the )Tj +1.855 0 Td +(class )Tj +/TT1 1 Tf +2.577 0 Td +(Configuration)Tj +/TT0 1 Tf +( )Tj +8.322 0 Td +(is )Tj +1.188 0 Td +(a )Tj +1.021 0 Td +(singleton )Tj +4.412 0 Td +(EJB )Tj +1.91 0 Td +(3.1 )Tj +1.911 0 Td +(bean )Tj +2.633 0 Td +(and )Tj +2.133 0 Td +(can )Tj +2.077 0 Td +(be )Tj +1.577 0 Td +(directly )Tj +ET + +endstream +endobj +249 0 obj<>stream +H\V T}?C@Cdpep=( n kE r$ت[L$.1͢ [kj1Fm=z=9I=o}wgd@!>3UP0923gtVd?]+gƤi@ 575 %+OOXn~QuGNt!e}W֖|Wq>͕h#h +#(ҁ{ ^zf|oB" @WT}!2۩B73\7S8yctc#JOqSP@ܣH!Vo ш raj)lFo|:}Q{?h5një(l,&ER_{QH) 9ni"UtZ%Ii(Vo]@ P{?}YJTc7l ɟ#"D$Ũ&1 +1Me_xnR4/JżKm yz>(o9.~nvL=t(2{6\A>Zcixe煑 jI;WGMC/20D*,-o|EvLΰ?WLUuި7aC$$e5؅_A2ʩj[`֙:?A;.KLK4Lq\<ԏޢJ''P_(:l3˖V³F۽7qap ćV>@6(*4џ'sOErNjbT'fYko0| 4#[N))W!aMaCi,yVJ)2VFETJP%;ܑ UzOU)1gaKXKuuu׍/yyZy:yF{N3zޠ*]TJ^e$ux)(N.r+Ab؆8(;op ߉\ 쭦Ab +&xHT@%Mմܴj(TGE~G@ƱI +L~WZwJ|Uv JVSYjZvoiUǂ!9 +5F1΂$3XdϒglܰZT֭V-RR¸ԅ_/mt*Q#Z8k\)NS[%x`8I{ ǘV+g,:Ļz +j&WK-̡T+5ÅѠW95Ta9%l~KEvqXJCTSz8=P[+# }oD0.KߏD—Q>eTcXh=">S>CuR39Qs܏ǩhz`P +yH[T)+iDnUGܨq.CQ4TuD& wLpԑExu7lZS~uHQ;`()Eշny{N$+ ƻN!*pkOV|3M?8M '.B$6{lz|IuI$csT!6)w`pt5Cϖșr(F}FpߘY/"{6'[ T.U4t2&~pܠb^={t5&:*KNa۵m:[o94avwDۈp$'xl~ְ_۸Mf_[ƋeY?ْ10&t]4ndKv&=I_ޤ7=4T^;snʰ;f.rf$| Y1ѨO4QPM8jR_i.N8֎DntMrLs& MvSBcQM&Hh:mIp[OFr{utŻ01#$$4r{h?46뎿7xbc|}f^|̂Ya0l@jrH!Ji 4m6xcsXT_ Ҧ*Tlovqp?T;_;J7*=jhY(ǽ_A:1> HχԠ[vҦc=,l<uuR![=i%jV++%ÙJS[<ͱy((388Ϝs]CF&iihX;a_/0d[$o_ +u`ٕlȷ]Y9y;kkc! +O^REW >! d<k#,1b55eCʹ{{{[ْ6WWڱ;iyE=wmR??]=3yZX-9Z؉[.}*N%lEʝv-FG'7{{yK|v26S^6C^%"a&tlN;թȝV5flWbh[:jX/&[6Уc&=iKz +LP(ϋhU4 +voy*Jz Z7 )4HT '+aAFhe0wU{^֖g6Lm~-U(68Y,金рs\E%7,ųN ),6.Cn)|(wmEl7G2, +}Mhv;t7;څC- e'Q'n.HG2'jhTG%g]i,p,EJYCRKf7ź`߬oPsIbnk7C +,Һ0x)u?CU ErB Q< UJ:o0ffb wY  'tݳ;/? J?pG"nt(?tt~Ha8pb힕dŝƒK=W_.&eGpu7;x85`\~ACn+,#}* +3 ut!16C.d2M2 T̺d?1<KfnJIJk!Y$֚OeS%wj*WWrd5ar8+ 4È9g:btmy6 f!Ut!_TC J*lK< '6Lkp.8Z1$T_lpT*Uw9_l@I'v!)c,V ߭b%,SaF'_?-/ɯ9VMͼKU9  L +endstream +endobj +250 0 obj<>endobj +251 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 252 0 R>>endobj +252 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(105)Tj +0 Tc 0 Tw -20.132 57.06 Td +(exposed )Tj +4.155 0 Td +(via )Tj +1.876 0 Td +(J)Tj +0.26 0 Td +(AX-RS. )Tj +3.524 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.654 0 Td +(REST )Tj +2.765 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +/C2_0 1 Tf +2.265 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.433 0 Td +(abo)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.098 0 Td +(can )Tj +2.154 0 Td +(be )Tj +1.654 0 Td +(directly )Tj +3.821 0 Td +(realized )Tj +4.043 0 Td +(with )Tj +2.488 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(Configuration)Tj +/C2_0 1 Tf +<0001003B00440039004B004B000B00010025004C000100400039004B0001004C00470001003A003D00010045003900480048003D003C0001004C00470001003900010031002E00250001005D>Tj +/TT0 1 Tf +(rst, as sho)Tj +28.076 0 Td +(wn in Listing 55:)Tj +/TT1 1 Tf +-28.076 -1.79 Td +(@Startup)Tj +0 -1.79 TD +(@Singleton)Tj +/TT2 1 Tf +0 -1.79 TD +(@Path\("configuration"\))Tj +0 -1.79 TD +(@Produces\(TEXT_PLAIN\))Tj +/TT1 1 Tf +T* +(public class Configuration {})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 55: Mapping a Resour)Tj +12.549 0 Td +(ce to a URI)Tj +-10.749 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.487 0 Td +(@Produces)Tj +/TT0 1 Tf +( )Tj +5.832 0 Td +(annotation )Tj +5.045 0 Td +(sets )Tj +1.987 0 Td +(the )Tj +1.765 0 Td +(default )Tj +3.377 0 Td +(mime )Tj +2.875 0 Td +(type )Tj +2.265 0 Td +(for )Tj +1.598 0 Td +(all )Tj +1.487 0 Td +(methods )Tj +4.099 0 Td +(inside )Tj +2.988 0 Td +(the )Tj +1.765 0 Td +(class )Tj +2.487 0 Td +(to )Tj +/TT1 1 Tf +-41.366 -1.44 Td +(String)Tj +/TT0 1 Tf +(. )Tj +4.375 0 Td +(Whatev)Tj +3.322 0 Td +(er )Tj +1.366 0 Td +(the )Tj +1.867 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.255 0 Td +(methods )Tj +4.201 0 Td +(return )Tj +3.089 0 Td +(will )Tj +2.145 0 Td +(be )Tj +1.589 0 Td +(interpreted )Tj +5.201 0 Td +(as )Tj +1.422 0 Td +(a )Tj +1.033 0 Td +(string. )Tj +3.108 0 Td +(A )Tj +1.2 0 Td +(GET )Tj +/TT1 1 Tf +2.367 0 Td +([\205]/)Tj +-39.8 -1.44 Td +(configuration)Tj +/TT0 1 Tf +( request w)Tj +12.235 0 Td +(ould cause the in)Tj +7.381 0 Td +(v)Tj +0.482 0 Td +(ocation of the follo)Tj +8.16 0 Td +(wing method:)Tj +/TT1 1 Tf +-28.258 -1.79 Td +( @GET)Tj +0 -1.79 TD +( public String getConfiguration\(\) {)Tj +T* +( return this.configuration.toString\(\);)Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(It )Tj +0.865 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.255 0 Td +(also )Tj +2.032 0 Td +(return )Tj +2.865 0 Td +(to )Tj +1.143 0 Td +(the )Tj +1.643 0 Td +(user )Tj +2.087 0 Td +(the )Tj +1.643 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +/C2_0 1 Tf +2.199 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.477 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(erted )Tj +2.476 0 Td +(to )Tj +1.143 0 Td +(a )Tj +0.809 0 Td +(string. )Tj +2.921 0 Td +(In )Tj +1.143 0 Td +(our )Tj +1.754 0 Td +(case)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.448 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(java.util.Map#toString)Tj +/TT0 1 Tf +( )Tj +13.609 0 Td +(method )Tj +3.686 0 Td +(is )Tj +1.074 0 Td +(used )Tj +2.408 0 Td +(to )Tj +1.241 0 Td +(serialize )Tj +3.963 0 Td +(the )Tj +1.741 0 Td +(content )Tj +3.631 0 Td +(of )Tj +1.241 0 Td +(the )Tj +/C2_0 1 Tf +1.741 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.575 0 Td +(to )Tj +1.241 0 Td +(a )Tj +-41.7 -1.44 Td +(string)Tj +/TT3 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +(An entry for a gi)Tj +6.929 0 Td +(v)Tj +0.488 0 Td +(en key is fetc)Tj +5.595 0 Td +(hed using the )Tj +/TT1 1 Tf +(@PathParam\(\223key\224\))Tj +/TT0 1 Tf +( with a )Tj +/TT1 1 Tf +(@Path)Tj +-14.812 -1.44 Td +(\("{key}"\))Tj +/TT0 1 Tf +( template in the method )Tj +/TT1 1 Tf +(getEntry)Tj +/TT0 1 Tf +(:)Tj +/TT1 1 Tf +T* +( @GET)Tj +T* +( @Path\("{key}"\))Tj +T* +( public String getEntry\(@PathParam\("key"\) String key\) {)Tj +T* +( return configuration.get\(key\);)Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(Creating )Tj +4.147 0 Td +(or )Tj +1.424 0 Td +(modifying )Tj +4.87 0 Td +(an )Tj +1.591 0 Td +(entry )Tj +2.702 0 Td +(requires )Tj +3.98 0 Td +(returning )Tj +4.425 0 Td +(different )Tj +4.092 0 Td +(responses )Tj +4.703 0 Td +(for )Tj +1.702 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +1.091 0 Td +(case. )Tj +2.628 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(method )Tj +/TT1 1 Tf +3.732 0 Td +(addEntry)Tj +/TT0 1 Tf +( )Tj +5.254 0 Td +(returns )Tj +3.398 0 Td +(either )Tj +2.898 0 Td +(an )Tj +1.509 0 Td +(HTTP )Tj +2.899 0 Td +(204 )Tj +2.121 0 Td +(\(No )Tj +2.065 0 Td +(Content)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.094 0 Td +(for )Tj +1.62 0 Td +(an )Tj +1.509 0 Td +(update\) )Tj +3.677 0 Td +(or )Tj +1.342 0 Td +(an )Tj +1.509 0 Td +(HTTP )Tj +2.899 0 Td +(201 )Tj +-40.532 -1.44 Td +(\(Created, )Tj +4.336 0 Td +(for )Tj +1.613 0 Td +(adding )Tj +3.392 0 Td +(a )Tj +0.946 0 Td +(new )Tj +2.28 0 Td +(entry\) )Tj +2.891 0 Td +(with )Tj +2.336 0 Td +(an )Tj +1.502 0 Td +(appropriately )Tj +6.17 0 Td +(set )Tj +1.613 0 Td +(location )Tj +3.948 0 Td +(header )Tj +3.391 0 Td +(to )Tj +1.28 0 Td +(the )Tj +1.78 0 Td +(URI )Tj +2.113 0 Td +(of )Tj +1.28 0 Td +(the )Tj +-40.866 -1.44 Td +(created element, as sho)Tj +10.102 0 Td +(wn in Listing 56:)Tj +/TT1 1 Tf +-10.102 -1.79 Td +( @PUT)Tj +T* +( @Path\("{key}"\))Tj +0 -1.79 TD +( @Consumes\(TEXT_PLAIN\))Tj +ET + +endstream +endobj +253 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 255 0 R>>endobj +254 0 obj<>endobj +255 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(106)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( public Response addEntry\(@PathParam\("key"\) String key, String )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 624.2002 Tm +(value, @Context UriInfo uriInfo\) {)Tj +0 -1.79 TD +( Response response = null;)Tj +T* +( if\(this.configuration.containsKey\(key\)\){)Tj +T* +( response = Response.noContent\(\).build\(\);)Tj +T* +( }else{)Tj +T* +( URI uri = uriInfo.getAbsolutePathBuilder\(\).build\(key\);)Tj +T* +( response= Response.created\(uri\).build\(\);)Tj +T* +( })Tj +T* +( this.configuration.put\(key, value\);)Tj +T* +( return response;)Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 56: Different Response Codes for Create or Update)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.357 0 Td +(method )Tj +/TT1 1 Tf +3.58 0 Td +(deleteEntry)Tj +/TT0 1 Tf +( )Tj +6.903 0 Td +(uses, )Tj +2.413 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.634 0 Td +(similarly )Tj +3.968 0 Td +(to )Tj +/TT1 1 Tf +1.135 0 Td +(getEntry)Tj +/TT0 1 Tf +(, )Tj +5.38 0 Td +(the )Tj +/TT1 1 Tf +1.635 0 Td +(PathParam)Tj +/TT0 1 Tf +( )Tj +5.702 0 Td +(to )Tj +1.135 0 Td +(remo)Tj +2.21 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.801 0 Td +(an )Tj +-41.144 -1.44 Td +(entry from the )Tj +/TT1 1 Tf +(Map)Tj +/TT0 1 Tf +( with the gi)Tj +12.953 0 Td +(v)Tj +0.488 0 Td +(en key:)Tj +/TT1 1 Tf +-13.441 -1.79 Td +( @DELETE)Tj +0 -1.79 TD +( @Path\("{key}"\))Tj +T* +( public Response deleteEntry\(@PathParam\("key"\) String key\) {)Tj +T* +( this.configuration.remove\(key\);)Tj +T* +( return Response.noContent\(\).build\(\);)Tj +T* +( })Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.692 0 Td +(producer )Tj +4.526 0 Td +(methods )Tj +4.304 0 Td +(\(annotated )Tj +5.194 0 Td +(with )Tj +/TT1 1 Tf +2.526 0 Td +(@Produces)Tj +/TT0 1 Tf +(\) )Tj +6.315 0 Td +(are )Tj +1.969 0 Td +(not )Tj +2.026 0 Td +(denoted )Tj +4.138 0 Td +(with )Tj +2.526 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.136 0 Td +(scope)Tj +( )Tj +-39.699 -1.44 Td +(declar)Tj +2.655 0 Td +(ation )Tj +2.596 0 Td +(and)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.29 0 Td +(therefore)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.512 0 Td +(they )Tj +2.262 0 Td +(are )Tj +1.761 0 Td +(executed )Tj +4.318 0 Td +(in )Tj +1.262 0 Td +(scope )Tj +2.929 0 Td +(dependent )Tj +4.986 0 Td +(on )Tj +1.54 0 Td +(their )Tj +2.373 0 Td +(injection )Tj +4.208 0 Td +(points. )Tj +3.282 0 Td +(An )Tj +/C2_0 1 Tf +-40.977 -1.44 Td +<004D0046003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +6.076 0 Td +(producer )Tj +4.241 0 Td +(is )Tj +1.018 0 Td +(defaulted )Tj +4.353 0 Td +(to )Tj +/TT1 1 Tf +1.185 0 Td +(@Dependent)Tj +/TT0 1 Tf +( )Tj +6.352 0 Td +(scope. )Tj +/TT1 1 Tf +3.13 0 Td +(RequestScoped)Tj +/TT0 1 Tf +( )Tj +8.152 0 Td +(beans )Tj +2.852 0 Td +(could )Tj +2.797 0 Td +(ev)Tj +0.988 0 Td +(en)Tj +( )Tj +-41.144 -1.44 Td +(be )Tj +/C2_0 1 Tf +1.461 0 Td +<004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +5.851 0 Td +(on )Tj +1.517 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.738 0 Td +(request, )Tj +3.795 0 Td +(and )Tj +/TT1 1 Tf +2.017 0 Td +(SessionScoped)Tj +/TT0 1 Tf +( )Tj +8.207 0 Td +(beans )Tj +2.906 0 Td +(could )Tj +2.851 0 Td +(be )Tj +/C2_0 1 Tf +1.461 0 Td +<004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +5.851 0 Td +(on )Tj +1.517 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +-41.644 -1.44 Td +(new )Tj +2.335 0 Td +(session. )Tj +3.799 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.613 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.223 0 Td +(and )Tj +2.113 0 Td +(CDI)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.474 0 Td +(it )Tj +1.057 0 Td +(is )Tj +1.168 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.557 0 Td +(possible )Tj +4.003 0 Td +(to )Tj +/C2_0 1 Tf +1.335 0 Td +<004A003D003B00470046005D>Tj +/TT0 1 Tf +(gure )Tj +5.391 0 Td +(parts )Tj +2.557 0 Td +(of )Tj +1.335 0 Td +(the )Tj +1.835 0 Td +(system )Tj +3.39 0 Td +(at )Tj +-41.422 -1.44 Td +(runtime)Tj +/TT2 1 Tf +(.)Tj +/TT3 1 Tf +12 0 0 12 57 152.6003 Tm +(Logger Injection)Tj +/TT0 1 Tf +10 0 0 10 75 130.2003 Tm +(A )Tj +1.385 0 Td +(centr)Tj +2.155 0 Td +(alized )Tj +/C2_0 1 Tf +3.33 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.886 0 Td +(should )Tj +3.609 0 Td +(also )Tj +2.441 0 Td +(contain )Tj +3.942 0 Td +(log )Tj +2.052 0 Td +(settings. )Tj +4.164 0 Td +(In )Tj +1.552 0 Td +(gener)Tj +2.377 0 Td +(al)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.746 0 Td +(the )Tj +2.052 0 Td +(logging )Tj +/C2_0 1 Tf +-39.032 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.77 0 Td +(is )Tj +1.269 0 Td +(externalized )Tj +5.881 0 Td +(into )Tj +2.27 0 Td +(a )Tj +1.102 0 Td +(standalone )Tj +/C2_0 1 Tf +5.271 0 Td +<005D>Tj +/TT0 1 Tf +(le. )Tj +2.214 0 Td +(In )Tj +1.436 0 Td +(the )Tj +1.936 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.102 0 Td +(case)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.741 0 Td +(the )Tj +1.936 0 Td +(most )Tj +2.658 0 Td +(interesting )Tj +-37.754 -1.44 Td +(information )Tj +5.389 0 Td +(is )Tj +1.054 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.887 0 Td +(published )Tj +4.612 0 Td +(to )Tj +1.221 0 Td +(JMX. )Tj +2.369 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.443 0 Td +(log )Tj +/C2_0 1 Tf +1.721 0 Td +<005D>Tj +/TT0 1 Tf +(les )Tj +2.11 0 Td +(are )Tj +1.72 0 Td +(used )Tj +2.388 0 Td +(only )Tj +2.277 0 Td +(to )Tj +1.221 0 Td +(tr)Tj +0.599 0 Td +(ac)Tj +0.982 0 Td +(k )Tj +0.887 0 Td +(possible )Tj +3.889 0 Td +(problems, )Tj +-37.921 -1.44 Td +(but )Tj +1.73 0 Td +(they )Tj +2.174 0 Td +(are )Tj +1.673 0 Td +(disabled )Tj +3.953 0 Td +(in )Tj +1.174 0 Td +(production )Tj +5.065 0 Td +(mode. )Tj +3.026 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.452 0 Td +(the )Tj +1.674 0 Td +(inclusion )Tj +4.287 0 Td +(of )Tj +1.174 0 Td +(logging )Tj +3.508 0 Td +(settings )Tj +3.508 0 Td +(into )Tj +2.008 0 Td +(the )Tj +1.674 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +ET + +endstream +endobj +256 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 257 0 R>>endobj +257 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(107)Tj +0 Tc 0 Tw -20.132 57.06 Td +(described )Tj +/TT1 1 Tf +(Configuration)Tj +/TT0 1 Tf +(, maintainability could ev)Tj +23.24 0 Td +(en be further increased.)Tj +-21.44 -2.24 Td +(T)Tj +0.456 0 Td +(o )Tj +0.902 0 Td +(meet )Tj +2.457 0 Td +(the )Tj +1.68 0 Td +(requirement)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.819 0 Td +(all )Tj +/TT1 1 Tf +1.402 0 Td +(Logger)Tj +/TT0 1 Tf +( )Tj +3.947 0 Td +(instances )Tj +4.292 0 Td +(are )Tj +1.679 0 Td +(going )Tj +2.736 0 Td +(to )Tj +1.18 0 Td +(be )Tj +1.402 0 Td +(injected. )Tj +4.033 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.458 0 Td +(injection)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.376 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +-41.088 -1.44 Td +(c)Tj +0.524 0 Td +(a)Tj +0.524 0 Td +(n )Tj +1.346 0 Td +(s)Tj +0.401 0 Td +(w)Tj +0.784 0 Td +(a)Tj +0.524 0 Td +(p )Tj +1.346 0 Td +(a )Tj +1.29 0 Td +(l)Tj +0.302 0 Td +(o)Tj +0.58 0 Td +(g)Tj +0.524 0 Td +(g)Tj +0.524 0 Td +(e)Tj +0.524 0 Td +(r )Tj +1.123 0 Td +(i)Tj +0.302 0 Td +(m)Tj +0.857 0 Td +(p)Tj +0.58 0 Td +(l)Tj +0.302 0 Td +(e)Tj +0.524 0 Td +(m)Tj +0.857 0 Td +(e)Tj +0.524 0 Td +(n)Tj +0.58 0 Td +(t)Tj +0.302 0 Td +(a)Tj +0.524 0 Td +(t)Tj +0.302 0 Td +(i)Tj +0.302 0 Td +(o)Tj +0.58 0 Td +(n )Tj +1.346 0 Td +(w)Tj +0.802 0 Td +(i)Tj +0.302 0 Td +(t)Tj +0.302 0 Td +(h)Tj +0.58 0 Td +(o)Tj +0.58 0 Td +(u)Tj +0.58 0 Td +(t )Tj +1.068 0 Td +(c)Tj +0.506 0 Td +(h)Tj +0.58 0 Td +(a)Tj +0.524 0 Td +(n)Tj +0.58 0 Td +(g)Tj +0.524 0 Td +(i)Tj +0.302 0 Td +(n)Tj +0.58 0 Td +(g )Tj +1.29 0 Td +(t)Tj +0.302 0 Td +(h)Tj +0.58 0 Td +(e )Tj +1.29 0 Td +(c)Tj +0.524 0 Td +(l)Tj +0.302 0 Td +(i)Tj +0.302 0 Td +(e)Tj +0.524 0 Td +(n)Tj +0.58 0 Td +(t )Tj +1.068 0 Td +(c)Tj +0.524 0 Td +(o)Tj +0.58 0 Td +(d)Tj +0.58 0 Td +(e)Tj +0.524 0 Td +(. )Tj +1.068 0 Td +(D)Tj +0.802 0 Td +(i)Tj +0.302 0 Td +(f)Tj +0.302 0 Td +(f)Tj +0.302 0 Td +(e)Tj +0.524 0 Td +(r)Tj +0.357 0 Td +(e)Tj +0.524 0 Td +(n)Tj +0.58 0 Td +(t )Tj +1.068 0 Td +(l)Tj +0.302 0 Td +(o)Tj +0.58 0 Td +(g )Tj +-41.7 -1.44 Td +(implementations )Tj +7.595 0 Td +(are )Tj +1.759 0 Td +(created )Tj +3.593 0 Td +(dependent )Tj +4.984 0 Td +(on )Tj +1.538 0 Td +(the )Tj +/C2_0 1 Tf +1.76 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation. )Tj +2.872 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.315 0 Td +(debug )Tj +3.094 0 Td +(mode)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.121 0 Td +(a )Tj +0.926 0 Td +(real )Tj +/TT1 1 Tf +2.037 0 Td +(Logger)Tj +/TT0 1 Tf +( )Tj +-38.599 -1.44 Td +(instance is injected; otherwise)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( a )Tj +/TT1 1 Tf +(DevNullLogger)Tj +/TT0 1 Tf +( implementation is used \(see Listing 57\))Tj +/TT2 1 Tf +(.)Tj +/TT1 1 Tf +0 -1.79 TD +(public class LoggerProducer {)Tj +/TT3 1 Tf +T* +( @Inject)Tj +T* +( private boolean debug;)Tj +/TT1 1 Tf +0 -3.58 TD +( @Produces)Tj +0 -1.79 TD +( public XRayLogger getLogger\(InjectionPoint ip\){)Tj +T* +( if\(debug\){)Tj +T* +( Class aClass = ip.getMember\(\).getDeclaringClass\(\);)Tj +T* +( Logger logger = Logger.getLogger\(aClass.getName\(\)\);)Tj +T* +( return new DelegatingLogger\(logger\);)Tj +T* +( }else{)Tj +T* +( return new DevNullLogger\(\);)Tj +T* +( })Tj +T* +( })Tj +T* +(})Tj +/C2_0 1 Tf +0 -1.88 TD +<00280041004B004C00410046003F00010012001400170001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +8.437 0 Td +(ation-Dependent LoggerProducer)Tj +-6.637 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.83 0 Td +(class )Tj +/TT1 1 Tf +2.83 0 Td +(LoggerProducer )Tj +/TT0 1 Tf +9.498 0 Td +(in )Tj +1.608 0 Td +(Listing )Tj +3.553 0 Td +(57 )Tj +1.886 0 Td +(creates )Tj +/TT1 1 Tf +3.774 0 Td +(java.util.Logging)Tj +/TT0 1 Tf +( )Tj +10.976 0 Td +(wr)Tj +1.099 0 Td +(appers )Tj +-39.366 -1.44 Td +(abstr)Tj +2.044 0 Td +(acted with a common )Tj +/TT1 1 Tf +(XRayLogger)Tj +/TT0 1 Tf +( interface \(see Listing 58\).)Tj +/TT1 1 Tf +-2.044 -1.79 Td +(public interface XRayLogger {)Tj +0 -1.79 TD +( public void log\(Level level, String message, Object[] par\);)Tj +T* +( public Logger getLogger\(\);)Tj +0 -3.58 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 58: Logger )Tj +7.855 0 Td +(Abstr)Tj +2.211 0 Td +(action)Tj +-8.266 -2.24 Td +(T)Tj +0.513 0 Td +(h)Tj +0.558 0 Td +(e )Tj +/TT1 1 Tf +1.279 0 Td +(D)Tj +0.602 0 Td +(e)Tj +0.602 0 Td +(l)Tj +0.602 0 Td +(e)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(a)Tj +0.602 0 Td +(t)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(L)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(e)Tj +0.602 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.379 0 Td +(r)Tj +0.335 0 Td +(e)Tj +0.502 0 Td +(a)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(i)Tj +0.28 0 Td +(z)Tj +0.502 0 Td +(a)Tj +0.502 0 Td +(t)Tj +0.28 0 Td +(i)Tj +0.28 0 Td +(o)Tj +0.558 0 Td +(n )Tj +1.335 0 Td +(e)Tj +0.502 0 Td +(x)Tj +0.502 0 Td +(p)Tj +0.558 0 Td +(e)Tj +0.502 0 Td +(c)Tj +0.502 0 Td +(t)Tj +0.28 0 Td +(s )Tj +1.168 0 Td +(a )Tj +/TT1 1 Tf +1.279 0 Td +(L)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(e)Tj +0.602 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.379 0 Td +(i)Tj +0.28 0 Td +(n)Tj +0.558 0 Td +(s)Tj +0.391 0 Td +(t)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(n)Tj +0.558 0 Td +(c)Tj +0.502 0 Td +(e )Tj +1.279 0 Td +(a)Tj +0.502 0 Td +(n)Tj +0.558 0 Td +(d )Tj +1.335 0 Td +(d)Tj +0.558 0 Td +(e)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(e)Tj +0.502 0 Td +(g)Tj +0.502 0 Td +(a)Tj +0.502 0 Td +(t)Tj +0.28 0 Td +(e)Tj +0.502 0 Td +(s )Tj +1.168 0 Td +(a)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(l)Tj +( )Tj +-41.922 -1.44 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocations to it \(see Listing 59\).)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 76.9002 Tm +(public class DelegatingLogger implements XRayLogger{)Tj +ET +Q + +endstream +endobj +258 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 259 0 R>>endobj +259 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(108)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( private Logger logger;)Tj +0 -3.58 TD +( public DelegatingLogger\(Logger logger\) {)Tj +0 -1.79 TD +( this.logger = logger;)Tj +T* +( })Tj +T* +( )Tj +T* +( public void log\(Level level, String message, Object[] params\){)Tj +T* +( this.logger.log\(level, message, params\);)Tj +T* +( })Tj +0 -3.58 TD +( public Logger getLogger\(\) {)Tj +0 -1.79 TD +( return logger;)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 59: ja)Tj +5.473 0 Td +(v)Tj +0.476 0 Td +(a.util.Logging )Tj +6.077 0 Td +(Wr)Tj +1.321 0 Td +(apper)Tj +/TT1 1 Tf +-11.547 -2.24 Td +(DelegatingLogger)Tj +/TT0 1 Tf +( )Tj +9.905 0 Td +(is )Tj +0.971 0 Td +(the )Tj +1.638 0 Td +(\223debugging\224 )Tj +5.694 0 Td +(setup )Tj +2.583 0 Td +(w)Tj +0.76 0 Td +(here )Tj +2.193 0 Td +(all )Tj +1.36 0 Td +(log )Tj +1.638 0 Td +(messages )Tj +4.304 0 Td +(are )Tj +1.637 0 Td +(actually )Tj +3.694 0 Td +(passed )Tj +3.194 0 Td +(to)Tj +( )Tj +-41.366 -1.44 Td +(t)Tj +0.301 0 Td +(h)Tj +0.579 0 Td +(e )Tj +1.289 0 Td +(r)Tj +0.356 0 Td +(e)Tj +0.523 0 Td +(a)Tj +0.523 0 Td +(l )Tj +1.067 0 Td +(l)Tj +0.301 0 Td +(o)Tj +0.579 0 Td +(g )Tj +1.289 0 Td +(s)Tj +0.412 0 Td +(y)Tj +0.523 0 Td +(s)Tj +0.412 0 Td +(t)Tj +0.301 0 Td +(e)Tj +0.523 0 Td +(m)Tj +0.856 0 Td +(. )Tj +1.067 0 Td +(I)Tj +0.301 0 Td +(n )Tj +1.345 0 Td +(p)Tj +0.579 0 Td +(r)Tj +0.356 0 Td +(o)Tj +0.579 0 Td +(d)Tj +0.579 0 Td +(u)Tj +0.579 0 Td +(c)Tj +0.523 0 Td +(t)Tj +0.301 0 Td +(i)Tj +0.301 0 Td +(o)Tj +0.579 0 Td +(n)Tj +/TT2 1 Tf +0.579 0 Td +(,)Tj +/TT0 1 Tf +( )Tj +1.039 0 Td +(a )Tj +1.289 0 Td +(\223)Tj +/TT1 1 Tf +0.467 0 Td +(/)Tj +0.623 0 Td +(d)Tj +0.623 0 Td +(e)Tj +0.623 0 Td +(v)Tj +0.623 0 Td +(/)Tj +0.623 0 Td +(n)Tj +0.623 0 Td +(u)Tj +0.623 0 Td +(l)Tj +/TT0 1 Tf +0.623 0 Td +(l)Tj +0.301 0 Td +(\224 )Tj +1.233 0 Td +(i)Tj +0.301 0 Td +(m)Tj +0.856 0 Td +(p)Tj +0.579 0 Td +(l)Tj +0.301 0 Td +(e)Tj +0.523 0 Td +(m)Tj +0.856 0 Td +(e)Tj +0.523 0 Td +(n)Tj +0.579 0 Td +(t)Tj +0.301 0 Td +(a)Tj +0.523 0 Td +(t)Tj +0.301 0 Td +(i)Tj +0.301 0 Td +(o)Tj +0.579 0 Td +(n )Tj +1.345 0 Td +(o)Tj +0.579 0 Td +(f )Tj +1.067 0 Td +(t)Tj +0.301 0 Td +(h)Tj +0.579 0 Td +(e )Tj +/TT1 1 Tf +1.289 0 Td +(L)Tj +0.623 0 Td +(o)Tj +0.623 0 Td +(g)Tj +0.623 0 Td +(g)Tj +0.623 0 Td +(e)Tj +0.623 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +-41.6 -1.44 Td +(implementation is used \(see Listing 60\). )Tj +/TT1 1 Tf +0 -1.79 TD +(@Alternative)Tj +0 -1.79 TD +(public class DevNullLogger implements XRayLogger{)Tj +T* +( @Override)Tj +T* +( public void log\(Level INFO, String string, Object[] object\) {)Tj +T* +( //ignore everything)Tj +T* +( })Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public Logger getLogger\(\) {)Tj +T* +( return null;)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 60: Null-Object Implementation of XRa)Tj +20.033 0 Td +(yLogger)Tj +ET + +endstream +endobj +260 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 261 0 R>>endobj +261 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(109)Tj +/TT1 1 Tf +0 Tc 0 Tw -18.332 57.06 Td +(DevNullLogger)Tj +/TT0 1 Tf +( )Tj +8.153 0 Td +(is )Tj +1.019 0 Td +(denoted )Tj +3.854 0 Td +(with )Tj +2.242 0 Td +(the )Tj +/TT1 1 Tf +1.686 0 Td +(@Alternative)Tj +/TT0 1 Tf +( )Tj +7.553 0 Td +(annotation )Tj +4.966 0 Td +(and )Tj +1.964 0 Td +(so )Tj +1.297 0 Td +(it )Tj +0.908 0 Td +(is )Tj +1.019 0 Td +(disabled. )Tj +(T)Tj +4.68 0 Td +(he )Tj +/TT1 1 Tf +-41.144 -1.44 Td +(@Alternative)Tj +/TT0 1 Tf +( )Tj +7.715 0 Td +(annotation )Tj +5.128 0 Td +(for)Tj +1.155 0 Td +(ces )Tj +1.903 0 Td +(the )Tj +1.848 0 Td +(container )Tj +4.571 0 Td +(to )Tj +1.348 0 Td +(use )Tj +1.959 0 Td +(the )Tj +/TT1 1 Tf +1.848 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +( )Tj +8.916 0 Td +(to )Tj +1.348 0 Td +(create )Tj +3.125 0 Td +(the )Tj +-40.866 -1.44 Td +(instances, )Tj +4.709 0 Td +(instead )Tj +3.542 0 Td +(of )Tj +1.319 0 Td +(using )Tj +2.764 0 Td +(the )Tj +1.819 0 Td +(default )Tj +3.431 0 Td +(constructor )Tj +5.32 0 Td +(directly)Tj +3.131 0 Td +(. )Tj +0.726 0 Td +(A )Tj +1.152 0 Td +(remo)Tj +2.21 0 Td +(v)Tj +0.476 0 Td +(al )Tj +1.263 0 Td +(of )Tj +1.319 0 Td +(the )Tj +/TT1 1 Tf +1.819 0 Td +(@Alternative)Tj +/TT0 1 Tf +( )Tj +-34.999 -1.44 Td +(annotation )Tj +4.989 0 Td +(from )Tj +/TT1 1 Tf +2.375 0 Td +(DevNullLogger)Tj +/TT0 1 Tf +( )Tj +8.177 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.321 0 Td +(introduce )Tj +4.488 0 Td +(an )Tj +1.431 0 Td +(ambiguity )Tj +4.654 0 Td +(and )Tj +1.987 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.321 0 Td +(cause )Tj +2.82 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +-39.533 -1.44 Td +(errors)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +(A )Tj +1.123 0 Td +(potential )Tj +4.236 0 Td +(ad)Tj +1.032 0 Td +(v)Tj +0.476 0 Td +(antage )Tj +3.29 0 Td +(of )Tj +1.29 0 Td +(wr)Tj +1.099 0 Td +(apping )Tj +3.402 0 Td +(the )Tj +/TT1 1 Tf +1.79 0 Td +(java.util.Logger)Tj +/TT0 1 Tf +( )Tj +10.058 0 Td +(with )Tj +2.346 0 Td +(a )Tj +0.956 0 Td +(delegate )Tj +4.068 0 Td +(is )Tj +1.123 0 Td +(increased )Tj +-38.088 -1.44 Td +(encapsulation. )Tj +6.777 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.997 0 Td +(application )Tj +5.332 0 Td +(code )Tj +2.608 0 Td +(is )Tj +1.163 0 Td +(no )Tj +1.608 0 Td +(longer )Tj +3.219 0 Td +(dependent )Tj +5.054 0 Td +(on )Tj +/TT1 1 Tf +1.608 0 Td +(java.util.Logger)Tj +/TT0 1 Tf +(; )Tj +10.376 0 Td +(it )Tj +1.052 0 Td +(is )Tj +-41.533 -1.44 Td +(dependent )Tj +4.987 0 Td +(only )Tj +2.319 0 Td +(on )Tj +1.541 0 Td +(the )Tj +/TT1 1 Tf +1.763 0 Td +(XRayLogger)Tj +/TT0 1 Tf +( )Tj +6.43 0 Td +(interface. )Tj +4.356 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.652 0 Td +(positi)Tj +2.317 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.929 0 Td +(side-effect )Tj +4.819 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.318 0 Td +(not )Tj +1.819 0 Td +(the )Tj +1.763 0 Td +(main )Tj +2.596 0 Td +(goal )Tj +-40.366 -1.44 Td +(behind )Tj +3.323 0 Td +(the )Tj +1.655 0 Td +(introduction )Tj +5.602 0 Td +(of )Tj +1.155 0 Td +(the )Tj +1.655 0 Td +(delegate; )Tj +4.211 0 Td +(r)Tj +0.321 0 Td +(ather)Tj +2.093 0 Td +(, )Tj +0.599 0 Td +(it )Tj +0.877 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.21 0 Td +(the )Tj +1.655 0 Td +(consequence )Tj +5.99 0 Td +(of )Tj +1.155 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.099 0 Td +(and )Tj +1.933 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +/C2_0 1 Tf +-39.532 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation. )Tj +2.985 0 Td +(It )Tj +1.095 0 Td +(is )Tj +1.206 0 Td +(actually )Tj +3.929 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.872 0 Td +(unlikely )Tj +3.985 0 Td +(that )Tj +2.151 0 Td +(the )Tj +/TT1 1 Tf +1.873 0 Td +(java.util.Logging)Tj +/TT0 1 Tf +( )Tj +10.74 0 Td +(fr)Tj +0.599 0 Td +(amew)Tj +2.599 0 Td +(ork )Tj +1.928 0 Td +(will )Tj +2.151 0 Td +(be )Tj +-41.144 -1.44 Td +(replaced in the near future with an alternati)Tj +18.656 0 Td +(v)Tj +0.488 0 Td +(e.)Tj +-17.344 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.463 0 Td +(c)Tj +0.482 0 Td +(hoice )Tj +2.797 0 Td +(regarding )Tj +4.463 0 Td +(the )Tj +1.741 0 Td +(implementation )Tj +7.187 0 Td +(is )Tj +1.074 0 Td +(made )Tj +2.796 0 Td +(in )Tj +1.241 0 Td +(the )Tj +/TT1 1 Tf +1.741 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +( )Tj +8.809 0 Td +(class )Tj +2.463 0 Td +(with )Tj +2.297 0 Td +(the )Tj +-40.866 -1.44 Td +(injected )Tj +/TT1 1 Tf +3.828 0 Td +(debug)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +3.383 0 Td +<005D>Tj +/TT0 1 Tf +(eld )Tj +2.272 0 Td +(\(see )Tj +2.049 0 Td +(Listing )Tj +3.161 0 Td +(57\). )Tj +2.05 0 Td +(In )Tj +1.216 0 Td +(the )Tj +1.716 0 Td +(default )Tj +3.328 0 Td +(case)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +2.521 0 Td +(DevNullLogger)Tj +/TT0 1 Tf +( )Tj +8.184 0 Td +(gets )Tj +2.049 0 Td +(instantiated. )Tj +5.607 0 Td +(In )Tj +-41.366 -1.44 Td +(debug )Tj +2.95 0 Td +(mode)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +2.977 0 Td +(DelegatingLogger)Tj +/TT0 1 Tf +( )Tj +9.883 0 Td +(gets )Tj +1.949 0 Td +(instantiated. )Tj +5.433 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.338 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.116 0 Td +(of )Tj +1.116 0 Td +(the )Tj +/TT1 1 Tf +1.616 0 Td +(debug)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +3.282 0 Td +<005D>Tj +/TT0 1 Tf +(eld )Tj +2.172 0 Td +(is )Tj +0.949 0 Td +(produced )Tj +4.395 0 Td +(b)Tj +0.538 0 Td +(y )Tj +-41.7 -1.44 Td +(the )Tj +/TT1 1 Tf +(Configuration )Tj +/TT0 1 Tf +(singleton session bean.)Tj +/TT3 1 Tf +12 0 0 12 57 375.6002 Tm +(Unit )Tj +2.149 0 Td +(T)Tj +0.456 0 Td +(est Is Not Integr)Tj +7.044 0 Td +(ation )Tj +2.427 0 Td +(T)Tj +0.456 0 Td +(est)Tj +/TT0 1 Tf +10 0 0 10 75 353.2002 Tm +(It )Tj +1.172 0 Td +(is )Tj +1.283 0 Td +(a )Tj +1.116 0 Td +(common )Tj +4.45 0 Td +(misconception )Tj +6.952 0 Td +(that )Tj +2.228 0 Td +(a )Tj +1.116 0 Td +(unit )Tj +2.284 0 Td +(test )Tj +2.061 0 Td +(should )Tj +3.507 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.505 0 Td +(run )Tj +2.061 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(eniently )Tj +4.062 0 Td +(in )Tj +1.45 0 Td +(an )Tj +-41.144 -1.44 Td +(embedded )Tj +4.895 0 Td +(container )Tj +4.395 0 Td +(and )Tj +1.95 0 Td +(beha)Tj +2.082 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.838 0 Td +(like )Tj +1.894 0 Td +(the )Tj +1.672 0 Td +(production )Tj +5.063 0 Td +(system. )Tj +3.505 0 Td +(In )Tj +1.172 0 Td +(fact)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.144 0 Td +(the )Tj +1.672 0 Td +(opposite )Tj +4.007 0 Td +(is )Tj +1.005 0 Td +(true: )Tj +2.246 0 Td +(A )Tj +1.005 0 Td +(good )Tj +-40.032 -1.44 Td +(unit )Tj +2.413 0 Td +(test )Tj +2.19 0 Td +(should )Tj +3.636 0 Td +(v)Tj +0.476 0 Td +(alidate )Tj +3.635 0 Td +(the )Tj +2.079 0 Td +(functionality )Tj +6.137 0 Td +(independently )Tj +6.915 0 Td +(of )Tj +1.579 0 Td +(its )Tj +1.69 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.968 0 Td +(and )Tj +2.357 0 Td +(be )Tj +1.801 0 Td +(as )Tj +-41.311 -1.44 Td +(independent )Tj +5.897 0 Td +(as )Tj +1.394 0 Td +(possible )Tj +4.007 0 Td +(from )Tj +2.505 0 Td +(a )Tj +1.005 0 Td +(container)Tj +3.983 0 Td +(. )Tj +0.746 0 Td +(All )Tj +1.728 0 Td +(dependencies )Tj +6.452 0 Td +(should )Tj +3.396 0 Td +(be )Tj +1.561 0 Td +(moc)Tj +1.871 0 Td +(ked )Tj +2.061 0 Td +(out)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.145 0 Td +(and )Tj +2.117 0 Td +(the )Tj +-40.866 -1.44 Td +(beha)Tj +2.082 0 Td +(vior )Tj +1.989 0 Td +(of )Tj +1.156 0 Td +(the )Tj +1.656 0 Td +(class )Tj +2.378 0 Td +(under )Tj +2.823 0 Td +(test )Tj +1.767 0 Td +(should )Tj +3.213 0 Td +(be )Tj +1.378 0 Td +(tested )Tj +2.823 0 Td +(in )Tj +1.156 0 Td +(isolation. )Tj +4.269 0 Td +(Moc)Tj +1.927 0 Td +(king )Tj +2.156 0 Td +(out )Tj +1.712 0 Td +(external )Tj +3.767 0 Td +(dependencies )Tj +-36.253 -1.44 Td +(with )Tj +2.542 0 Td +(the )Tj +1.986 0 Td +(right )Tj +2.597 0 Td +(fr)Tj +0.599 0 Td +(amew)Tj +2.599 0 Td +(ork )Tj +2.041 0 Td +(\(for )Tj +2.097 0 Td +(example, )Tj +4.597 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.152 0 Td +(using )Tj +2.931 0 Td +(Moc)Tj +1.927 0 Td +(kito )Tj +2.264 0 Td +(\()Tj +(http://moc)Tj +4.651 0 Td +(kito.org)Tj +(\) )Tj +4.209 0 Td +(is )Tj +1.319 0 Td +(easy )Tj +2.541 0 Td +(and )Tj +-40.588 -1.44 Td +(extremely )Tj +4.51 0 Td +(producti)Tj +3.595 0 Td +(v)Tj +0.488 0 Td +(e. )Tj +0.992 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.344 0 Td +(producti)Tj +3.595 0 Td +(vity )Tj +1.844 0 Td +(gains )Tj +2.511 0 Td +(of )Tj +1.122 0 Td +(moc)Tj +1.871 0 Td +(king )Tj +2.122 0 Td +(out )Tj +1.678 0 Td +(the )Tj +1.622 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.511 0 Td +(are )Tj +1.621 0 Td +(noticeable )Tj +4.79 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +-41.144 -1.44 Td +(in tri)Tj +1.983 0 Td +(vial cases and become ev)Tj +10.991 0 Td +(en more substantial for more complex business logic.)Tj +-11.174 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.729 0 Td +(JUnit )Tj +2.841 0 Td +(\()Tj +(http://junit.org/)Tj +(\) )Tj +7.622 0 Td +(test )Tj +2.118 0 Td +(fr)Tj +0.599 0 Td +(amew)Tj +2.599 0 Td +(ork )Tj +2.062 0 Td +(can )Tj +2.229 0 Td +(be )Tj +1.729 0 Td +(misused )Tj +4.174 0 Td +(to )Tj +1.507 0 Td +(intentionally )Tj +6.065 0 Td +(implement )Tj +-37.588 -1.44 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.741 0 Td +(tests. )Tj +2.593 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.685 0 Td +(can )Tj +2.129 0 Td +(launc)Tj +2.372 0 Td +(h )Tj +1.129 0 Td +(the )Tj +1.907 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.24 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.963 0 Td +(outside )Tj +3.686 0 Td +(the )Tj +1.907 0 Td +(container )Tj +4.63 0 Td +(and )Tj +2.185 0 Td +(inject )Tj +2.963 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(EntityManager)Tj +/TT0 1 Tf +( to the class under test \(CUT\) b)Tj +21.012 0 Td +(y y)Tj +1.26 0 Td +(ourself \(see Listing 61\).)Tj +/TT1 1 Tf +-22.272 -1.79 Td +(public class UserAgentStatisticsIT {)Tj +0 -1.79 TD +( private EntityManager em;)Tj +T* +( private EntityTransaction tx;)Tj +T* +( UserAgentStatistics cut;)Tj +0 -3.58 TD +( @Before)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 75.9002 Tm +( public void initializeCUT\(\){)Tj +ET +Q + +endstream +endobj +262 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 263 0 R>>endobj +263 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(110)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( EntityManagerFactory emf = )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 624.2002 Tm +(Persistence.createEntityManagerFactory\("integration"\);)Tj +0 -1.79 TD +( em = emf.createEntityManager\(\);)Tj +T* +( tx = em.getTransaction\(\);)Tj +T* +( this.cut = new UserAgentStatistics\(\);)Tj +T* +( this.cut.em = em;)Tj +/TT2 1 Tf +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 61: Unit )Tj +6.819 0 Td +(T)Tj +0.456 0 Td +(est with \223Real\224 EntityManager)Tj +-5.475 -2.24 Td +(T)Tj +0.511 0 Td +(his, )Tj +1.874 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.651 0 Td +(isn\222)Tj +1.464 0 Td +(t )Tj +0.651 0 Td +(a )Tj +0.873 0 Td +(true )Tj +2.04 0 Td +(unit )Tj +2.041 0 Td +(test )Tj +1.818 0 Td +(an)Tj +1.038 0 Td +(ymore )Tj +3.095 0 Td +(and )Tj +1.985 0 Td +(should )Tj +3.264 0 Td +(be )Tj +1.429 0 Td +(strictly )Tj +3.207 0 Td +(separ)Tj +2.266 0 Td +(ated )Tj +2.207 0 Td +(from )Tj +2.373 0 Td +(pure )Tj +2.318 0 Td +(unit )Tj +-40.532 -1.44 Td +(tests. )Tj +2.503 0 Td +(Clean )Tj +2.892 0 Td +(separ)Tj +2.266 0 Td +(ation )Tj +2.559 0 Td +(between )Tj +4.059 0 Td +(unit )Tj +2.059 0 Td +(and )Tj +2.003 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.559 0 Td +(tests )Tj +2.225 0 Td +(also )Tj +2.114 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.558 0 Td +(implementation )Tj +7.171 0 Td +(of )Tj +1.225 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +-41.422 -1.44 Td +(build )Tj +2.504 0 Td +(jobs. )Tj +2.337 0 Td +(Unit )Tj +2.17 0 Td +(tests )Tj +2.114 0 Td +(are )Tj +1.613 0 Td +(orders )Tj +2.947 0 Td +(of )Tj +1.114 0 Td +(magnitude )Tj +4.837 0 Td +(faster )Tj +2.558 0 Td +(and )Tj +1.892 0 Td +(will )Tj +1.892 0 Td +(be )Tj +1.336 0 Td +(executed )Tj +/C2_0 1 Tf +4.17 0 Td +<005D>Tj +/TT0 1 Tf +(rst, )Tj +2.114 0 Td +(and )Tj +1.892 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.448 0 Td +(tests )Tj +-40.366 -1.44 Td +(are )Tj +1.68 0 Td +(slo)Tj +1.211 0 Td +(wer )Tj +1.958 0 Td +(and )Tj +1.959 0 Td +(executed )Tj +4.237 0 Td +(afterw)Tj +2.649 0 Td +(ards. )Tj +2.311 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.459 0 Td +(get )Tj +1.625 0 Td +(instantaneous )Tj +6.239 0 Td +(feedbac)Tj +3.372 0 Td +(k )Tj +0.847 0 Td +(about )Tj +2.793 0 Td +(the )Tj +1.681 0 Td +(correctness )Tj +5.181 0 Td +(of )Tj +1.181 0 Td +(the )Tj +-40.866 -1.44 Td +(business logic and y)Tj +8.653 0 Td +(ou do not ha)Tj +5.474 0 Td +(v)Tj +0.488 0 Td +(e to w)Tj +2.65 0 Td +(ait until all integr)Tj +7.325 0 Td +(ation tests are passed.)Tj +-22.79 -2.24 Td +(Infr)Tj +1.433 0 Td +(astructure )Tj +4.527 0 Td +(tests )Tj +2.138 0 Td +(are )Tj +1.637 0 Td +(less )Tj +1.86 0 Td +(common, )Tj +4.416 0 Td +(but )Tj +1.694 0 Td +(they )Tj +2.138 0 Td +(are )Tj +1.637 0 Td +(highly )Tj +2.972 0 Td +(recommended )Tj +6.527 0 Td +(in )Tj +1.138 0 Td +(the )Tj +1.638 0 Td +(case )Tj +2.193 0 Td +(of )Tj +1.138 0 Td +(x)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.804 0 Td +(as )Tj +-41.311 -1.44 Td +(well. )Tj +2.454 0 Td +(It )Tj +0.898 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.62 0 Td +(make )Tj +2.675 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.842 0 Td +(sense )Tj +2.676 0 Td +(to )Tj +1.176 0 Td +(moc)Tj +1.871 0 Td +(k )Tj +0.842 0 Td +(out )Tj +1.732 0 Td +(the )Tj +1.676 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.565 0 Td +(to )Tj +1.176 0 Td +(test )Tj +1.787 0 Td +(the )Tj +1.676 0 Td +(x)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +/TT2 1 Tf +0.842 0 Td +(Configuration)Tj +/TT0 1 Tf +( )Tj +-34.399 -1.44 Td +(or )Tj +/TT2 1 Tf +1.269 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +( )Tj +8.782 0 Td +(functionality)Tj +5.3 0 Td +(. )Tj +0.658 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.269 0 Td +(both )Tj +2.326 0 Td +(classes)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.575 0 Td +(the )Tj +1.714 0 Td +(inter)Tj +1.933 0 Td +(action )Tj +3.048 0 Td +(between )Tj +4.048 0 Td +(the )Tj +1.714 0 Td +(business )Tj +3.993 0 Td +(code )Tj +-40.088 -1.44 Td +(\(for )Tj +1.724 0 Td +(example, )Tj +4.224 0 Td +(null )Tj +1.947 0 Td +(c)Tj +0.482 0 Td +(hec)Tj +1.538 0 Td +(ks )Tj +1.168 0 Td +(and )Tj +1.891 0 Td +(sear)Tj +1.71 0 Td +(c)Tj +0.482 0 Td +(hing )Tj +2.169 0 Td +(for )Tj +1.446 0 Td +(external )Tj +/C2_0 1 Tf +3.724 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.447 0 Td +(pro)Tj +1.433 0 Td +(viders\) )Tj +3.113 0 Td +(and )Tj +1.891 0 Td +(the )Tj +1.613 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +-37.977 -1.44 Td +(\(for )Tj +2.014 0 Td +(example, )Tj +4.514 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +1.069 0 Td +(injection, )Tj +4.627 0 Td +(ev)Tj +0.988 0 Td +(ents, )Tj +2.57 0 Td +(and )Tj +2.181 0 Td +(inter)Tj +1.933 0 Td +(ception\) )Tj +4.071 0 Td +(is )Tj +1.236 0 Td +(particularly )Tj +5.459 0 Td +(interesting. )Tj +5.219 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(functionality )Tj +5.776 0 Td +(of )Tj +1.218 0 Td +(both )Tj +/TT2 1 Tf +2.33 0 Td +(Configuration)Tj +/TT0 1 Tf +( )Tj +8.185 0 Td +(and )Tj +/TT2 1 Tf +1.996 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +( )Tj +8.785 0 Td +(relies )Tj +2.662 0 Td +(entirely )Tj +3.607 0 Td +(on )Tj +1.496 0 Td +(CDI. )Tj +2.385 0 Td +(Moc)Tj +1.927 0 Td +(king )Tj +-40.366 -1.44 Td +(out )Tj +1.928 0 Td +(the )Tj +1.872 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.761 0 Td +(and)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.4 0 Td +(thus, )Tj +2.595 0 Td +(CDI )Tj +2.261 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.484 0 Td +(make )Tj +2.871 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.038 0 Td +(sensible )Tj +3.984 0 Td +(testing )Tj +3.317 0 Td +(impossible. )Tj +5.429 0 Td +(It )Tj +1.094 0 Td +(is )Tj +1.205 0 Td +(also )Tj +-40.477 -1.44 Td +(important )Tj +4.522 0 Td +(to )Tj +1.188 0 Td +(note )Tj +2.244 0 Td +(that )Tj +1.966 0 Td +(the )Tj +1.688 0 Td +(domain )Tj +3.633 0 Td +(of )Tj +1.188 0 Td +(both )Tj +2.3 0 Td +(classes )Tj +3.299 0 Td +(is )Tj +1.021 0 Td +(a )Tj +0.854 0 Td +(cross-cutting )Tj +5.8 0 Td +(concern )Tj +3.855 0 Td +(that )Tj +1.966 0 Td +(is )Tj +1.021 0 Td +(based )Tj +2.855 0 Td +(on )Tj +1.466 0 Td +(the )Tj +-40.866 -1.44 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.806 0 Td +(EE )Tj +1.306 0 Td +(6 )Tj +0.862 0 Td +(infr)Tj +1.433 0 Td +(astructure. )Tj +4.733 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.362 0 Td +(implementation )Tj +7.086 0 Td +(of )Tj +1.14 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.862 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.529 0 Td +(in )Tj +1.14 0 Td +(a )Tj +0.806 0 Td +(health)Tj +2.631 0 Td +(y )Tj +0.806 0 Td +(business/enterprise )Tj +-34.086 -1.44 Td +(project )Tj +3.292 0 Td +(constitutes )Tj +4.849 0 Td +(only )Tj +2.181 0 Td +(a )Tj +0.791 0 Td +(fr)Tj +0.599 0 Td +(action )Tj +2.959 0 Td +(of )Tj +1.125 0 Td +(the )Tj +1.625 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(all )Tj +1.347 0 Td +(code. )Tj +2.607 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.347 0 Td +(v)Tj +0.476 0 Td +(ast )Tj +1.458 0 Td +(majority )Tj +3.847 0 Td +(of )Tj +1.125 0 Td +(all )Tj +1.347 0 Td +(unit )Tj +1.959 0 Td +(tests )Tj +2.125 0 Td +(do )Tj +1.403 0 Td +(v)Tj +0.476 0 Td +(alidate )Tj +-39.31 -1.44 Td +(the business logic and only a fr)Tj +13.328 0 Td +(action should require a running container to perform unit tests.)Tj +/TT4 1 Tf +12 0 0 12 57 215.2003 Tm +(Injection and Infr)Tj +7.639 0 Td +(astructure )Tj +4.649 0 Td +(T)Tj +0.456 0 Td +(esting with )Tj +5.02 0 Td +(Aliens)Tj +/TT0 1 Tf +10 0 0 10 75 192.8003 Tm +(EJB )Tj +1.846 0 Td +(3.1 )Tj +1.847 0 Td +(beans, )Tj +3.236 0 Td +(managed )Tj +4.402 0 Td +(beans)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.208 0 Td +(or )Tj +1.346 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.124 0 Td +(entities )Tj +3.514 0 Td +(are )Tj +1.79 0 Td +(easy )Tj +2.346 0 Td +(to )Tj +1.291 0 Td +(unit )Tj +2.125 0 Td +(test. )Tj +2.106 0 Td +(T)Tj +0.511 0 Td +(hey )Tj +2.013 0 Td +(are )Tj +1.79 0 Td +(nothing )Tj +3.737 0 Td +(but )Tj +-40.81 -1.44 Td +(annotated POJOs. )Tj +7.911 0 Td +(Y)Tj +0.482 0 Td +(ou can easily test an EJB bean\227ev)Tj +14.771 0 Td +(en with its injection points.)Tj +/TT2 1 Tf +-23.164 -1.79 Td +(@Singleton)Tj +0 -1.79 TD +(@Path\("hitsperday"\))Tj +T* +(public class DailyStatisticsCalculator {)Tj +0 -1.79 TD +( @EJB)Tj +0 -1.79 TD +( Hits hits;)Tj +ET + +endstream +endobj +264 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 266 0 R>>endobj +265 0 obj<>endobj +266 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(111)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( @PersistenceContext)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( EntityManager em;)Tj +0 -1.79 TD +( //\205)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 62: )Tj +4.688 0 Td +(An EJB Bean with Injection P)Tj +12.35 0 Td +(oints)Tj +-15.238 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.362 0 Td +(injection )Tj +4.086 0 Td +(points )Tj +2.919 0 Td +(from )Tj +2.306 0 Td +(Listing )Tj +3.085 0 Td +(62 )Tj +1.418 0 Td +(can )Tj +1.862 0 Td +(be )Tj +1.362 0 Td +(moc)Tj +1.871 0 Td +(ked )Tj +1.862 0 Td +(out )Tj +1.696 0 Td +(with )Tj +2.196 0 Td +(standard )Tj +3.974 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.806 0 Td +(SE )Tj +1.306 0 Td +(tools. )Tj +2.549 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.418 0 Td +(need )Tj +-40.088 -1.44 Td +(a )Tj +0.924 0 Td +(single )Tj +/TT1 1 Tf +2.925 0 Td +(Mockito.mock)Tj +/TT0 1 Tf +( )Tj +7.625 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.moc)Tj +2.149 0 Td +(kito.org)Tj +(\) )Tj +3.981 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.648 0 Td +(for )Tj +1.591 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.98 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.924 0 Td +(\(see )Tj +2.091 0 Td +(Listing )Tj +-39.421 -1.44 Td +(63\).)Tj +/TT1 1 Tf +0 -1.79 TD +(class DailyStatisticsCalculatorTest extends JUnitSuite with )Tj +0 -0.99 TD +(MockitoSugar with ShouldMatchersForJUnit{)Tj +0 -1.79 TD +( var cut: DailyStatisticsCalculator = _)Tj +T* +( @Before)Tj +T* +( def setUp: Unit = {)Tj +T* +( cut = new DailyStatisticsCalculator\(\))Tj +T* +( cut.hits = mock[Hits])Tj +T* +( cut.em = mock[EntityManager])Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 63: Moc)Tj +6.652 0 Td +(ked-Out Dependencies)Tj +-4.852 -2.24 Td +(Only )Tj +2.888 0 Td +(in )Tj +1.555 0 Td +(r)Tj +0.321 0 Td +(are )Tj +2.054 0 Td +(cases )Tj +2.999 0 Td +(is )Tj +1.388 0 Td +(y)Tj +0.482 0 Td +(our )Tj +2.166 0 Td +(business )Tj +4.334 0 Td +(logic )Tj +2.833 0 Td +(mainly )Tj +3.666 0 Td +(based )Tj +3.222 0 Td +(on )Tj +1.833 0 Td +(container )Tj +4.778 0 Td +(services. )Tj +4.314 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +-41.144 -1.44 Td +(Configuration)Tj +/TT0 1 Tf +( )Tj +8.513 0 Td +(mec)Tj +1.815 0 Td +(hanism )Tj +3.824 0 Td +(as )Tj +1.601 0 Td +(well )Tj +2.546 0 Td +(as )Tj +/TT1 1 Tf +1.601 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +( )Tj +9.114 0 Td +(rely )Tj +2.323 0 Td +(on )Tj +1.824 0 Td +(CDI )Tj +2.435 0 Td +(producers )Tj +4.991 0 Td +(and )Tj +-40.588 -1.44 Td +(d)Tj +0.663 0 Td +(e)Tj +0.607 0 Td +(p)Tj +0.663 0 Td +(e)Tj +0.607 0 Td +(n)Tj +0.663 0 Td +(d)Tj +0.663 0 Td +(e)Tj +0.607 0 Td +(n)Tj +0.663 0 Td +(c)Tj +0.583 0 Td +(y )Tj +1.332 0 Td +(i)Tj +0.385 0 Td +(n)Tj +0.663 0 Td +(j)Tj +0.385 0 Td +(e)Tj +0.607 0 Td +(c)Tj +0.607 0 Td +(t)Tj +0.385 0 Td +(i)Tj +0.385 0 Td +(o)Tj +0.663 0 Td +(n)Tj +0.663 0 Td +(. )Tj +1.073 0 Td +(A )Tj +1.499 0 Td +(u)Tj +0.663 0 Td +(n)Tj +0.663 0 Td +(i)Tj +0.385 0 Td +(t )Tj +1.11 0 Td +(t)Tj +0.385 0 Td +(e)Tj +0.607 0 Td +(s)Tj +0.496 0 Td +(t )Tj +1.11 0 Td +(w)Tj +0.885 0 Td +(i)Tj +0.385 0 Td +(t)Tj +0.385 0 Td +(h )Tj +1.388 0 Td +(a )Tj +1.332 0 Td +(m)Tj +0.94 0 Td +(o)Tj +0.663 0 Td +(c)Tj +0.589 0 Td +(k)Tj +0.607 0 Td +(e)Tj +0.607 0 Td +(d)Tj +0.663 0 Td +(-)Tj +0.44 0 Td +(o)Tj +0.663 0 Td +(u)Tj +0.663 0 Td +(t )Tj +1.11 0 Td +(e)Tj +0.607 0 Td +(n)Tj +0.651 0 Td +(v)Tj +0.607 0 Td +(i)Tj +0.385 0 Td +(r)Tj +0.44 0 Td +(o)Tj +0.663 0 Td +(n)Tj +0.663 0 Td +(m)Tj +0.94 0 Td +(e)Tj +0.607 0 Td +(n)Tj +0.663 0 Td +(t )Tj +1.11 0 Td +(f)Tj +0.385 0 Td +(o)Tj +0.663 0 Td +(r )Tj +1.165 0 Td +(t)Tj +0.385 0 Td +(h)Tj +0.663 0 Td +(e)Tj +( )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(c)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(m)Tj +0.602 0 Td +(.)Tj +0.602 0 Td +(a)Tj +0.602 0 Td +(b)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(e)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(.)Tj +0.602 0 Td +(x)Tj +0.602 0 Td +(r)Tj +0.602 0 Td +(a)Tj +0.602 0 Td +(y)Tj +0.602 0 Td +(.)Tj +0.602 0 Td +(b)Tj +0.602 0 Td +(u)Tj +0.602 0 Td +(s)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(e)Tj +0.602 0 Td +(s)Tj +0.602 0 Td +(s)Tj +0.602 0 Td +(.)Tj +0.602 0 Td +(c)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(f)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(u)Tj +0.602 0 Td +(r)Tj +0.602 0 Td +(a)Tj +0.602 0 Td +(t)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(.)Tj +0.602 0 Td +(b)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(u)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(d)Tj +0.602 0 Td +(a)Tj +0.602 0 Td +(r)Tj +0.602 0 Td +(y)Tj +0.602 0 Td +(.)Tj +0.602 0 Td +(C)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(n)Tj +0.602 0 Td +(f)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(g)Tj +0.602 0 Td +(u)Tj +0.602 0 Td +(r)Tj +0.602 0 Td +(a)Tj +0.602 0 Td +(t)Tj +0.602 0 Td +(i)Tj +0.602 0 Td +(o)Tj +0.602 0 Td +(n)Tj +/TT0 1 Tf +( )Tj +1.379 0 Td +(c)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(s)Tj +0.391 0 Td +(s )Tj +1.168 0 Td +(c)Tj +0.502 0 Td +(o)Tj +0.558 0 Td +(u)Tj +0.558 0 Td +(l)Tj +0.28 0 Td +(d )Tj +-41.644 -1.44 Td +(v)Tj +0.476 0 Td +(alidate )Tj +3.202 0 Td +(only )Tj +2.202 0 Td +(w)Tj +0.76 0 Td +(hether )Tj +3.035 0 Td +(a )Tj +/C2_0 1 Tf +0.812 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.48 0 Td +(entry )Tj +2.479 0 Td +(is )Tj +0.979 0 Td +(found )Tj +2.814 0 Td +(in )Tj +1.146 0 Td +(the )Tj +1.646 0 Td +(internal )Tj +3.591 0 Td +(data )Tj +2.146 0 Td +(structure )Tj +4.035 0 Td +(\()Tj +/TT1 1 Tf +(HashMap)Tj +/TT0 1 Tf +(\). )Tj +5.255 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +-41.088 -1.44 Td +(w)Tj +0.766 0 Td +(ould test only the )Tj +/TT1 1 Tf +(java.util.HashMap)Tj +/TT0 1 Tf +( implementation, not y)Tj +27.693 0 Td +(our code. )Tj +-26.659 -2.24 Td +(F)Tj +0.445 0 Td +(ar )Tj +1.278 0 Td +(more )Tj +2.668 0 Td +(interesting )Tj +4.891 0 Td +(is )Tj +1.112 0 Td +(the )Tj +1.78 0 Td +(v)Tj +/C2_0 1 Tf +0.488 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +(cation )Tj +4.78 0 Td +(of )Tj +1.28 0 Td +(the )Tj +1.78 0 Td +(injection )Tj +4.225 0 Td +(and )Tj +2.057 0 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention )Tj +3.169 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +/C2_0 1 Tf +1.278 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.712 0 Td +(ation )Tj +-40.032 -1.44 Td +(mec)Tj +1.815 0 Td +(hanism. )Tj +3.747 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.987 0 Td +(test )Tj +1.876 0 Td +(the )Tj +1.765 0 Td +(container )Tj +4.488 0 Td +(services, )Tj +4.098 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.543 0 Td +(need )Tj +2.543 0 Td +(a )Tj +0.931 0 Td +(container)Tj +3.983 0 Td +(. )Tj +0.617 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.543 0 Td +(could)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.127 0 Td +(of )Tj +1.265 0 Td +(course)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.515 0 Td +(deplo)Tj +2.434 0 Td +(y )Tj +-41.7 -1.44 Td +(y)Tj +0.482 0 Td +(our )Tj +1.816 0 Td +(application )Tj +5.207 0 Td +(to )Tj +1.205 0 Td +(the )Tj +1.705 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.539 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.204 0 Td +(and )Tj +1.983 0 Td +(test )Tj +1.816 0 Td +(the )Tj +1.705 0 Td +(functionality )Tj +5.763 0 Td +(in )Tj +1.205 0 Td +(a )Tj +0.871 0 Td +(real )Tj +1.982 0 Td +(w)Tj +0.766 0 Td +(orld )Tj +2.094 0 Td +(en)Tj +1.044 0 Td +(vironment. )Tj +-37.532 -1.44 Td +(Ho)Tj +1.322 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.557 0 Td +(a )Tj +0.779 0 Td +(far )Tj +1.39 0 Td +(better )Tj +2.724 0 Td +(approac)Tj +3.483 0 Td +(h )Tj +0.835 0 Td +(is )Tj +0.946 0 Td +(a )Tj +0.779 0 Td +(test )Tj +1.724 0 Td +(inside )Tj +2.836 0 Td +(the )Tj +1.613 0 Td +(container )Tj +4.336 0 Td +(with )Tj +2.169 0 Td +(only )Tj +2.169 0 Td +(a )Tj +0.779 0 Td +(limited )Tj +3.28 0 Td +(set )Tj +1.446 0 Td +(of )Tj +1.113 0 Td +(classes )Tj +3.224 0 Td +(in )Tj +1.113 0 Td +(an )Tj +-41.144 -1.44 Td +(isolated )Tj +3.641 0 Td +(en)Tj +1.044 0 Td +(vironment. )Tj +4.937 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.418 0 Td +(an )Tj +1.362 0 Td +(embeddable )Tj +5.641 0 Td +(container)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.613 0 Td +(dedicated )Tj +4.53 0 Td +(test )Tj +1.751 0 Td +(classes )Tj +3.251 0 Td +(can )Tj +1.862 0 Td +(be )Tj +1.362 0 Td +(introduced )Tj +4.975 0 Td +(to )Tj +-41.366 -1.44 Td +(v)Tj +0.476 0 Td +(alidate )Tj +3.493 0 Td +(a )Tj +1.103 0 Td +(particular )Tj +4.715 0 Td +(aspect )Tj +3.326 0 Td +(of )Tj +1.437 0 Td +(the )Tj +1.937 0 Td +(system. )Tj +3.77 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +1.159 0 Td +(a )Tj +1.103 0 Td +(test )Tj +2.048 0 Td +(class )Tj +2.659 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.549 0 Td +(not )Tj +1.993 0 Td +(be )Tj +1.659 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.659 0 Td +(with )Tj +-40.31 -1.44 Td +(production code and w)Tj +10.049 0 Td +(ould be used only in the test phase. )Tj +/TT1 1 Tf +-8.249 -2.24 Td +(c)Tj +0.643 0 Td +(o)Tj +0.643 0 Td +(m)Tj +0.643 0 Td +(.)Tj +0.643 0 Td +(a)Tj +0.643 0 Td +(b)Tj +0.643 0 Td +(i)Tj +0.643 0 Td +(e)Tj +0.643 0 Td +(n)Tj +0.643 0 Td +(.)Tj +0.643 0 Td +(x)Tj +0.643 0 Td +(r)Tj +0.643 0 Td +(a)Tj +0.643 0 Td +(y)Tj +0.643 0 Td +(.)Tj +0.643 0 Td +(b)Tj +0.643 0 Td +(u)Tj +0.643 0 Td +(s)Tj +ET +BT +/TT1 1 Tf +10 0 0 10 190.6557 112.9003 Tm +(i)Tj +0.643 0 Td +(n)Tj +0.643 0 Td +(e)Tj +0.643 0 Td +(s)Tj +0.643 0 Td +(s)Tj +0.643 0 Td +(.)Tj +0.643 0 Td +(c)Tj +0.643 0 Td +(o)Tj +0.643 0 Td +(n)Tj +0.643 0 Td +(f)Tj +0.643 0 Td +(i)Tj +0.643 0 Td +(g)Tj +0.643 0 Td +(u)Tj +0.643 0 Td +(r)Tj +0.643 0 Td +(a)Tj +0.643 0 Td +(t)Tj +0.643 0 Td +(i)Tj +0.643 0 Td +(o)Tj +0.643 0 Td +(n)Tj +0.643 0 Td +(.)Tj +0.643 0 Td +(b)Tj +0.643 0 Td +(o)Tj +0.643 0 Td +(u)Tj +0.643 0 Td +(n)Tj +0.643 0 Td +(d)Tj +0.643 0 Td +(a)Tj +0.643 0 Td +(r)Tj +0.643 0 Td +(y)Tj +0.643 0 Td +(.)Tj +0.643 0 Td +(C)Tj +0.643 0 Td +(o)Tj +0.643 0 Td +(n)Tj +0.643 0 Td +(f)Tj +0.643 0 Td +(i)Tj +0.643 0 Td +(g)Tj +0.643 0 Td +(u)Tj +0.643 0 Td +(r)Tj +0.643 0 Td +(a)Tj +0.643 0 Td +(b)Tj +0.643 0 Td +(l)Tj +0.643 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.399 0 Td +(w)Tj +0.802 0 Td +(a)Tj +0.542 0 Td +(s)Tj +( )Tj +-41.811 -1.44 Td +(exclusi)Tj +2.983 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.822 0 Td +(dev)Tj +1.544 0 Td +(eloped )Tj +3.49 0 Td +(for )Tj +1.711 0 Td +(performing )Tj +5.267 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.712 0 Td +(tests. )Tj +2.582 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.6 0 Td +(class )Tj +/TT1 1 Tf +2.6 0 Td +(Configurable)Tj +/TT0 1 Tf +( )Tj +7.745 0 Td +(consists )Tj +3.879 0 Td +(of)Tj +( )Tj +-41.366 -1.44 Td +(injected )Tj +/C2_0 1 Tf +3.832 0 Td +<005D>Tj +/TT0 1 Tf +(elds. )Tj +2.869 0 Td +(T)Tj +0.511 0 Td +(heir )Tj +2.053 0 Td +(content )Tj +3.61 0 Td +(will )Tj +1.998 0 Td +(be )Tj +1.442 0 Td +(v)Tj +0.476 0 Td +(alidated )Tj +3.832 0 Td +(during )Tj +3.165 0 Td +(the )Tj +1.72 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.554 0 Td +(tests )Tj +2.22 0 Td +(to )Tj +1.22 0 Td +(v)Tj +0.488 0 Td +(erify )Tj +2.275 0 Td +(the )Tj +1.72 0 Td +(injection )Tj +ET + +endstream +endobj +267 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 268 0 R>>endobj +268 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(112)Tj +0 Tc 0 Tw -20.132 57.06 Td +(mec)Tj +1.815 0 Td +(hanism \(see Listing 64\).)Tj +/TT1 1 Tf +-1.815 -1.79 Td +(@Singleton)Tj +0 -1.79 TD +(public class Configurable {)Tj +0 -1.79 TD +( @Inject)Tj +0 -1.79 TD +( private String version;)Tj +0 -1.79 TD +( @Inject)Tj +T* +( private String notExistingAndEmpty;)Tj +T* +( @Inject)Tj +T* +( private boolean debug;)Tj +T* +( @Inject)Tj +T* +( private int answer;)Tj +0 -3.58 TD +( public String getVersion\(\) {)Tj +0 -1.79 TD +( return version;)Tj +T* +( })Tj +0 -3.58 TD +( public String getNotExistingAndEmpty\(\) {)Tj +0 -1.79 TD +( return notExistingAndEmpty;)Tj +T* +( })Tj +0 -3.58 TD +( public int getAnswer\(\) {)Tj +0 -1.79 TD +( return answer;)Tj +T* +( })Tj +0 -3.58 TD +( public boolean isDebug\(\) {)Tj +0 -1.79 TD +( return debug;)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 64: )Tj +4.688 0 Td +(An Injection Dumm)Tj +8.547 0 Td +(y)Tj +-11.435 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.374 0 Td +(class )Tj +/TT1 1 Tf +2.374 0 Td +(Configurable)Tj +/TT0 1 Tf +( )Tj +7.519 0 Td +(resides )Tj +3.263 0 Td +(in )Tj +1.152 0 Td +(the )Tj +/TT1 1 Tf +1.652 0 Td +(src/test/java)Tj +/TT0 1 Tf +( )Tj +8.119 0 Td +(pac)Tj +1.538 0 Td +(kage )Tj +2.318 0 Td +(and )Tj +1.93 0 Td +(is )Tj +0.985 0 Td +(not )Tj +1.708 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.374 0 Td +(into)Tj +( )Tj +-40.532 -1.44 Td +(production.)Tj +ET + +endstream +endobj +269 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 270 0 R>>endobj +270 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(113)Tj +/TT1 1 Tf +0 Tc 0 Tw -18.332 57.06 Td +(Configuration)Tj +/TT0 1 Tf +( )Tj +8.106 0 Td +(as )Tj +1.194 0 Td +(well )Tj +2.139 0 Td +(as )Tj +/TT1 1 Tf +1.194 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +( )Tj +8.706 0 Td +(are )Tj +1.638 0 Td +(based )Tj +2.806 0 Td +(on )Tj +1.417 0 Td +(CDI )Tj +2.028 0 Td +(and )Tj +1.917 0 Td +(used )Tj +2.306 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.805 0 Td +(EJB )Tj +1.694 0 Td +(beans. )Tj +3.084 0 Td +(In )Tj +-41.366 -1.44 Td +(contr)Tj +2.211 0 Td +(ast )Tj +1.524 0 Td +(to )Tj +1.191 0 Td +(the )Tj +1.691 0 Td +(EJB )Tj +/C2_0 1 Tf +1.746 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation, )Tj +6.082 0 Td +(there )Tj +2.524 0 Td +(is )Tj +1.024 0 Td +(no )Tj +1.469 0 Td +(standardized )Tj +5.859 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.857 0 Td +(to )Tj +1.191 0 Td +(boot )Tj +2.303 0 Td +(the )Tj +1.691 0 Td +(CDI )Tj +2.08 0 Td +(container )Tj +4.414 0 Td +(outside)Tj +( )Tj +-39.087 -1.44 Td +(the )Tj +1.798 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.668 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.52 0 Td +(problem )Tj +4.076 0 Td +(is )Tj +1.131 0 Td +(solv)Tj +1.711 0 Td +(ed )Tj +1.52 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.964 0 Td +(an )Tj +1.52 0 Td +(open )Tj +2.632 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.464 0 Td +(project)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.678 0 Td +(Arquillian )Tj +4.744 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.jboss.org/)Tj +-37.809 -1.44 Td +(arquillian)Tj +(\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.03 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.945 0 Td +(not )Tj +1.779 0 Td +(only )Tj +2.279 0 Td +(boots )Tj +2.724 0 Td +(the )Tj +1.723 0 Td +(container)Tj +3.983 0 Td +(, )Tj +0.667 0 Td +(but )Tj +1.779 0 Td +(also )Tj +2.112 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.556 0 Td +(the )Tj +1.723 0 Td +(injection )Tj +4.169 0 Td +(of )Tj +1.223 0 Td +(managed )Tj +4.334 0 Td +(beans )Tj +-39.699 -1.44 Td +(and EJB beans into unit test classes \(see Listing 65\))Tj +/TT2 1 Tf +(.)Tj +/TT1 1 Tf +0 -1.79 TD +(import )Tj +0 -0.99 TD +(com.abien.xray.business.configuration.control.ConfigurationProvider;)Tj +0 -1.79 TD +(import org.jboss.arquillian.api.Deployment;)Tj +T* +(import org.jboss.arquillian.junit.Arquillian;)Tj +0 -1.79 TD +(import org.jboss.shrinkwrap.api.ArchivePaths;)Tj +0 -1.79 TD +(import org.jboss.shrinkwrap.api.ShrinkWrap;)Tj +T* +(import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;)Tj +T* +(import org.jboss.shrinkwrap.api.spec.JavaArchive;)Tj +T* +(import org.junit.Test;)Tj +T* +(import org.junit.runner.RunWith;)Tj +T* +(import javax.inject.Inject;)Tj +T* +(import java.util.Set;)Tj +T* +(import static org.hamcrest.core.Is.*;)Tj +T* +(import static org.junit.Assert.*;)Tj +0 -3.58 TD +(@RunWith\(Arquillian.class\))Tj +0 -1.79 TD +(public class ConfigurationIT {)Tj +0 -3.58 TD +( @Inject)Tj +0 -1.79 TD +( Configurable configurable;)Tj +0 -3.58 TD +( @Inject)Tj +0 -1.79 TD +( Configuration configuration;)Tj +0 -3.58 TD +( @Deployment)Tj +0 -1.79 TD +( public static JavaArchive createArchive\(\) {)Tj +0 -1.79 TD +( return ShrinkWrap.create\(JavaArchive.class, "xray.jar"\).)Tj +0 -1.79 TD +( addClasses\(Configuration.class\).)Tj +ET + +endstream +endobj +271 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 272 0 R>>endobj +272 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(114)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( addClasses\(Configurable.class\).)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2001 Tm +( addClasses\(ConfigurationProvider.class\).)Tj +0 -1.79 TD +( addManifestResource\()Tj +T* +( new ByteArrayAsset\("".getBytes\(\)\),)Tj +T* +( ArchivePaths.create\("beans.xml"\)\);)Tj +T* +( })Tj +0 -3.58 TD +( @Test)Tj +0 -1.79 TD +( public void configurableInjection\(\) {)Tj +T* +( assertNotNull\(this.configurable\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( )Tj +T* +( )Tj +T* +( @Test)Tj +T* +( public void customConfigurationNotExist\(\){)Tj +T* +( assertFalse\(this.configuration.doesCustomConfigurationExist)Tj +0 -0.99 TD +(\(\)\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( @Test)Tj +0 -1.79 TD +( public void versionInjection\(\) {)Tj +T* +( assertNotNull\(this.configurable.getVersion\(\)\);)Tj +T* +( })Tj +T* +( @Test)Tj +T* +( public void notExistingParameter\(\) {)Tj +0 -1.79 TD +( assertNull\(this.configurable.getNotExistingAndEmpty\(\)\);)Tj +0 -1.79 TD +( Set unconfiguredFields = )Tj +0 -0.99 TD +(this.configuration.getUnconfiguredFields\(\);)Tj +0 -1.79 TD +( assertNotNull\(unconfiguredFields\);)Tj +0 -1.79 TD +( assertThat\(unconfiguredFields.size\(\), is\(2\)\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( @Test)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 77.3002 Tm +( public void booleanInjection\(\){)Tj +ET +Q + +endstream +endobj +273 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 274 0 R>>endobj +274 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(115)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( assertFalse\(this.configurable.isDebug\(\)\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2001 Tm +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 65: Container Bootstr)Tj +12.216 0 Td +(apping in Unit )Tj +6.43 0 Td +(T)Tj +0.456 0 Td +(est)Tj +-17.302 -2.24 Td +(Arquillian )Tj +4.561 0 Td +(not )Tj +1.671 0 Td +(only )Tj +2.171 0 Td +(performs )Tj +4.059 0 Td +(the )Tj +1.615 0 Td +(test, )Tj +2.004 0 Td +(but )Tj +1.671 0 Td +(it )Tj +0.837 0 Td +(also )Tj +2.004 0 Td +(builds )Tj +2.894 0 Td +(the )Tj +1.615 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hi)Tj +0.816 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.781 0 Td +(in )Tj +1.115 0 Td +(a )Tj +0.781 0 Td +(method )Tj +3.56 0 Td +(annotated )Tj +4.561 0 Td +(with )Tj +/TT1 1 Tf +-40.31 -1.44 Td +(@Deployment)Tj +/TT0 1 Tf +(. )Tj +7.241 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.566 0 Td +(can )Tj +2.01 0 Td +(pic)Tj +1.316 0 Td +(k )Tj +0.954 0 Td +(and )Tj +2.066 0 Td +(c)Tj +0.482 0 Td +(hoose )Tj +3.011 0 Td +(classes )Tj +3.399 0 Td +(that )Tj +2.066 0 Td +(should )Tj +3.345 0 Td +(belong )Tj +3.4 0 Td +(to )Tj +1.288 0 Td +(the )Tj +/C2_0 1 Tf +1.788 0 Td +<00470046000A004C0040003D000A005E>Tj +/TT0 1 Tf +(y )Tj +4.622 0 Td +(created )Tj +-39.033 -1.44 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +1.681 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.737 0 Td +(or )Tj +1.292 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.681 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.737 0 Td +(and, )Tj +2.293 0 Td +(thus, )Tj +2.46 0 Td +(the )Tj +1.737 0 Td +(test )Tj +1.848 0 Td +(setup. )Tj +2.886 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.626 0 Td +(is )Tj +1.07 0 Td +(especially )Tj +4.682 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.071 0 Td +(for )Tj +1.57 0 Td +(testing )Tj +3.182 0 Td +(optional, )Tj +-38.364 -1.44 Td +(ambiguous)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.3 0 Td +(or )Tj +/C2_0 1 Tf +1.215 0 Td +<004D0046004B0039004C0041004B005D>Tj +/TT0 1 Tf +(ed )Tj +4.884 0 Td +(dependencies. )Tj +6.477 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.382 0 Td +(ConfigurationProvider)Tj +/TT0 1 Tf +( )Tj +12.928 0 Td +(class )Tj +2.382 0 Td +(relies )Tj +2.604 0 Td +(hea)Tj +1.526 0 Td +(vily )Tj +1.882 0 Td +(on)Tj +( )Tj +-41.088 -1.44 Td +(optional dependencies and w)Tj +12.711 0 Td +(as also tested with )Tj +8.078 0 Td +(Arquillian.)Tj +-18.989 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.45 0 Td +(test )Tj +1.839 0 Td +(class )Tj +/TT1 1 Tf +2.45 0 Td +(ConfigurationIT)Tj +/TT0 1 Tf +( )Tj +9.396 0 Td +(\(\223IT\224 )Tj +2.394 0 Td +(stands )Tj +3.062 0 Td +(for )Tj +1.561 0 Td +(\223Integr)Tj +2.877 0 Td +(ationT)Tj +2.624 0 Td +(est\224\) )Tj +2.283 0 Td +(deplo)Tj +2.434 0 Td +(ys )Tj +1.283 0 Td +(in )Tj +1.228 0 Td +(the )Tj +1.728 0 Td +(method )Tj +/TT1 1 Tf +-38.921 -1.44 Td +(createArchive)Tj +/TT0 1 Tf +(, )Tj +8.452 0 Td +(the )Tj +/TT1 1 Tf +1.707 0 Td +(Configuration)Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +8.452 0 Td +(Configurable)Tj +/TT0 1 Tf +(, )Tj +7.852 0 Td +(and )Tj +1.985 0 Td +(a )Tj +/TT1 1 Tf +0.873 0 Td +(ConfigurationProvider)Tj +/TT0 1 Tf +(. )Tj +-29.32 -1.44 Td +(J)Tj +0.308 0 Td +(a)Tj +0.512 0 Td +(v)Tj +0.518 0 Td +(a )Tj +1.299 0 Td +(E)Tj +0.542 0 Td +(E )Tj +1.299 0 Td +(c)Tj +0.542 0 Td +(o)Tj +0.598 0 Td +(m)Tj +0.875 0 Td +(p)Tj +0.598 0 Td +(o)Tj +0.598 0 Td +(n)Tj +0.598 0 Td +(e)Tj +0.542 0 Td +(n)Tj +0.598 0 Td +(t)Tj +0.32 0 Td +(s )Tj +1.188 0 Td +(a)Tj +0.542 0 Td +(n)Tj +0.598 0 Td +(d)Tj +0.598 0 Td +(, )Tj +1.077 0 Td +(t)Tj +0.32 0 Td +(h)Tj +0.598 0 Td +(e)Tj +0.542 0 Td +(r)Tj +0.375 0 Td +(e)Tj +0.542 0 Td +(f)Tj +0.32 0 Td +(o)Tj +0.598 0 Td +(r)Tj +0.375 0 Td +(e)Tj +0.542 0 Td +(, )Tj +1.077 0 Td +(t)Tj +0.32 0 Td +(h)Tj +0.598 0 Td +(e )Tj +1.299 0 Td +(s)Tj +0.431 0 Td +(i)Tj +0.32 0 Td +(n)Tj +0.598 0 Td +(g)Tj +0.542 0 Td +(l)Tj +0.32 0 Td +(e)Tj +0.542 0 Td +(t)Tj +0.32 0 Td +(o)Tj +0.598 0 Td +(n )Tj +1.355 0 Td +(E)Tj +0.542 0 Td +(J)Tj +0.32 0 Td +(B )Tj +1.41 0 Td +(b)Tj +0.598 0 Td +(e)Tj +0.542 0 Td +(a)Tj +0.542 0 Td +(n)Tj +0.598 0 Td +(s )Tj +/TT1 1 Tf +1.188 0 Td +(C)Tj +0.642 0 Td +(o)Tj +0.642 0 Td +(n)Tj +0.642 0 Td +(f)Tj +0.642 0 Td +(i)Tj +0.642 0 Td +(g)Tj +0.642 0 Td +(u)Tj +0.642 0 Td +(r)Tj +0.642 0 Td +(a)Tj +0.642 0 Td +(b)Tj +0.642 0 Td +(l)Tj +0.642 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.399 0 Td +(a)Tj +0.542 0 Td +(n)Tj +0.598 0 Td +(d)Tj +( )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(Configuration)Tj +/TT0 1 Tf +( )Tj +8.184 0 Td +(are )Tj +1.715 0 Td +(injected )Tj +3.828 0 Td +(directly )Tj +3.605 0 Td +(into )Tj +2.05 0 Td +(the )Tj +/TT1 1 Tf +1.716 0 Td +(ConfigurationIT)Tj +/TT0 1 Tf +( )Tj +9.384 0 Td +(class. )Tj +/TT1 1 Tf +2.716 0 Td +(ConfigurationIT)Tj +/TT0 1 Tf +( )Tj +-33.199 -1.44 Td +(beha)Tj +2.082 0 Td +(v)Tj +0.488 0 Td +(es )Tj +1.292 0 Td +(in )Tj +1.237 0 Td +(the )Tj +1.737 0 Td +(unit )Tj +2.071 0 Td +(test )Tj +1.848 0 Td +(as )Tj +1.292 0 Td +(if )Tj +0.959 0 Td +(it )Tj +0.959 0 Td +(were )Tj +2.514 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.459 0 Td +(to )Tj +1.237 0 Td +(an )Tj +1.459 0 Td +(application )Tj +5.239 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.236 0 Td +(as )Tj +1.292 0 Td +(an )Tj +1.459 0 Td +(EJB )Tj +1.792 0 Td +(beans )Tj +2.904 0 Td +(or )Tj +1.292 0 Td +(CDI)Tj +( )Tj +-40.477 -1.44 Td +(managed bean. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.422 0 Td +(injection )Tj +4.146 0 Td +(of )Tj +1.2 0 Td +(dependent )Tj +4.924 0 Td +(instances )Tj +4.312 0 Td +(is )Tj +1.033 0 Td +(performed )Tj +4.811 0 Td +(before )Tj +3.089 0 Td +(the )Tj +1.7 0 Td +(execution )Tj +4.59 0 Td +(of )Tj +1.2 0 Td +(the )Tj +1.7 0 Td +(test )Tj +1.811 0 Td +(methods, )Tj +-38.254 -1.44 Td +(so )Tj +1.314 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.481 0 Td +(can )Tj +1.925 0 Td +(just )Tj +1.87 0 Td +(w)Tj +0.766 0 Td +(ork )Tj +1.758 0 Td +(with )Tj +2.259 0 Td +(the )Tj +1.703 0 Td +(references )Tj +4.758 0 Td +(because )Tj +3.87 0 Td +(they )Tj +2.203 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.315 0 Td +(be )Tj +1.425 0 Td +(initialized )Tj +4.649 0 Td +(locally )Tj +3.259 0 Td +(in )Tj +/TT1 1 Tf +1.203 0 Td +(@Before)Tj +/TT0 1 Tf +( )Tj +-37.999 -1.44 Td +(methods. )Tj +1.8 -2.24 Td +(T)Tj +0.456 0 Td +(o )Tj +0.886 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.476 0 Td +(ate )Tj +1.608 0 Td +(the )Tj +1.664 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.83 0 Td +(injection )Tj +4.11 0 Td +(for )Tj +1.497 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.775 0 Td +(unit )Tj +1.998 0 Td +(tests )Tj +2.164 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.442 0 Td +(need )Tj +2.442 0 Td +(to )Tj +1.164 0 Td +(declare )Tj +3.46 0 Td +(Arquillian )Tj +4.61 0 Td +(as )Tj +1.219 0 Td +(the )Tj +-40.866 -1.44 Td +(test runner: )Tj +/TT1 1 Tf +(@RunWith\(Arquillian.class\).)Tj +/TT0 1 Tf +1.8 -2.24 Td +(Arquillian )Tj +4.79 0 Td +(is )Tj +1.177 0 Td +(maintained )Tj +5.345 0 Td +(in )Tj +1.344 0 Td +(the )Tj +1.844 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.566 0 Td +(Repository)Tj +4.465 0 Td +(. )Tj +0.714 0 Td +(T)Tj +0.456 0 Td +(o )Tj +1.066 0 Td +(use )Tj +1.955 0 Td +(it )Tj +1.066 0 Td +(with )Tj +2.4 0 Td +(GlassF)Tj +2.816 0 Td +(ish)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.983 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.622 0 Td +(need )Tj +2.622 0 Td +(to )Tj +-41.366 -1.44 Td +(declare a few Ma)Tj +7.416 0 Td +(v)Tj +0.488 0 Td +(en dependencies \(see Listing 66\).)Tj +/TT1 1 Tf +-7.904 -1.79 Td +( )Tj +0 -1.79 TD +( org.glassfish.extras)Tj +0 -1.79 TD +( glassfish-embedded-all)Tj +0 -1.79 TD +( 3.0.1)Tj +T* +( provided)Tj +T* +( )Tj +T* +( )Tj +T* +( org.jboss.arquillian)Tj +T* +( arquillian-junit)Tj +T* +( 1.0.0.Alpha4)Tj +T* +( test)Tj +ET + +endstream +endobj +275 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 277 0 R>>endobj +276 0 obj<>endobj +277 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(116)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2001 Tm +( )Tj +0 -1.79 TD +( )Tj +T* +( org.jboss.arquillian.container)Tj +T* +( arquillian-glassfish-embedded-3)Tj +T* +( 1.0.0.Alpha4)Tj +0 -1.79 TD +( test)Tj +0 -1.79 TD +( )Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 66: Ma)Tj +6.084 0 Td +(v)Tj +0.488 0 Td +(en Declar)Tj +4.211 0 Td +(ation for )Tj +3.854 0 Td +(Arquillian)Tj +-12.837 -2.24 Td +(Arquillian )Tj +4.795 0 Td +(comes )Tj +3.293 0 Td +(with )Tj +2.405 0 Td +(an )Tj +1.571 0 Td +(adapter )Tj +3.738 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(er )Tj +1.348 0 Td +(that )Tj +2.127 0 Td +(abstr)Tj +2.044 0 Td +(acts )Tj +2.182 0 Td +(from )Tj +2.515 0 Td +(a )Tj +1.015 0 Td +(concrete )Tj +4.238 0 Td +(application )Tj +5.351 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +-41.367 -1.44 Td +(implementation. )Tj +7.455 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.601 0 Td +(could )Tj +2.935 0 Td +(run )Tj +1.934 0 Td +(the )Tj +1.823 0 Td +(same )Tj +2.711 0 Td +(test )Tj +1.934 0 Td +(code )Tj +2.601 0 Td +(against )Tj +3.49 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.267 0 Td +(application )Tj +5.325 0 Td +(serv)Tj +1.71 0 Td +(ers )Tj +1.711 0 Td +(just )Tj +1.99 0 Td +(b)Tj +0.538 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(exc)Tj +1.482 0 Td +(hanging a single dependenc)Tj +12.037 0 Td +(y in )Tj +/TT1 1 Tf +(pom.xml)Tj +/TT0 1 Tf +(. )Tj +6.573 0 Td +(T)Tj +0.511 0 Td +(his can be ac)Tj +5.651 0 Td +(hiev)Tj +1.822 0 Td +(ed easily with Ma)Tj +7.584 0 Td +(v)Tj +/C2_0 1 Tf +0.488 0 Td +<003D004600010048004A0047005D>Tj +/TT0 1 Tf +(les.)Tj +-34.348 -2.24 Td +(I )Tj +0.647 0 Td +(tested )Tj +2.87 0 Td +(the )Tj +1.703 0 Td +(injection )Tj +4.149 0 Td +(of )Tj +/TT1 1 Tf +1.203 0 Td +(XRayLogger)Tj +/TT0 1 Tf +( )Tj +6.37 0 Td +(similarly)Tj +3.575 0 Td +(. )Tj +0.61 0 Td +(A )Tj +1.036 0 Td +(class )Tj +/TT1 1 Tf +2.425 0 Td +(LogUser)Tj +/TT0 1 Tf +( )Tj +4.57 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.258 0 Td +(introduced )Tj +5.038 0 Td +(just )Tj +1.87 0 Td +(as )Tj +1.258 0 Td +(an)Tj +( )Tj +-41.144 -1.44 Td +(injection helper for test purposes \(see Listing 67\) but it w)Tj +24.272 0 Td +(as not deplo)Tj +5.269 0 Td +(y)Tj +0.482 0 Td +(ed with the application.)Tj +/TT1 1 Tf +-30.023 -1.79 Td +(public class LogUser {)Tj +0 -1.79 TD +( @Inject)Tj +T* +( private XRayLogger LOG;)Tj +T* +( public boolean isLogInjected\(\){)Tj +T* +( return \(LOG != null\);)Tj +T* +( })Tj +T* +( public XRayLogger getLogger\(\) {)Tj +T* +( return LOG;)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 67: Helper Class for Dependenc)Tj +16.872 0 Td +(y Injection )Tj +4.762 0 Td +(T)Tj +0.456 0 Td +(esting)Tj +-20.29 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.55 0 Td +(LogUser)Tj +/TT0 1 Tf +( )Tj +4.695 0 Td +(class )Tj +2.55 0 Td +(declares )Tj +4.05 0 Td +(an )Tj +/TT1 1 Tf +1.55 0 Td +(XRayLogger)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +6.495 0 Td +<005D>Tj +/TT0 1 Tf +(eld )Tj +2.384 0 Td +(and )Tj +2.106 0 Td +(annotates )Tj +4.607 0 Td +(it )Tj +1.05 0 Td +(with )Tj +/TT1 1 Tf +2.384 0 Td +(@Inject)Tj +/TT0 1 Tf +(. )Tj +4.899 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(injection )Tj +4.261 0 Td +(of )Tj +1.315 0 Td +(the )Tj +1.815 0 Td +(expected )Tj +/TT1 1 Tf +4.371 0 Td +(XRayLogger)Tj +/TT0 1 Tf +( )Tj +6.482 0 Td +(type )Tj +2.315 0 Td +(is )Tj +1.148 0 Td +(v)Tj +/C2_0 1 Tf +0.488 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +(ed )Tj +3.204 0 Td +(in )Tj +1.315 0 Td +(the )Tj +/TT1 1 Tf +1.815 0 Td +(LoggerProducerIT)Tj +/TT0 1 Tf +( )Tj +10.082 0 Td +(test )Tj +1.926 0 Td +(\(see )Tj +-40.533 -1.44 Td +(Listing 68\). )Tj +/TT1 1 Tf +0 -1.79 TD +(@RunWith\(Arquillian.class\))Tj +0 -1.79 TD +(public class LoggerProducerIT {)Tj +0 -1.79 TD +( @Inject)Tj +0 -1.79 TD +( LogUser logUser;)Tj +ET + +endstream +endobj +278 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 279 0 R>>endobj +279 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(117)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( @Inject)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( Configuration configuration;)Tj +0 -1.79 TD +( @Deployment)Tj +T* +( public static JavaArchive createTestArchive\(\) {)Tj +T* +( return ShrinkWrap.create\(JavaArchive.class, )Tj +0 -0.99 TD +("loggerproducer.jar"\).)Tj +0 -1.79 TD +( addClasses\(LogUser.class, LoggerProducer.class, )Tj +0 -0.99 TD +(Configuration.class, ConfigurationProvider.class, )Tj +/TT2 1 Tf +T* +(DebugConfigurationProvider.class)Tj +/TT1 1 Tf +(, DevNullLogger.class, )Tj +T* +(DelegatingLogger.class\).)Tj +0 -1.79 TD +( addManifestResource\()Tj +T* +( new ByteArrayAsset\("".getBytes\(\)\),)Tj +T* +( ArchivePaths.create\("beans.xml"\)\);)Tj +T* +( })Tj +0 -3.58 TD +( @Test)Tj +0 -1.79 TD +( public void logInjected\(\) {)Tj +T* +( assertTrue\(logUser.isLogInjected\(\)\);)Tj +T* +( })Tj +0 -3.58 TD +( @Test)Tj +0 -1.79 TD +( public void loggerNameCorrespondsToClassNameNoDebug\(\) {)Tj +T* +( XRayLogger xRayLogger = logUser.getLogger\(\);)Tj +T* +( assertTrue\(xRayLogger instanceof DelegatingLogger\);)Tj +T* +( Logger logger = xRayLogger.getLogger\(\);)Tj +T* +( String actual = logger.getName\(\);)Tj +T* +( String expected = LogUser.class.getName\(\);)Tj +T* +( assertThat\(actual, is\(expected\)\);)Tj +0 -3.58 TD +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 68: XRa)Tj +6.417 0 Td +(yLogger Injection in an Integr)Tj +12.604 0 Td +(ation )Tj +2.372 0 Td +(T)Tj +0.456 0 Td +(est)Tj +-20.049 -2.24 Td +(Both )Tj +/TT1 1 Tf +2.424 0 Td +(Configuration)Tj +/TT0 1 Tf +( )Tj +8.225 0 Td +(and )Tj +/TT1 1 Tf +2.035 0 Td +(LogUser)Tj +/TT0 1 Tf +( )Tj +4.624 0 Td +(are )Tj +1.756 0 Td +(injected )Tj +3.869 0 Td +(into )Tj +2.091 0 Td +(the )Tj +/TT1 1 Tf +1.757 0 Td +(LoggerProducerIT)Tj +/TT0 1 Tf +( )Tj +10.025 0 Td +(class. )Tj +2.757 0 Td +(In)Tj +( )Tj +ET + +endstream +endobj +280 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 281 0 R>>endobj +281 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(118)Tj +0 Tc 0 Tw -20.132 57.06 Td +(the )Tj +1.826 0 Td +(method )Tj +/TT1 1 Tf +3.771 0 Td +(loggerNameCorrespondsToClassNameNoDebug)Tj +/TT0 1 Tf +(, )Tj +24.174 0 Td +(the )Tj +/C2_0 1 Tf +1.826 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation-dependent )Tj +-35.141 -1.44 Td +(i)Tj +0.313 0 Td +(n)Tj +0.591 0 Td +(j)Tj +0.313 0 Td +(e)Tj +0.535 0 Td +(c)Tj +0.535 0 Td +(t)Tj +0.313 0 Td +(i)Tj +0.313 0 Td +(o)Tj +0.591 0 Td +(n )Tj +1.352 0 Td +(o)Tj +0.591 0 Td +(f )Tj +1.074 0 Td +(t)Tj +0.313 0 Td +(h)Tj +0.591 0 Td +(e )Tj +/TT1 1 Tf +1.296 0 Td +(X)Tj +0.635 0 Td +(R)Tj +0.635 0 Td +(a)Tj +0.635 0 Td +(y)Tj +0.635 0 Td +(L)Tj +0.635 0 Td +(o)Tj +0.635 0 Td +(g)Tj +0.635 0 Td +(g)Tj +0.635 0 Td +(e)Tj +0.635 0 Td +(r)Tj +/TT0 1 Tf +( )Tj +1.396 0 Td +(r)Tj +0.368 0 Td +(e)Tj +0.535 0 Td +(a)Tj +0.535 0 Td +(l)Tj +0.313 0 Td +(i)Tj +0.313 0 Td +(z)Tj +0.535 0 Td +(a)Tj +0.535 0 Td +(t)Tj +0.313 0 Td +(i)Tj +0.313 0 Td +(o)Tj +0.591 0 Td +(n )Tj +1.352 0 Td +(i)Tj +0.313 0 Td +(s )Tj +1.185 0 Td +(v)Tj +0.511 0 Td +(a)Tj +0.535 0 Td +(l)Tj +0.313 0 Td +(i)Tj +0.313 0 Td +(d)Tj +0.591 0 Td +(a)Tj +0.535 0 Td +(t)Tj +0.313 0 Td +(e)Tj +0.535 0 Td +(d)Tj +0.591 0 Td +(. )Tj +1.074 0 Td +(I)Tj +0.313 0 Td +(t )Tj +1.074 0 Td +(i)Tj +0.313 0 Td +(s )Tj +1.185 0 Td +(a)Tj +0.535 0 Td +(n )Tj +1.352 0 Td +(e)Tj +0.535 0 Td +(a)Tj +0.535 0 Td +(s)Tj +0.424 0 Td +(y )Tj +1.296 0 Td +(t)Tj +0.313 0 Td +(a)Tj +0.535 0 Td +(s)Tj +0.424 0 Td +(k )Tj +1.296 0 Td +(b)Tj +0.591 0 Td +(e)Tj +0.535 0 Td +(c)Tj +0.535 0 Td +(a)Tj +0.535 0 Td +(u)Tj +0.591 0 Td +(s)Tj +0.424 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(LoggerProducerIT)Tj +/TT0 1 Tf +( )Tj +9.915 0 Td +(has )Tj +1.758 0 Td +(direct )Tj +2.758 0 Td +(access )Tj +3.091 0 Td +(to )Tj +/TT1 1 Tf +1.147 0 Td +(LogUser)Tj +/TT0 1 Tf +( )Tj +4.514 0 Td +(as )Tj +1.202 0 Td +(well )Tj +2.147 0 Td +(as )Tj +/TT1 1 Tf +1.202 0 Td +(Configuration)Tj +/TT0 1 Tf +(. )Tj +8.392 0 Td +(In )Tj +1.147 0 Td +(the )Tj +1.647 0 Td +(method )Tj +/TT1 1 Tf +-38.921 -1.44 Td +(createTestArchive)Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +10.797 0 Td +(DebugConfigurationProvider)Tj +/TT0 1 Tf +( )Tj +15.919 0 Td +(is )Tj +0.984 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed, )Tj +1.651 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.873 0 Td +(sets )Tj +1.873 0 Td +(the )Tj +1.651 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.151 0 Td +(of )Tj +-41.366 -1.44 Td +(the )Tj +/TT1 1 Tf +(debug)Tj +/TT0 1 Tf +( entry to )Tj +/TT1 1 Tf +(true)Tj +/TT0 1 Tf +( \(see Listing 69\).)Tj +/TT1 1 Tf +1.8 -2.12 Td +(public class DebugConfigurationProvider implements )Tj +-1.8 -1.32 Td +(ConfigurationProvider{)Tj +1.8 -4.24 Td +( @Override)Tj +0 -2.12 TD +( public Map getConfiguration\(\) {)Tj +T* +( return new HashMap\(\){{)Tj +T* +( put\("debug", "true"\);)Tj +T* +( }};)Tj +T* +( })Tj +T* +(})Tj +/C2_0 1 Tf +-1.8 -2.24 Td +<00280041004B004C00410046003F000100130016001700010020003D003A004D003F0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +11.605 0 Td +(ation Helper)Tj +-9.805 -2.24 Td +(Also)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +2.544 0 Td +(DebugConfigurationProvider )Tj +/TT0 1 Tf +16.328 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.293 0 Td +(dev)Tj +1.544 0 Td +(eloped )Tj +3.35 0 Td +(exclusi)Tj +2.983 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.682 0 Td +(for )Tj +1.571 0 Td +(test )Tj +1.849 0 Td +(purposes. )Tj +4.443 0 Td +(T)Tj +0.511 0 Td +(he)Tj +( )Tj +-41.144 -1.44 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.386 0 Td +(code )Tj +2.498 0 Td +(resides )Tj +3.331 0 Td +(in )Tj +/TT1 1 Tf +1.22 0 Td +(src/test/java)Tj +/TT0 1 Tf +( )Tj +8.187 0 Td +(and )Tj +1.998 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.275 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.442 0 Td +(only )Tj +2.276 0 Td +(into )Tj +2.054 0 Td +(the )Tj +1.72 0 Td +(test )Tj +1.831 0 Td +(en)Tj +1.044 0 Td +(vironment, )Tj +5.054 0 Td +(not )Tj +-40.81 -1.44 Td +(production. )Tj +5.329 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.438 0 Td +(Arquillian, )Tj +4.921 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.475 0 Td +(can )Tj +1.919 0 Td +(selecti)Tj +2.705 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.641 0 Td +(deplo)Tj +2.434 0 Td +(y )Tj +0.863 0 Td +(classes )Tj +3.308 0 Td +(in )Tj +1.197 0 Td +(the )Tj +1.697 0 Td +(setup )Tj +2.642 0 Td +(phase )Tj +2.864 0 Td +(of )Tj +1.197 0 Td +(a )Tj +0.863 0 Td +(unit )Tj +2.031 0 Td +(test,)Tj +( )Tj +-40.477 -1.44 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.917 0 Td +(makes )Tj +3.083 0 Td +(the )Tj +1.695 0 Td +(testing )Tj +3.14 0 Td +(of )Tj +1.195 0 Td +(ad)Tj +1.032 0 Td +(v)Tj +0.476 0 Td +(anced )Tj +2.973 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.861 0 Td +(injection )Tj +4.141 0 Td +(possible. )Tj +4.067 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.417 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.028 0 Td +(of )Tj +/C2_0 1 Tf +1.195 0 Td +<004D0046004B0039004C0041004B005D>Tj +/TT0 1 Tf +(ed )Tj +-37.642 -1.44 Td +(or )Tj +1.17 0 Td +(ambiguous )Tj +5.005 0 Td +(dependencies )Tj +6.228 0 Td +(is )Tj +0.948 0 Td +(easily )Tj +2.726 0 Td +(testable. )Tj +3.764 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.17 0 Td +(is )Tj +0.948 0 Td +(one )Tj +1.893 0 Td +(ca)Tj +0.97 0 Td +(v)Tj +0.488 0 Td +(eat )Tj +1.559 0 Td +(with )Tj +2.171 0 Td +(this )Tj +1.782 0 Td +(approac)Tj +3.483 0 Td +(h. )Tj +1.041 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.337 0 Td +(creation )Tj +-38.699 -1.44 Td +(of )Tj +1.129 0 Td +(the )Tj +1.629 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hi)Tj +0.816 0 Td +(v)Tj +0.488 0 Td +(e, )Tj +1.073 0 Td +(as )Tj +1.184 0 Td +(well )Tj +2.129 0 Td +(as )Tj +1.184 0 Td +(the )Tj +1.629 0 Td +(deplo)Tj +2.434 0 Td +(yment)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.212 0 Td +(happens )Tj +3.908 0 Td +(once )Tj +2.407 0 Td +(for )Tj +1.462 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.851 0 Td +(test )Tj +1.74 0 Td +(class. )Tj +2.629 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.184 0 Td +(tests )Tj +2.129 0 Td +(with )Tj +2.185 0 Td +(different)Tj +( )Tj +-38.643 -1.44 Td +(setups )Tj +3.139 0 Td +(\(suc)Tj +1.705 0 Td +(h )Tj +1.027 0 Td +(as )Tj +1.36 0 Td +(testing )Tj +3.25 0 Td +(different )Tj +/TT1 1 Tf +4.028 0 Td +(ConfigurationProviders)Tj +/TT0 1 Tf +(\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +14.201 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.583 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.971 0 Td +(to )Tj +1.305 0 Td +(create )Tj +3.082 0 Td +(a )Tj +0.971 0 Td +(unit )Tj +2.139 0 Td +(test)Tj +( )Tj +-40.755 -1.44 Td +(class for eac)Tj +5.261 0 Td +(h deplo)Tj +3.268 0 Td +(yment unit with a different set of classes.)Tj +/TT3 1 Tf +12 0 0 12 57 166.0002 Tm +(Accidental P)Tj +5.457 0 Td +(erformance Impro)Tj +7.971 0 Td +(v)Tj +0.488 0 Td +(ement of F)Tj +4.594 0 Td +(actor 250)Tj +/TT0 1 Tf +10 0 0 10 75 143.6003 Tm +(W)Tj +1.252 0 Td +(a)Tj +0.789 0 Td +(t)Tj +0.567 0 Td +(c)Tj +0.771 0 Td +(h)Tj +0.845 0 Td +(i)Tj +0.567 0 Td +(n)Tj +0.845 0 Td +(g )Tj +5.419 0 Td +(t)Tj +0.567 0 Td +(h)Tj +0.845 0 Td +(e )Tj +5.419 0 Td +(m)Tj +1.122 0 Td +(o)Tj +0.845 0 Td +(n)Tj +0.845 0 Td +(i)Tj +0.567 0 Td +(t)Tj +0.567 0 Td +(o)Tj +0.845 0 Td +(r)Tj +0.622 0 Td +(i)Tj +0.567 0 Td +(n)Tj +0.845 0 Td +(g )Tj +5.419 0 Td +(o)Tj +0.845 0 Td +(u)Tj +0.845 0 Td +(t)Tj +0.567 0 Td +(p)Tj +0.845 0 Td +(u)Tj +0.845 0 Td +(t )Tj +5.197 0 Td +(o)Tj +0.845 0 Td +(f )Tj +/TT1 1 Tf +-41.922 -1.44 Td +(c)Tj +0.603 0 Td +(o)Tj +0.603 0 Td +(m)Tj +0.603 0 Td +(.)Tj +0.603 0 Td +(a)Tj +0.603 0 Td +(b)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(.)Tj +0.603 0 Td +(x)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(a)Tj +0.603 0 Td +(y)Tj +0.603 0 Td +(.)Tj +0.603 0 Td +(b)Tj +0.603 0 Td +(u)Tj +0.603 0 Td +(s)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(s)Tj +0.603 0 Td +(s)Tj +0.603 0 Td +(.)Tj +0.603 0 Td +(m)Tj +0.603 0 Td +(o)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(o)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(g)Tj +0.603 0 Td +(.)Tj +0.603 0 Td +(P)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(f)Tj +0.603 0 Td +(o)Tj +0.603 0 Td +(r)Tj +0.603 0 Td +(m)Tj +0.603 0 Td +(a)Tj +0.603 0 Td +(n)Tj +0.603 0 Td +(c)Tj +0.603 0 Td +(e)Tj +0.603 0 Td +(A)Tj +0.603 0 Td +(u)Tj +0.603 0 Td +(d)Tj +0.603 0 Td +(i)Tj +0.603 0 Td +(t)Tj +0.603 0 Td +(o)Tj +0.603 0 Td +(r)Tj +/TT0 1 Tf +0.603 0 Td +(, )Tj +1.057 0 Td +(I )Tj +1.057 0 Td +(n)Tj +0.559 0 Td +(o)Tj +0.559 0 Td +(t)Tj +0.281 0 Td +(i)Tj +0.281 0 Td +(c)Tj +0.503 0 Td +(e)Tj +0.503 0 Td +(d )Tj +1.335 0 Td +(t)Tj +0.281 0 Td +(h)Tj +0.559 0 Td +(e )Tj +1.279 0 Td +(p)Tj +0.559 0 Td +(o)Tj +0.559 0 Td +(o)Tj +0.559 0 Td +(r )Tj +-41.867 -1.44 Td +(p)Tj +0.649 0 Td +(e)Tj +0.593 0 Td +(r)Tj +0.426 0 Td +(f)Tj +0.371 0 Td +(o)Tj +0.649 0 Td +(r)Tj +0.426 0 Td +(m)Tj +0.926 0 Td +(a)Tj +0.593 0 Td +(n)Tj +0.649 0 Td +(c)Tj +0.593 0 Td +(e )Tj +1.325 0 Td +(o)Tj +0.649 0 Td +(f )Tj +1.103 0 Td +(t)Tj +0.371 0 Td +(h)Tj +0.649 0 Td +(e )Tj +1.325 0 Td +(f)Tj +0.371 0 Td +(o)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 180.1885 114.8002 Tm +(l)Tj +0.371 0 Td +(l)Tj +0.371 0 Td +(o)Tj +0.637 0 Td +(w)Tj +0.871 0 Td +(i)Tj +0.371 0 Td +(n)Tj +0.649 0 Td +(g )Tj +1.325 0 Td +(m)Tj +0.926 0 Td +(e)Tj +0.593 0 Td +(t)Tj +0.371 0 Td +(h)Tj +0.649 0 Td +(o)Tj +0.649 0 Td +(d)Tj +0.649 0 Td +(s)Tj +0.482 0 Td +(: )Tj +/TT1 1 Tf +1.103 0 Td +(H)Tj +0.693 0 Td +(i)Tj +0.693 0 Td +(t)Tj +0.693 0 Td +(s)Tj +0.693 0 Td +(.)Tj +0.693 0 Td +(p)Tj +0.693 0 Td +(e)Tj +0.693 0 Td +(r)Tj +0.693 0 Td +(s)Tj +0.693 0 Td +(i)Tj +0.693 0 Td +(s)Tj +0.693 0 Td +(t)Tj +0.693 0 Td +(R)Tj +0.693 0 Td +(e)Tj +0.693 0 Td +(f)Tj +0.693 0 Td +(e)Tj +0.693 0 Td +(r)Tj +0.693 0 Td +(e)Tj +0.693 0 Td +(r)Tj +0.693 0 Td +(s)Tj +0.693 0 Td +(C)Tj +0.693 0 Td +(a)Tj +0.693 0 Td +(c)Tj +0.693 0 Td +(h)Tj +0.693 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.425 0 Td +(a)Tj +0.593 0 Td +(n)Tj +0.649 0 Td +(d)Tj +( )Tj +/TT1 1 Tf +-41.644 -1.44 Td +(Hits.persistHitsCache)Tj +/TT0 1 Tf +(. )Tj +13.517 0 Td +(T)Tj +0.511 0 Td +(heir )Tj +2.378 0 Td +(execution )Tj +4.935 0 Td +(took )Tj +2.601 0 Td +(around )Tj +3.768 0 Td +(50 )Tj +1.823 0 Td +(seconds )Tj +4.157 0 Td +(in )Tj +1.545 0 Td +(contr)Tj +2.211 0 Td +(ast )Tj +1.878 0 Td +(to )Tj +1.545 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(remaining methods\222 performance, w)Tj +15.597 0 Td +(hic)Tj +1.316 0 Td +(h w)Tj +1.594 0 Td +(as belo)Tj +3.045 0 Td +(w 20 ms. )Tj +ET + +endstream +endobj +282 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 283 0 R>>endobj +283 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(119)Tj +0 Tc 0 Tw -18.332 57.06 Td +(Ho)Tj +1.322 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.636 0 Td +(both )Tj +2.304 0 Td +(critical )Tj +3.303 0 Td +(methods )Tj +4.026 0 Td +(were )Tj +2.469 0 Td +(executed )Tj +4.248 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +/C2_0 1 Tf +1.691 0 Td +<005D>Tj +/TT0 1 Tf +(v)Tj +1.044 0 Td +(e )Tj +0.858 0 Td +(minutes )Tj +3.748 0 Td +(sequentially)Tj +5.077 0 Td +(. )Tj +0.636 0 Td +(Furthermore)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-36.672 -1.44 Td +(the )Tj +1.882 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.048 0 Td +(design )Tj +3.327 0 Td +(ensured )Tj +3.938 0 Td +(that )Tj +2.16 0 Td +(there )Tj +2.715 0 Td +(were )Tj +2.659 0 Td +(no )Tj +1.66 0 Td +(other )Tj +2.771 0 Td +(par)Tj +1.377 0 Td +(allel )Tj +2.382 0 Td +(writers )Tj +3.437 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.048 0 Td +(at )Tj +1.326 0 Td +(the )Tj +1.882 0 Td +(same )Tj +2.77 0 Td +(time. )Tj +-40.033 -1.44 Td +(Async)Tj +2.594 0 Td +(hronous )Tj +4.083 0 Td +(execution )Tj +4.805 0 Td +(of )Tj +1.415 0 Td +(these )Tj +2.804 0 Td +(methods )Tj +4.249 0 Td +(initiated )Tj +4.083 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.081 0 Td +(a )Tj +1.081 0 Td +(timer )Tj +2.803 0 Td +(makes )Tj +3.303 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.137 0 Td +(slo)Tj +1.211 0 Td +(w )Tj +1.359 0 Td +(execution )Tj +-37.976 -1.44 Td +(absolutely )Tj +4.979 0 Td +(acceptable. )Tj +5.534 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.088 0 Td +(is )Tj +1.255 0 Td +(storing )Tj +3.478 0 Td +(its )Tj +1.533 0 Td +(state )Tj +2.533 0 Td +(in )Tj +1.422 0 Td +(the )Tj +1.922 0 Td +(Hypersonic )Tj +5.534 0 Td +(\(hsqldb\) )Tj +4.035 0 Td +(database )Tj +4.367 0 Td +(\()Tj +(http://)Tj +-39.42 -1.44 Td +(hsqldb.org)Tj +(\) in unoptimized \223T)Tj +12.851 0 Td +(ext\224 tables \()Tj +(http://www)Tj +9.819 0 Td +(.hsqldb.org/doc/guide/c)Tj +10.154 0 Td +(h06.html)Tj +(\). )Tj +-31.024 -2.24 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.789 0 Td +(had )Tj +1.901 0 Td +(to )Tj +1.123 0 Td +(update )Tj +3.235 0 Td +(a )Tj +0.789 0 Td +(few )Tj +1.845 0 Td +(thousand )Tj +4.236 0 Td +(hits )Tj +1.79 0 Td +(and )Tj +1.901 0 Td +(about )Tj +2.735 0 Td +(50 )Tj +1.401 0 Td +(thousand )Tj +4.236 0 Td +(referers )Tj +3.455 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +/C2_0 1 Tf +1.622 0 Td +<005D>Tj +/TT0 1 Tf +(v)Tj +1.044 0 Td +(e )Tj +0.789 0 Td +(minutes. )Tj +3.957 0 Td +(In )Tj +-41.366 -1.44 Td +(this )Tj +1.972 0 Td +(context)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.889 0 Td +(the )Tj +1.805 0 Td +(performance )Tj +5.916 0 Td +(is )Tj +1.138 0 Td +(not )Tj +1.861 0 Td +(that )Tj +2.083 0 Td +(bad. )Tj +2.361 0 Td +(Nev)Tj +1.766 0 Td +(ertheless)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.444 0 Td +(long )Tj +2.361 0 Td +(tr)Tj +0.599 0 Td +(ansactions )Tj +4.973 0 Td +(w)Tj +0.76 0 Td +(hose )Tj +2.472 0 Td +(length )Tj +3.139 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(dependent )Tj +4.918 0 Td +(on )Tj +1.472 0 Td +(the )Tj +1.694 0 Td +(total )Tj +2.25 0 Td +(number )Tj +3.694 0 Td +(of )Tj +1.194 0 Td +(records )Tj +3.527 0 Td +(might )Tj +2.805 0 Td +(cause )Tj +2.805 0 Td +(trouble )Tj +3.417 0 Td +(in )Tj +1.194 0 Td +(the )Tj +1.694 0 Td +(long )Tj +2.25 0 Td +(run. )Tj +2.009 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansactions )Tj +4.862 0 Td +(that )Tj +-40.588 -1.44 Td +(are )Tj +1.617 0 Td +(too )Tj +1.674 0 Td +(long )Tj +2.174 0 Td +(lead )Tj +2.118 0 Td +(to )Tj +1.118 0 Td +(timeouts )Tj +3.952 0 Td +(and)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.146 0 Td +(thus, )Tj +2.341 0 Td +(rollbac)Tj +2.983 0 Td +(ks, )Tj +1.451 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.84 0 Td +(could )Tj +2.73 0 Td +(lead )Tj +2.118 0 Td +(to )Tj +1.118 0 Td +(data )Tj +2.118 0 Td +(loss. )Tj +2.137 0 Td +(At )Tj +1.229 0 Td +(the )Tj +1.618 0 Td +(same )Tj +2.506 0 Td +(time)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-40.061 -1.44 Td +(it )Tj +0.981 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.371 0 Td +(be )Tj +1.481 0 Td +(interesting )Tj +4.871 0 Td +(to )Tj +1.259 0 Td +(kno)Tj +1.6 0 Td +(w )Tj +1.203 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.203 0 Td +(man)Tj +1.871 0 Td +(y )Tj +0.925 0 Td +(records )Tj +3.592 0 Td +(are )Tj +1.758 0 Td +(cac)Tj +1.482 0 Td +(hed )Tj +2.037 0 Td +(and )Tj +2.037 0 Td +(become )Tj +3.87 0 Td +(dirty )Tj +2.37 0 Td +(between )Tj +4.093 0 Td +(the )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<005E>Tj +/TT0 1 Tf +(ushes.)Tj +1.8 -2.24 Td +(I )Tj +0.568 0 Td +(met )Tj +1.901 0 Td +(both )Tj +2.236 0 Td +(requirements )Tj +5.902 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.79 0 Td +(adding )Tj +3.236 0 Td +(an )Tj +1.346 0 Td +(additional )Tj +4.626 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(er )Tj +1.123 0 Td +(of )Tj +1.124 0 Td +(indirection )Tj +4.959 0 Td +(and )Tj +1.902 0 Td +(introducing )Tj +5.237 0 Td +(the )Tj +1.624 0 Td +(class )Tj +/TT2 1 Tf +-40.144 -1.44 Td +(HitsCache)Tj +/TT0 1 Tf +(. )Tj +6.005 0 Td +(I )Tj +0.604 0 Td +(factored )Tj +3.827 0 Td +(out )Tj +1.716 0 Td +(the )Tj +1.66 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.382 0 Td +(previously )Tj +4.772 0 Td +(maintained )Tj +5.161 0 Td +(in )Tj +1.16 0 Td +(the )Tj +/TT2 1 Tf +1.66 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.727 0 Td +(singleton )Tj +4.217 0 Td +(EJB )Tj +1.715 0 Td +(bean )Tj +2.438 0 Td +(into )Tj +-40.532 -1.44 Td +(a dedicated )Tj +/TT2 1 Tf +(HitsCache)Tj +/TT0 1 Tf +( \(see Listing 70\). )Tj +/TT2 1 Tf +0 -1.79 TD +(public class HitsCache {)Tj +T* +( private ConcurrentHashMap hits = null;)Tj +T* +( private ConcurrentSkipListSet dirtyKeys;)Tj +0 -3.58 TD +( public HitsCache\(Map hits\) {)Tj +0 -1.79 TD +( this.hits = new ConcurrentHashMap\(hits\);)Tj +0 -1.79 TD +( this.dirtyKeys = new ConcurrentSkipListSet\(\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public HitsCache\(\) {)Tj +0 -1.79 TD +( this\(new HashMap\(\)\);)Tj +T* +( })Tj +0 -3.58 TD +( public long increase\(String uniqueAction\){)Tj +0 -1.79 TD +( this.dirtyKeys.add\(uniqueAction\);)Tj +T* +( hits.putIfAbsent\(uniqueAction, new AtomicLong\(\)\);)Tj +T* +( AtomicLong hitCount = hits.get\(uniqueAction\);)Tj +T* +( return hitCount.incrementAndGet\(\);)Tj +0 -1.79 TD +( })Tj +ET + +endstream +endobj +284 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 285 0 R>>endobj +285 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(120)Tj +/TT1 1 Tf +0 Tc 0 Tw -20.132 55.72 Td +( public ConcurrentHashMap getCache\(\) {)Tj +0 -1.79 TD +( return hits;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public Map getChangedEntriesAndClear\(\) {)Tj +0 -1.79 TD +( Map changedValues = new HashMap\(\);)Tj +0 -1.79 TD +( for \(String dirtyKey : dirtyKeys\) {)Tj +T* +( dirtyKeys.remove\(dirtyKey\);)Tj +T* +( changedValues.put\(dirtyKey, hits.get\(dirtyKey\)\);)Tj +T* +( })Tj +T* +( return changedValues;)Tj +T* +( })Tj +0 -3.58 TD +( public int getCacheSize\(\){)Tj +0 -1.79 TD +( return this.hits.size\(\);)Tj +T* +( })Tj +0 -3.58 TD +( public int getDirtyEntriesCount\(\){)Tj +0 -1.79 TD +( return this.dirtyKeys.size\(\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public void clear\(\) {)Tj +0 -1.79 TD +( hits.clear\(\);)Tj +T* +( dirtyKeys.clear\(\);)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 70: Encapsulation of the Cac)Tj +15.379 0 Td +(he and Dirty Detection)Tj +-13.579 -2.24 Td +(Also, )Tj +2.723 0 Td +(with )Tj +2.445 0 Td +(the )Tj +1.889 0 Td +(encapsulation )Tj +6.558 0 Td +(of )Tj +1.389 0 Td +(the )Tj +1.889 0 Td +(hits )Tj +2.056 0 Td +(and )Tj +2.167 0 Td +(referers )Tj +3.721 0 Td +(cac)Tj +1.482 0 Td +(hes )Tj +2 0 Td +(into )Tj +2.223 0 Td +(dedicated )Tj +4.779 0 Td +(classes)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.75 0 Td +(the )Tj +-40.866 -1.44 Td +(complexity )Tj +5.172 0 Td +(of )Tj +1.227 0 Td +(the )Tj +/TT1 1 Tf +1.727 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.793 0 Td +(class )Tj +2.449 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.282 0 Td +(slightly )Tj +3.45 0 Td +(reduced. )Tj +4.135 0 Td +(After )Tj +2.449 0 Td +(the )Tj +1.727 0 Td +(refactoring, )Tj +/TT1 1 Tf +5.283 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.793 0 Td +(delegates )Tj +4.394 0 Td +(to )Tj +1.227 0 Td +(the )Tj +-40.866 -1.44 Td +(cac)Tj +1.482 0 Td +(he implementation \(see Listing 71\).)Tj +ET + +endstream +endobj +286 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 288 0 R>>endobj +287 0 obj<>endobj +288 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(121)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +(public class Hits{)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +(\205)Tj +0 -1.79 TD +( long storeHitStatistics\(String uniqueAction\) {)Tj +T* +( return this.hitStatistics.increase\(uniqueAction\);)Tj +T* +( })Tj +T* +( public void persistHitsCache\(\) {)Tj +/TT2 1 Tf +T* +( hitStore.store\(hitStatistics.getChangedEntriesAndClear\(\)\);)Tj +/TT1 1 Tf +T* +( })Tj +T* +(\205)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 71: P)Tj +5.236 0 Td +(ersisting the Dirty Hits)Tj +-3.436 -2.24 Td +(Instead )Tj +3.41 0 Td +(of )Tj +1.187 0 Td +(updating )Tj +4.133 0 Td +(all )Tj +1.409 0 Td +(entries )Tj +3.187 0 Td +(and )Tj +1.965 0 Td +(relying )Tj +3.298 0 Td +(on )Tj +1.465 0 Td +(the )Tj +1.687 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +/C2_0 1 Tf +1.02 0 Td +<0041004500480044003D0045003D0046004C0039004C004100470046000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +10.745 0 Td +(optimizations, )Tj +-36.086 -1.44 Td +(only )Tj +2.196 0 Td +(the )Tj +1.64 0 Td +(c)Tj +0.482 0 Td +(hanged )Tj +3.474 0 Td +(entries )Tj +3.14 0 Td +(computed )Tj +4.641 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.806 0 Td +(the )Tj +1.64 0 Td +(cac)Tj +1.482 0 Td +(hes )Tj +1.751 0 Td +(are )Tj +1.639 0 Td +(passed )Tj +3.196 0 Td +(to )Tj +/TT1 1 Tf +1.14 0 Td +(EntityManager)Tj +/TT0 1 Tf +(. )Tj +8.311 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.529 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(ed )Tj +-41.144 -1.44 Td +(t)Tj +0.339 0 Td +(h)Tj +0.617 0 Td +(e )Tj +1.309 0 Td +(p)Tj +0.617 0 Td +(e)Tj +0.561 0 Td +(r)Tj +0.394 0 Td +(f)Tj +0.339 0 Td +(o)Tj +0.617 0 Td +(r)Tj +0.394 0 Td +(m)Tj +0.894 0 Td +(a)Tj +0.561 0 Td +(n)Tj +0.617 0 Td +(c)Tj +0.561 0 Td +(e )Tj +1.309 0 Td +(d)Tj +0.617 0 Td +(r)Tj +0.382 0 Td +(a)Tj +0.561 0 Td +(m)Tj +0.894 0 Td +(a)Tj +0.561 0 Td +(t)Tj +0.339 0 Td +(i)Tj +0.339 0 Td +(c)Tj +0.561 0 Td +(a)Tj +0.561 0 Td +(l)Tj +0.339 0 Td +(l)Tj +0.339 0 Td +(y)Tj +0.469 0 Td +(. )Tj +1.087 0 Td +(E)Tj +0.561 0 Td +(v)Tj +0.549 0 Td +(e)Tj +0.561 0 Td +(n )Tj +1.365 0 Td +(d)Tj +0.617 0 Td +(u)Tj +0.617 0 Td +(r)Tj +0.394 0 Td +(i)Tj +0.339 0 Td +(n)Tj +0.617 0 Td +(g )Tj +1.309 0 Td +(p)Tj +0.617 0 Td +(e)Tj +0.561 0 Td +(a)Tj +0.561 0 Td +(k)Tj +0.561 0 Td +(s)Tj +/TT3 1 Tf +0.45 0 Td +(,)Tj +/TT0 1 Tf +( )Tj +1.059 0 Td +(t)Tj +0.339 0 Td +(h)Tj +0.617 0 Td +(e )Tj +1.309 0 Td +(s)Tj +0.45 0 Td +(l)Tj +0.339 0 Td +(o)Tj +0.605 0 Td +(w)Tj +0.839 0 Td +(e)Tj +0.561 0 Td +(s)Tj +0.45 0 Td +(t )Tj +1.087 0 Td +(e)Tj +0.561 0 Td +(x)Tj +0.561 0 Td +(e)Tj +0.561 0 Td +(c)Tj +0.561 0 Td +(u)Tj +0.617 0 Td +(t)Tj +0.339 0 Td +(i)Tj +0.339 0 Td +(o)Tj +0.617 0 Td +(n )Tj +1.365 0 Td +(o)Tj +0.617 0 Td +(f )Tj +1.087 0 Td +(t)Tj +0.339 0 Td +(h)Tj +0.617 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(Hits.persistReferersCache)Tj +/TT0 1 Tf +( )Tj +15.712 0 Td +(and )Tj +/TT1 1 Tf +2.322 0 Td +(Hits.persistHitsCache)Tj +/TT0 1 Tf +( )Tj +13.312 0 Td +(methods )Tj +4.378 0 Td +(took )Tj +2.6 0 Td +(173 )Tj +2.378 0 Td +(ms, )Tj +-40.7 -1.44 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h is about 250 times faster than the unoptimized v)Tj +21.554 0 Td +(ersion. )Tj +-21.83 -2.24 Td +(According )Tj +4.764 0 Td +(to )Tj +1.152 0 Td +(the )Tj +1.652 0 Td +(follo)Tj +1.934 0 Td +(wing )Tj +2.43 0 Td +(Donald )Tj +3.542 0 Td +(Knuth )Tj +2.875 0 Td +(quote )Tj +2.764 0 Td +(\()Tj +(http://en.wikiquote.org/wiki/Donald_Knuth)Tj +(\), )Tj +-22.912 -1.44 Td +(this )Tj +1.924 0 Td +(optimization )Tj +5.87 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.312 0 Td +(not )Tj +1.813 0 Td +(dri)Tj +1.149 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.479 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.923 0 Td +(the )Tj +1.757 0 Td +(need )Tj +2.535 0 Td +(for )Tj +1.59 0 Td +(premature )Tj +4.812 0 Td +(performance )Tj +5.868 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(ement, )Tj +3.368 0 Td +(but )Tj +1.813 0 Td +(for )Tj +-41.033 -1.44 Td +(monitoring.)Tj +1.8 -2.24 Td +(\223)Tj +/TT4 1 Tf +(W)Tj +1.351 0 Td +(e )Tj +1.23 0 Td +(should )Tj +3.602 0 Td +(forget )Tj +3.193 0 Td +(about )Tj +3.212 0 Td +(small )Tj +/C2_1 1 Tf +2.934 0 Td +<00270028003F>Tj +/TT4 1 Tf +(ciencies, )Tj +5.731 0 Td +(sa)Tj +0.859 0 Td +(y )Tj +1.23 0 Td +(about )Tj +3.212 0 Td +(97% )Tj +2.842 0 Td +(of )Tj +1.564 0 Td +(the )Tj +2.082 0 Td +(time: )Tj +2.933 0 Td +(premature )Tj +-37.775 -1.44 Td +(optimization is the root of all evil. )Tj +14.543 0 Td +(Y)Tj +0.445 0 Td +(et we should not pass up our opportunities in that critical 3%.)Tj +/TT0 1 Tf +(\224 )Tj +-13.188 -2.24 Td +(T)Tj +0.456 0 Td +(o )Tj +0.875 0 Td +(be )Tj +1.375 0 Td +(able )Tj +2.154 0 Td +(to )Tj +1.153 0 Td +(monitor )Tj +3.709 0 Td +(the )Tj +1.653 0 Td +(cac)Tj +1.482 0 Td +(hes, )Tj +2.043 0 Td +(they )Tj +2.154 0 Td +(had )Tj +1.932 0 Td +(to )Tj +1.153 0 Td +(be )Tj +1.375 0 Td +(better )Tj +2.765 0 Td +(encapsulated. )Tj +6.229 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.431 0 Td +(the )Tj +1.653 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.043 0 Td +(of)Tj +( )Tj +-41.366 -1.44 Td +(the )Tj +1.916 0 Td +(\223deltas\224 )Tj +3.971 0 Td +(between )Tj +4.25 0 Td +(the )Tj +/C2_0 1 Tf +1.916 0 Td +<005E>Tj +/TT0 1 Tf +(ushes)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.778 0 Td +(the )Tj +1.916 0 Td +(optimization )Tj +6.029 0 Td +(turned )Tj +3.361 0 Td +(out )Tj +1.972 0 Td +(to )Tj +1.416 0 Td +(be )Tj +1.638 0 Td +(a )Tj +1.082 0 Td +(one-liner)Tj +3.816 0 Td +(. )Tj +0.86 0 Td +(Here)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.943 0 Td +(the )Tj +-40.866 -1.44 Td +(performance gain w)Tj +8.595 0 Td +(as more of an accident than an intention. )Tj +-6.795 -2.24 Td +(Introducing )Tj +5.384 0 Td +(cac)Tj +1.482 0 Td +(hes )Tj +1.882 0 Td +(without )Tj +3.717 0 Td +(measuring )Tj +4.882 0 Td +(the )Tj +1.771 0 Td +(performance )Tj +5.882 0 Td +(is )Tj +1.104 0 Td +(dangerous. )Tj +5.161 0 Td +(Cac)Tj +1.649 0 Td +(hes )Tj +1.882 0 Td +(are )Tj +1.77 0 Td +(accessed )Tj +-38.366 -1.44 Td +(concurrently)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.051 0 Td +(and )Tj +1.967 0 Td +(they )Tj +2.189 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.855 0 Td +(to )Tj +1.189 0 Td +(store )Tj +2.411 0 Td +(entries )Tj +3.189 0 Td +(for )Tj +1.522 0 Td +(faster )Tj +2.633 0 Td +(access. )Tj +3.337 0 Td +(T)Tj +0.511 0 Td +(hey )Tj +1.911 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.855 0 Td +(to )Tj +1.189 0 Td +(maintain )Tj +4.134 0 Td +(consistenc)Tj +4.478 0 Td +(y)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-41.45 -1.44 Td +(and )Tj +2.027 0 Td +(they )Tj +2.249 0 Td +(also )Tj +2.138 0 Td +(need )Tj +2.527 0 Td +(to )Tj +1.249 0 Td +(deal )Tj +2.249 0 Td +(with )Tj +2.305 0 Td +(memory )Tj +3.97 0 Td +(consumption )Tj +/C2_0 1 Tf +6.029 0 Td +<003D003E005D>Tj +/TT0 1 Tf +(ciently)Tj +4.132 0 Td +(. )Tj +0.693 0 Td +(In )Tj +1.249 0 Td +(fact)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.221 0 Td +(nai)Tj +1.316 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.693 0 Td +(implemented )Tj +-36.532 -1.44 Td +(custom cac)Tj +4.872 0 Td +(hes often introduce loc)Tj +9.876 0 Td +(king and memory issues.)Tj +ET + +endstream +endobj +289 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 290 0 R>>endobj +290 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(122)Tj +ET + +endstream +endobj +291 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 292 0 R>>endobj +292 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(123)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624.0002 Tm +(X-r)Tj +1.321 0 Td +(a)Tj +0.47 0 Td +(y Consumer Client )Tj +64 0 0 64 443.416 539.8002 Tm +(5)Tj +/TT0 1 Tf +10 0 0 10 75 440.2002 Tm +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.833 0 Td +(services )Tj +3.722 0 Td +(were )Tj +2.444 0 Td +(built )Tj +2.279 0 Td +(as )Tj +1.222 0 Td +(a )Tj +0.833 0 Td +(quic)Tj +1.872 0 Td +(k )Tj +0.833 0 Td +(hac)Tj +1.538 0 Td +(k )Tj +0.833 0 Td +(to )Tj +1.167 0 Td +(w)Tj +0.76 0 Td +(atc)Tj +1.26 0 Td +(h )Tj +0.889 0 Td +(some )Tj +2.611 0 Td +(str)Tj +0.988 0 Td +(ange )Tj +2.389 0 Td +(acti)Tj +1.538 0 Td +(vities )Tj +2.556 0 Td +(on )Tj +1.445 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.833 0 Td +(blog )Tj +2.223 0 Td +(in )Tj +1.167 0 Td +(real)Tj +( )Tj +-40.589 -1.44 Td +(time. )Tj +2.521 0 Td +(It )Tj +0.91 0 Td +(turned )Tj +3.133 0 Td +(out )Tj +1.744 0 Td +(that )Tj +1.966 0 Td +(the )Tj +1.688 0 Td +(majority )Tj +3.91 0 Td +(of )Tj +1.188 0 Td +(all )Tj +1.41 0 Td +(statistics )Tj +3.911 0 Td +(might )Tj +2.799 0 Td +(also )Tj +2.077 0 Td +(be )Tj +1.41 0 Td +(interesting )Tj +4.8 0 Td +(for )Tj +1.521 0 Td +(the )Tj +1.688 0 Td +(blog )Tj +2.244 0 Td +(visitors. )Tj +-38.921 -1.44 Td +(So, )Tj +1.649 0 Td +(I )Tj +0.593 0 Td +(introduced )Tj +4.984 0 Td +(an )Tj +1.371 0 Td +(additional )Tj +4.651 0 Td +(REST )Tj +2.482 0 Td +(client )Tj +2.705 0 Td +(to )Tj +1.149 0 Td +(access )Tj +3.093 0 Td +(the )Tj +1.649 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.815 0 Td +(services )Tj +3.704 0 Td +(via )Tj +1.593 0 Td +(HTTP/REST )Tj +5.206 0 Td +(and )Tj +1.927 0 Td +(expose )Tj +-39.199 -1.44 Td +(the interesting data directly to blog visitors in real time.)Tj +/TT1 1 Tf +12 0 0 12 57 360.6002 Tm +(REST Client in a Class)Tj +/TT0 1 Tf +10 0 0 10 75 338.2002 Tm +(T)Tj +0.511 0 Td +(he )Tj +/TT2 1 Tf +1.496 0 Td +(x-ray-services)Tj +/TT0 1 Tf +( )Tj +8.841 0 Td +(module )Tj +3.719 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.94 0 Td +(exposes )Tj +3.83 0 Td +(interesting )Tj +4.886 0 Td +(statistics )Tj +3.997 0 Td +(as )Tj +1.329 0 Td +(REST )Tj +2.607 0 Td +(services. )Tj +4.033 0 Td +(T)Tj +0.511 0 Td +(he)Tj +( )Tj +-41.144 -1.44 Td +(statistics )Tj +3.99 0 Td +(were )Tj +2.544 0 Td +(initially )Tj +3.657 0 Td +(intended )Tj +4.213 0 Td +(for )Tj +1.6 0 Td +(pri)Tj +1.149 0 Td +(v)Tj +0.476 0 Td +(ate )Tj +1.711 0 Td +(use, )Tj +2.156 0 Td +(but )Tj +1.823 0 Td +(it )Tj +0.989 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.322 0 Td +(far )Tj +1.544 0 Td +(more )Tj +2.655 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.101 0 Td +(to )Tj +1.267 0 Td +(monitor )Tj +3.823 0 Td +(the )Tj +-40.866 -1.44 Td +(statistics )Tj +3.961 0 Td +(through )Tj +3.739 0 Td +(the )Tj +1.738 0 Td +(public )Tj +3.128 0 Td +(blog.adam-bien.com)Tj +( )Tj +9.351 0 Td +(page, )Tj +2.738 0 Td +(r)Tj +0.321 0 Td +(ather )Tj +2.571 0 Td +(than )Tj +2.294 0 Td +(using )Tj +2.683 0 Td +(pri)Tj +1.149 0 Td +(v)Tj +0.476 0 Td +(ate )Tj +1.682 0 Td +(access )Tj +3.182 0 Td +(for )Tj +1.571 0 Td +(that )Tj +-40.588 -1.44 Td +(purpose. )Tj +4.13 0 Td +(Furthermore, )Tj +5.962 0 Td +(the )Tj +1.74 0 Td +(popularity )Tj +4.797 0 Td +(of )Tj +1.24 0 Td +(blog )Tj +2.296 0 Td +(posts )Tj +2.574 0 Td +(and )Tj +2.018 0 Td +(trends )Tj +3.018 0 Td +(might )Tj +2.851 0 Td +(also )Tj +2.129 0 Td +(be )Tj +1.462 0 Td +(interesting )Tj +4.852 0 Td +(to )Tj +1.24 0 Td +(blog )Tj +-40.31 -1.44 Td +(visitors. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(here )Tj +2.231 0 Td +(is )Tj +1.009 0 Td +(no )Tj +1.454 0 Td +(direct )Tj +2.787 0 Td +(client)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(side )Tj +4.788 0 Td +(support )Tj +3.566 0 Td +(for )Tj +1.509 0 Td +(REST )Tj +2.509 0 Td +(in )Tj +1.176 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.842 0 Td +(EE )Tj +1.342 0 Td +(6, )Tj +1.176 0 Td +(so )Tj +1.287 0 Td +(I )Tj +0.62 0 Td +(either )Tj +2.787 0 Td +(had )Tj +1.954 0 Td +(to )Tj +1.176 0 Td +(use )Tj +1.787 0 Td +(an )Tj +1.398 0 Td +(existing )Tj +-38.921 -1.44 Td +(client )Tj +2.693 0 Td +(libr)Tj +1.433 0 Td +(ary )Tj +1.637 0 Td +(or )Tj +1.192 0 Td +(implement )Tj +4.915 0 Td +(a )Tj +0.803 0 Td +(standalone )Tj +4.972 0 Td +(client. )Tj +2.898 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.359 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y-client )Tj +3.527 0 Td +(module )Tj +3.583 0 Td +(is )Tj +0.97 0 Td +(shipped )Tj +3.695 0 Td +(with )Tj +2.193 0 Td +(the )Tj +1.637 0 Td +(Roller )Tj +-39.644 -1.44 Td +(blogging )Tj +4.094 0 Td +(softw)Tj +2.261 0 Td +(are. )Tj +1.907 0 Td +(T)Tj +0.456 0 Td +(o )Tj +0.926 0 Td +(mitigate )Tj +3.815 0 Td +(other )Tj +2.593 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +1.703 0 Td +(interfering )Tj +4.76 0 Td +(with )Tj +2.26 0 Td +(the )Tj +1.704 0 Td +(Roller )Tj +2.926 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +1.703 0 Td +(and )Tj +1.982 0 Td +(to )Tj +1.204 0 Td +(simplify )Tj +-38.81 -1.44 Td +(t)Tj +0.28 0 Td +(h)Tj +0.558 0 Td +(e )Tj +1.279 0 Td +(i)Tj +0.28 0 Td +(n)Tj +0.558 0 Td +(s)Tj +0.391 0 Td +(t)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(l)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(t)Tj +0.28 0 Td +(i)Tj +0.28 0 Td +(o)Tj +0.558 0 Td +(n )Tj +1.335 0 Td +(p)Tj +0.558 0 Td +(r)Tj +0.335 0 Td +(o)Tj +0.558 0 Td +(c)Tj +0.502 0 Td +(e)Tj +0.502 0 Td +(s)Tj +0.391 0 Td +(s)Tj +0.391 0 Td +(, )Tj +1.057 0 Td +(I )Tj +1.057 0 Td +(i)Tj +0.28 0 Td +(m)Tj +0.835 0 Td +(p)Tj +0.558 0 Td +(l)Tj +0.28 0 Td +(e)Tj +0.502 0 Td +(m)Tj +0.835 0 Td +(e)Tj +0.502 0 Td +(n)Tj +0.558 0 Td +(t)Tj +0.28 0 Td +(e)Tj +0.502 0 Td +(d )Tj +1.335 0 Td +(a )Tj +1.279 0 Td +(s)Tj +0.391 0 Td +(t)Tj +0.28 0 Td +(a)Tj +0.502 0 Td +(n)Tj +0.558 0 Td +(d)Tj +0.558 0 Td +(a)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(o)Tj +0.558 0 Td +(n)Tj +0.558 0 Td +(e )Tj +1.279 0 Td +(R)Tj +0.613 0 Td +(E)Tj +0.502 0 Td +(S)Tj +0.502 0 Td +(T )Tj +1.335 0 Td +(c)Tj +0.502 0 Td +(l)Tj +0.28 0 Td +(i)Tj +0.28 0 Td +(e)Tj +0.502 0 Td +(n)Tj +0.558 0 Td +(t )Tj +1.057 0 Td +(w)Tj +0.78 0 Td +(i)Tj +0.28 0 Td +(t)Tj +0.28 0 Td +(h)Tj +0.558 0 Td +(o)Tj +0.558 0 Td +(u)Tj +0.558 0 Td +(t )Tj +1.057 0 Td +(a)Tj +0.502 0 Td +(n)Tj +0.54 0 Td +(y )Tj +1.279 0 Td +(e)Tj +0.502 0 Td +(x)Tj +0.502 0 Td +(t)Tj +0.28 0 Td +(e)Tj +0.502 0 Td +(r)Tj +0.335 0 Td +(n)Tj +0.558 0 Td +(a)Tj +0.502 0 Td +(l)Tj +( )Tj +-41.922 -1.44 Td +(dependencies. )Tj +6.648 0 Td +(It )Tj +0.979 0 Td +(sounds )Tj +3.425 0 Td +(complex, )Tj +4.424 0 Td +(but )Tj +1.813 0 Td +(the )Tj +1.757 0 Td +(implementation )Tj +7.203 0 Td +(turned )Tj +3.202 0 Td +(out )Tj +1.813 0 Td +(to )Tj +1.257 0 Td +(be )Tj +1.479 0 Td +(surprisingly )Tj +5.369 0 Td +(simple )Tj +-39.366 -1.44 Td +(\(see Listing 72\))Tj +/TT3 1 Tf +(.)Tj +/TT2 1 Tf +0 -1.79 TD +(public class XRay {)Tj +0 -3.58 TD +( private String baseUrl;)Tj +0 -1.79 TD +( public final static String HITS_PER_HOUR = "hitsperhour";)Tj +T* +( public final static String MOST_POPULAR = "mostpopular";)Tj +0 -1.79 TD +( public final static String HITS_PER_MINUTE = "hitsperminute";)Tj +ET + +endstream +endobj +293 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 294 0 R>>endobj +294 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(124)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( public final static String TOTAL_HITS = "hits";)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( public final static String HITS_FOR_URI = "hits/";)Tj +0 -1.79 TD +( public final static String TRENDING = "trending?max=5";)Tj +T* +( public final static String TODAY_HITS = "hitsperday/today";)Tj +0 -3.58 TD +( public final static String YESTERDAY_HITS = "hitsperday/)Tj +0 -0.99 TD +(yesterday";)Tj +0 -1.79 TD +( private final static Logger LOG = Logger.getLogger)Tj +0 -0.99 TD +(\(XRay.class.getName\(\)\);)Tj +0 -1.79 TD +( private static final int TIMEOUT_IN_MS = 100;)Tj +0 -3.58 TD +( public XRay\(String url\) {)Tj +0 -1.79 TD +( this.baseUrl = url;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public String getHitsPerHour\(\) {)Tj +0 -1.79 TD +( String uri = getUrl\(HITS_PER_HOUR\);)Tj +0 -1.79 TD +( return getContent\(uri\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( )Tj +T* +( public String getTotalHits\(\){)Tj +0 -1.79 TD +( String uri = getUrl\(TOTAL_HITS\);)Tj +0 -1.79 TD +( return getContent\(uri\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +(//some getters omitted)Tj +0 -3.58 TD +( public String getHitsForPost\(String post\) {)Tj +0 -1.79 TD +( String uri = getUrl\(HITS_FOR_URI\);)Tj +0 -1.79 TD +( String encoded;)Tj +T* +( try {)Tj +T* +( encoded = URLEncoder.encode\(post, "UTF-8"\);)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 77.3 Tm +( } catch \(UnsupportedEncodingException e\) {)Tj +ET +Q + +endstream +endobj +295 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 296 0 R>>endobj +296 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(125)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( LOG.log\(Level.SEVERE, "Cannot encode URI: {0} Reason: )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 624.2 Tm +({1}", new Object[]{post, e}\);)Tj +0 -1.79 TD +( return "--";)Tj +T* +( })Tj +T* +( String postURL = uri + encoded;)Tj +T* +( return getContent\(postURL\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( String getUrl\(String command\) {)Tj +0 -1.79 TD +( return baseUrl + command;)Tj +T* +( })Tj +0 -1.79 TD +( String getContent\(String uri\){)Tj +0 -1.79 TD +( try {)Tj +0 -1.79 TD +( URL url = new URL\(uri\);)Tj +0 -1.79 TD +( return getContent\(url\);)Tj +T* +( } catch \(Exception ex\) {)Tj +0 -1.79 TD +( LOG.log\(Level.SEVERE, "Cannot connect to X-Ray-Services: )Tj +0 -0.99 TD +({0} Reason: {1}", new Object[]{uri, ex}\);)Tj +0 -1.79 TD +( return "--";)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( })Tj +/TT2 1 Tf +0 -3.58 TD +(String getContent\(URL url\) throws IOException {)Tj +0 -1.79 TD +( URLConnection urlConnection = url.openConnection\(\);)Tj +0 -1.79 TD +( urlConnection.setConnectTimeout\(TIMEOUT_IN_MS\);)Tj +0 -1.79 TD +( urlConnection.setReadTimeout\(TIMEOUT_IN_MS\);)Tj +T* +( InputStream stream = urlConnection.getInputStream\(\);)Tj +0 -1.79 TD +( BufferedReader br = new BufferedReader\(new InputStreamReader)Tj +0 -0.99 TD +(\(stream\)\);)Tj +0 -1.79 TD +( String line;)Tj +0 -1.79 TD +( StringBuilder content = new StringBuilder\(""\);)Tj +T* +( while \(\(line = br.readLine\(\)\) != null\) {)Tj +T* +( content.append\(line\);)Tj +0 -1.79 TD +( })Tj +ET + +endstream +endobj +297 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 299 0 R>>endobj +298 0 obj<>endobj +299 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(126)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( br.close\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( return content.toString\(\);)Tj +0 -1.79 TD +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 72: )Tj +4.688 0 Td +(A \223GET\224 REST Client in a Class)Tj +-2.888 -2.24 Td +(T)Tj +0.515 0 Td +(h)Tj +0.56 0 Td +(e )Tj +1.28 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(t)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(r)Tj +0.337 0 Td +(e )Tj +1.28 0 Td +(H)Tj +0.782 0 Td +(T)Tj +0.56 0 Td +(T)Tj +0.56 0 Td +(P )Tj +1.336 0 Td +(f)Tj +0.282 0 Td +(u)Tj +0.56 0 Td +(n)Tj +0.56 0 Td +(c)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(o)Tj +0.56 0 Td +(n)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(l)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(t)Tj +0.282 0 Td +(y )Tj +1.28 0 Td +(w)Tj +0.764 0 Td +(a)Tj +0.504 0 Td +(s )Tj +1.169 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(c)Tj +0.504 0 Td +(a)Tj +0.504 0 Td +(p)Tj +0.56 0 Td +(s)Tj +0.393 0 Td +(u)Tj +0.56 0 Td +(l)Tj +0.282 0 Td +(a)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(d )Tj +1.336 0 Td +(i)Tj +0.282 0 Td +(n )Tj +1.336 0 Td +(t)Tj +0.282 0 Td +(h)Tj +0.56 0 Td +(e )Tj +1.28 0 Td +(m)Tj +0.837 0 Td +(e)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(h)Tj +0.56 0 Td +(o)Tj +0.56 0 Td +(d )Tj +/TT2 1 Tf +1.336 0 Td +(g)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(t)Tj +0.604 0 Td +(C)Tj +0.604 0 Td +(o)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(t)Tj +0.604 0 Td +(e)Tj +0.604 0 Td +(n)Tj +0.604 0 Td +(t)Tj +/TT0 1 Tf +0.604 0 Td +(. )Tj +0.984 0 Td +(T)Tj +0.515 0 Td +(h)Tj +0.56 0 Td +(e)Tj +( )Tj +/TT2 1 Tf +-41.7 -1.44 Td +(getContent)Tj +/TT0 1 Tf +( )Tj +6.323 0 Td +(method )Tj +3.601 0 Td +(opens )Tj +2.879 0 Td +(an )Tj +1.378 0 Td +(HTTP )Tj +2.768 0 Td +(connection)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.408 0 Td +(puts )Tj +2.101 0 Td +(the )Tj +1.656 0 Td +(content )Tj +3.546 0 Td +(of )Tj +1.156 0 Td +(a )Tj +0.822 0 Td +(passed )Tj +3.212 0 Td +(URL )Tj +2.211 0 Td +(into )Tj +1.99 0 Td +(a )Tj +0.822 0 Td +(string)Tj +( )Tj +-39.866 -1.44 Td +(and )Tj +1.918 0 Td +(ev)Tj +0.988 0 Td +(entually )Tj +3.752 0 Td +(returns )Tj +3.251 0 Td +(it. )Tj +1.066 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.362 0 Td +(remaining )Tj +4.64 0 Td +(methods )Tj +3.974 0 Td +(just )Tj +1.807 0 Td +(wr)Tj +1.099 0 Td +(ap )Tj +1.362 0 Td +(the)Tj +/TT2 1 Tf +( )Tj +1.962 0 Td +(getContent\(URL\))Tj +/TT0 1 Tf +( )Tj +9.308 0 Td +(method )Tj +3.585 0 Td +(and )Tj +-40.588 -1.44 Td +(republish the method under a more con)Tj +17.106 0 Td +(v)Tj +0.488 0 Td +(enient name. )Tj +-15.794 -2.24 Td +(An )Tj +1.517 0 Td +(external )Tj +3.74 0 Td +(REST )Tj +2.462 0 Td +(libr)Tj +1.433 0 Td +(ary )Tj +1.627 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.241 0 Td +(eliminate )Tj +4.295 0 Td +(the )Tj +/TT2 1 Tf +1.629 0 Td +(getContent)Tj +/TT0 1 Tf +( )Tj +6.295 0 Td +(method )Tj +3.574 0 Td +(but )Tj +1.685 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.241 0 Td +(also )Tj +2.018 0 Td +(introduce )Tj +-38.087 -1.44 Td +(external )Tj +3.727 0 Td +(dependencies )Tj +6.229 0 Td +(to )Tj +1.116 0 Td +(REST )Tj +2.449 0 Td +(fr)Tj +0.599 0 Td +(amew)Tj +2.599 0 Td +(orks. )Tj +2.338 0 Td +(Because )Tj +3.838 0 Td +(the )Tj +1.616 0 Td +(statistics )Tj +3.839 0 Td +(are )Tj +1.615 0 Td +(exclusi)Tj +2.983 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.56 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.394 0 Td +(with )Tj +2.172 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(GET )Tj +2.229 0 Td +(method, )Tj +3.953 0 Td +(the )Tj +1.729 0 Td +(implementation )Tj +7.176 0 Td +(of )Tj +1.229 0 Td +(an )Tj +1.451 0 Td +(HTTP/REST )Tj +5.286 0 Td +(client )Tj +2.786 0 Td +(is )Tj +1.062 0 Td +(tri)Tj +0.871 0 Td +(vial. )Tj +2.229 0 Td +(In )Tj +1.229 0 Td +(a )Tj +0.895 0 Td +(more )Tj +2.618 0 Td +(sophisticated )Tj +6.009 0 Td +(use )Tj +-40.755 -1.44 Td +(case)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( the use of an external libr)Tj +13.354 0 Td +(ary w)Tj +2.377 0 Td +(ould be far more appropriate.)Tj +/TT4 1 Tf +12 0 0 12 57 394 Tm +(T)Tj +0.482 0 Td +(imeouts )Tj +3.686 0 Td +(Are Crucial)Tj +/TT0 1 Tf +10 0 0 10 75 371.6 Tm +(As )Tj +1.444 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.888 0 Td +(mentioned)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT2 1 Tf +5.251 0 Td +(x-ray-services)Tj +/TT0 1 Tf +( )Tj +8.789 0 Td +(must )Tj +2.444 0 Td +(not )Tj +1.778 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.888 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.888 0 Td +(impact )Tj +3.333 0 Td +(on )Tj +1.5 0 Td +(the )Tj +1.722 0 Td +(stability )Tj +3.723 0 Td +(of )Tj +1.222 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(blogging )Tj +4.368 0 Td +(softw)Tj +2.261 0 Td +(are. )Tj +2.255 0 Td +(Statistics )Tj +4.312 0 Td +(are )Tj +1.977 0 Td +(an )Tj +1.7 0 Td +(optional )Tj +4.202 0 Td +(feature; )Tj +3.867 0 Td +(an )Tj +1.7 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.144 0 Td +(cr)Tj +0.821 0 Td +(ash )Tj +2.089 0 Td +(should )Tj +3.535 0 Td +(not )Tj +2.034 0 Td +(affect )Tj +2.978 0 Td +(the )Tj +-40.866 -1.44 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.229 0 Td +(of )Tj +1.339 0 Td +(the )Tj +1.839 0 Td +(blog. )Tj +2.599 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.728 0 Td +(reasoning )Tj +4.673 0 Td +(leads )Tj +2.728 0 Td +(to )Tj +1.339 0 Td +(another )Tj +3.784 0 Td +(conclusion: )Tj +5.508 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.005 0 Td +(services )Tj +3.894 0 Td +(should )Tj +3.396 0 Td +(be )Tj +-41.144 -1.44 Td +(optional. )Tj +/TT2 1 Tf +0 -1.79 TD +( String getContent\(String uri\){)Tj +T* +( try {)Tj +T* +( URL url = new URL\(uri\);)Tj +T* +( return getContent\(url\);)Tj +/TT1 1 Tf +T* +( } catch \(Exception ex\) {)Tj +T* +( LOG.log\(Level.SEVERE, "Cannot connect to x-ray services: )Tj +0 -0.99 TD +({0} Reason: {1}", new Object[]{uri, ex}\);)Tj +0 -1.79 TD +( return "--";)Tj +T* +( })Tj +/TT2 1 Tf +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 73: Exception Sw)Tj +10.487 0 Td +(allo)Tj +1.6 0 Td +(wing for )Tj +3.798 0 Td +(A)Tj +0.612 0 Td +(v)Tj +0.476 0 Td +(ailability)Tj +-15.173 -2.24 Td +(Meeting )Tj +3.785 0 Td +(this )Tj +1.785 0 Td +(requirement )Tj +5.507 0 Td +(is )Tj +0.951 0 Td +(surprisingly )Tj +5.23 0 Td +(simple. )Tj +3.359 0 Td +(All )Tj +1.507 0 Td +(exceptions )Tj +4.897 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.784 0 Td +(to )Tj +1.118 0 Td +(be )Tj +1.34 0 Td +(caught )Tj +3.174 0 Td +(and )Tj +1.896 0 Td +(ignored. )Tj +-38.643 -1.44 Td +(A )Tj +1.043 0 Td +(\223\227\223 )Tj +2.264 0 Td +(c)Tj +0.482 0 Td +(har)Tj +1.377 0 Td +(acter )Tj +2.487 0 Td +(is )Tj +1.043 0 Td +(returned )Tj +3.988 0 Td +(if )Tj +0.932 0 Td +(something )Tj +4.822 0 Td +(went )Tj +2.488 0 Td +(wrong )Tj +3.099 0 Td +(during )Tj +3.155 0 Td +(the )Tj +1.71 0 Td +(HTTP )Tj +2.822 0 Td +(communication. )Tj +7.434 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.265 0 Td +(the )Tj +-40.866 -1.44 Td +(blog )Tj +2.409 0 Td +(visitor)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.381 0 Td +(a )Tj +1.019 0 Td +(\223double )Tj +3.965 0 Td +(h)Tj +0.519 0 Td +(yphen\224 )Tj +3.631 0 Td +(looks )Tj +2.798 0 Td +(like )Tj +2.075 0 Td +(a )Tj +1.019 0 Td +(natur)Tj +2.211 0 Td +(al )Tj +1.297 0 Td +(sign )Tj +2.242 0 Td +(indicating )Tj +4.799 0 Td +(the )Tj +1.853 0 Td +(una)Tj +1.582 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.243 0 Td +(of )Tj +1.353 0 Td +(the )Tj +ET + +endstream +endobj +300 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 301 0 R>>endobj +301 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(127)Tj +0 Tc 0 Tw -20.132 57.06 Td +(statistics. )Tj +4.16 0 Td +(In )Tj +1.159 0 Td +(gener)Tj +2.377 0 Td +(al, )Tj +1.381 0 Td +(visitors )Tj +3.326 0 Td +(are )Tj +1.658 0 Td +(more )Tj +2.547 0 Td +(interested )Tj +4.493 0 Td +(in )Tj +1.159 0 Td +(the )Tj +1.659 0 Td +(blog )Tj +2.215 0 Td +(content, )Tj +3.827 0 Td +(than )Tj +2.215 0 Td +(in )Tj +1.159 0 Td +(statistics. )Tj +4.16 0 Td +(So )Tj +1.381 0 Td +(it )Tj +0.881 0 Td +(is )Tj +0.992 0 Td +(OK )Tj +-40.756 -1.44 Td +(to make the statistics optional.)Tj +1.8 -2.24 Td +(J)Tj +0.26 0 Td +(ust )Tj +1.808 0 Td +(catc)Tj +1.76 0 Td +(hing )Tj +2.475 0 Td +(an )Tj +1.641 0 Td +(exception )Tj +4.809 0 Td +(does )Tj +2.586 0 Td +(not )Tj +1.975 0 Td +(ensure )Tj +3.419 0 Td +(the )Tj +1.919 0 Td +(stability )Tj +3.92 0 Td +(of )Tj +1.419 0 Td +(the )Tj +1.919 0 Td +(system. )Tj +3.752 0 Td +(Deadloc)Tj +3.65 0 Td +(ks )Tj +1.474 0 Td +(and )Tj +-40.588 -1.44 Td +(\223li)Tj +0.982 0 Td +(v)Tj +0.488 0 Td +(eloc)Tj +1.816 0 Td +(ks\224 )Tj +1.698 0 Td +(\()Tj +(http://en.wikipedia.org/wiki/Deadloc)Tj +16.045 0 Td +(k#Li)Tj +1.816 0 Td +(v)Tj +0.488 0 Td +(eloc)Tj +1.816 0 Td +(k)Tj +(\) )Tj +1.143 0 Td +(can )Tj +1.921 0 Td +(still )Tj +1.866 0 Td +(occur)Tj +2.371 0 Td +(, )Tj +0.643 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.921 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.311 0 Td +(lead )Tj +2.199 0 Td +(to )Tj +/C2_0 1 Tf +-41.366 -1.44 Td +<00410046005D>Tj +/TT0 1 Tf +(nite )Tj +3.429 0 Td +(bloc)Tj +1.872 0 Td +(king )Tj +2.261 0 Td +(calls. )Tj +2.65 0 Td +(If )Tj +0.983 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.927 0 Td +(becomes )Tj +4.261 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erloaded )Tj +4.206 0 Td +(and )Tj +2.039 0 Td +(responds )Tj +4.262 0 Td +(slo)Tj +1.211 0 Td +(wly)Tj +1.464 0 Td +(, )Tj +0.705 0 Td +(that )Tj +2.039 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.373 0 Td +(affect )Tj +2.761 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(performance )Tj +5.856 0 Td +(and )Tj +2.023 0 Td +(scalability )Tj +4.746 0 Td +(of )Tj +1.245 0 Td +(the )Tj +1.745 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.911 0 Td +(client )Tj +2.801 0 Td +(\(blogging )Tj +4.413 0 Td +(softw)Tj +2.261 0 Td +(are\) )Tj +2.022 0 Td +(as )Tj +1.3 0 Td +(well. )Tj +2.449 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.467 0 Td +(read )Tj +2.3 0 Td +(timeout )Tj +3.69 0 Td +(in )Tj +/TT1 1 Tf +-41.366 -1.44 Td +(java.net.URLConnection)Tj +/TT0 1 Tf +( allo)Tj +/C2_0 1 Tf +15.08 0 Td +<004F004B0001004C0040003D0001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +6.602 0 Td +(ation of the maximum-w)Tj +10.596 0 Td +(ait time: )Tj +/TT1 1 Tf +-32.278 -1.79 Td +(String getContent\(URL url\) throws IOException {)Tj +0 -1.79 TD +( URLConnection urlConnection = url.openConnection\(\);)Tj +T* +( urlConnection.setConnectTimeout\(TIMEOUT_IN_MS\);)Tj +/TT2 1 Tf +T* +( urlConnection.setReadTimeout\(TIMEOUT_IN_MS\);)Tj +/TT1 1 Tf +T* +(//\205)Tj +T* +(})Tj +/TT0 1 Tf +1.8 -2.24 Td +(After )Tj +2.344 0 Td +(the )Tj +/C2_0 1 Tf +1.622 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.123 0 Td +(period)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.317 0 Td +(a )Tj +/TT1 1 Tf +0.788 0 Td +(java.net.SocketTimeoutException)Tj +/TT0 1 Tf +( )Tj +18.891 0 Td +(is )Tj +0.955 0 Td +(r)Tj +0.321 0 Td +(aised, )Tj +2.789 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.844 0 Td +(again )Tj +-39.866 -1.44 Td +(leads )Tj +2.541 0 Td +(to )Tj +1.152 0 Td +(the )Tj +1.652 0 Td +(acceptable )Tj +4.986 0 Td +(\223\227\223 )Tj +2.206 0 Td +(result. )Tj +2.893 0 Td +(Aggressi)Tj +3.538 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.818 0 Td +(timeout )Tj +3.597 0 Td +(settings )Tj +3.486 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.818 0 Td +(the )Tj +1.652 0 Td +(situation )Tj +/C2_0 1 Tf +3.987 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly)Tj +5.077 0 Td +(. )Tj +-41.922 -1.44 Td +(In )Tj +1.316 0 Td +(fact)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.288 0 Td +(it )Tj +1.038 0 Td +(is )Tj +1.149 0 Td +(possible )Tj +3.984 0 Td +(to )Tj +1.316 0 Td +(redeplo)Tj +3.267 0 Td +(y )Tj +0.982 0 Td +(the )Tj +1.816 0 Td +(x)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.982 0 Td +(bac)Tj +1.538 0 Td +(kend )Tj +2.594 0 Td +(in )Tj +1.316 0 Td +(production )Tj +5.207 0 Td +(without )Tj +3.762 0 Td +(affecting )Tj +4.15 0 Td +(the )Tj +1.816 0 Td +(page )Tj +-40.144 -1.44 Td +(rendering or degr)Tj +7.434 0 Td +(ading the performance. )Tj +-5.634 -2.24 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.835 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.224 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.391 0 Td +(with )Tj +2.225 0 Td +(a )Tj +0.835 0 Td +(timeout )Tj +3.614 0 Td +(setting )Tj +3.114 0 Td +(of )Tj +1.169 0 Td +(100 )Tj +2.003 0 Td +(ms. )Tj +1.835 0 Td +(During )Tj +3.336 0 Td +(normal )Tj +3.391 0 Td +(oper)Tj +1.933 0 Td +(ations)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.142 0 Td +(the )Tj +1.669 0 Td +(timeout )Tj +-38.921 -1.44 Td +(w)Tj +0.76 0 Td +(as )Tj +1.273 0 Td +(nev)Tj +1.544 0 Td +(er )Tj +1.217 0 Td +(reac)Tj +1.815 0 Td +(hed. )Tj +2.274 0 Td +(In )Tj +1.218 0 Td +(the )Tj +1.718 0 Td +(w)Tj +0.766 0 Td +(orst)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(case )Tj +4.162 0 Td +(scenario, )Tj +4.274 0 Td +(visitors )Tj +3.385 0 Td +(had )Tj +1.996 0 Td +(to )Tj +1.218 0 Td +(w)Tj +0.76 0 Td +(ait )Tj +1.44 0 Td +(100 )Tj +2.052 0 Td +(ms )Tj +1.606 0 Td +(for )Tj +1.551 0 Td +(x)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.884 0 Td +(to )Tj +1.218 0 Td +(return )Tj +2.94 0 Td +(a )Tj +-41.7 -1.44 Td +(\223\227\223 c)Tj +2.648 0 Td +(har)Tj +1.377 0 Td +(acter)Tj +2.037 0 Td +(, w)Tj +1.316 0 Td +(hic)Tj +1.316 0 Td +(h is absolutely acceptable.)Tj +-6.894 -2.24 Td +(In )Tj +1.247 0 Td +(enterprise )Tj +4.636 0 Td +(projects)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.053 0 Td +(timeouts )Tj +4.081 0 Td +(are )Tj +1.746 0 Td +(the )Tj +1.747 0 Td +(easiest )Tj +3.247 0 Td +(solution )Tj +3.86 0 Td +(for )Tj +1.58 0 Td +(the )Tj +1.747 0 Td +(resolution )Tj +4.693 0 Td +(of )Tj +1.247 0 Td +(deadloc)Tj +3.428 0 Td +(ks. )Tj +1.488 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +-41.088 -1.44 Td +(should )Tj +/C2_0 1 Tf +3.314 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(ne )Tj +3.091 0 Td +(sensible )Tj +3.869 0 Td +(timeouts )Tj +4.091 0 Td +(for )Tj +1.59 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.979 0 Td +(resour)Tj +2.655 0 Td +(ce )Tj +1.423 0 Td +(and )Tj +2.035 0 Td +(ask )Tj +1.812 0 Td +(y)Tj +0.482 0 Td +(ourself )Tj +3.313 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.757 0 Td +(should )Tj +3.314 0 Td +(happen )Tj +3.647 0 Td +(in )Tj +1.257 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.633 0 Td +(of )Tj +1.133 0 Td +(a )Tj +0.799 0 Td +(timeout. )Tj +3.856 0 Td +(In )Tj +1.133 0 Td +(most )Tj +2.355 0 Td +(cases)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.827 0 Td +(the )Tj +1.633 0 Td +(question )Tj +3.968 0 Td +(cannot )Tj +3.245 0 Td +(be )Tj +1.355 0 Td +(ans)Tj +1.433 0 Td +(wered )Tj +2.966 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.799 0 Td +(a )Tj +0.799 0 Td +(dev)Tj +1.544 0 Td +(eloper; )Tj +3.3 0 Td +(r)Tj +0.321 0 Td +(ather)Tj +2.093 0 Td +(, )Tj +0.577 0 Td +(it )Tj +0.855 0 Td +(must )Tj +-40.144 -1.44 Td +(be ans)Tj +2.767 0 Td +(wered b)Tj +3.483 0 Td +(y the product o)Tj +6.547 0 Td +(wner or business analysts.)Tj +/TT4 1 Tf +12 0 0 12 57 209.0001 Tm +(V)Tj +0.612 0 Td +(elocity Integr)Tj +5.822 0 Td +(ation)Tj +/TT0 1 Tf +10 0 0 10 75 186.6001 Tm +(Roller )Tj +2.853 0 Td +(uses )Tj +2.131 0 Td +(the )Tj +1.594 0 Td +(Apac)Tj +2.205 0 Td +(he )Tj +1.353 0 Td +(project )Tj +3.206 0 Td +(V)Tj +0.612 0 Td +(elocity )Tj +3.187 0 Td +(\()Tj +(http://v)Tj +3.268 0 Td +(elocity)Tj +2.798 0 Td +(.apac)Tj +2.316 0 Td +(he.org/)Tj +(\) )Tj +3.576 0 Td +(for )Tj +1.464 0 Td +(site )Tj +1.742 0 Td +(rendering. )Tj +4.595 0 Td +(V)Tj +0.612 0 Td +(elocity )Tj +-39.31 -1.44 Td +(is )Tj +0.98 0 Td +(a )Tj +0.813 0 Td +(templating )Tj +4.87 0 Td +(engine )Tj +3.203 0 Td +(written )Tj +3.314 0 Td +(in )Tj +1.147 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a. )Tj +1.091 0 Td +(It )Tj +0.869 0 Td +(comes )Tj +3.091 0 Td +(with )Tj +2.203 0 Td +(its )Tj +1.258 0 Td +(o)Tj +0.544 0 Td +(wn )Tj +1.647 0 Td +(language )Tj +4.203 0 Td +(and )Tj +1.925 0 Td +(can )Tj +1.869 0 Td +(directly )Tj +3.536 0 Td +(access )Tj +3.091 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.304 0 Td +(of )Tj +1.304 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.969 0 Td +(properties. )Tj +4.934 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.581 0 Td +(can )Tj +2.026 0 Td +(directly )Tj +3.693 0 Td +(tr)Tj +0.599 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.488 0 Td +(erse )Tj +2.192 0 Td +(the )Tj +1.804 0 Td +(properties )Tj +4.748 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.969 0 Td +(using )Tj +2.749 0 Td +(the )Tj +1.804 0 Td +(property )Tj +4.081 0 Td +(names)Tj +( )Tj +/C2_0 1 Tf +-39.422 -1.44 Td +<004700450041004C004C00410046003F0001004C0040003D0001005A003F003D004C005B00010048004A003D005D>Tj +/TT0 1 Tf +(x.)Tj +/TT1 1 Tf +T* +( Yesterday's hits: $xraymodel.xray.yesterdayHits
)Tj +T* +( Today's hits: $xraymodel.xray.todayHits
)Tj +T* +( Post reads / hour: $xraymodel.xray.hitsPerHour
)Tj +ET + +endstream +endobj +302 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 303 0 R>>endobj +303 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(128)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( Top posts:
)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( $xraymodel.xray.mostPopularAsHtml)Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 74: X-r)Tj +5.99 0 Td +(a)Tj +0.47 0 Td +(y Services )Tj +4.464 0 Td +(V)Tj +0.612 0 Td +(elocity Integr)Tj +5.601 0 Td +(ation)Tj +-15.337 -2.24 Td +(In )Tj +1.172 0 Td +(Listing )Tj +3.117 0 Td +(74)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.7 0 Td +(an )Tj +1.394 0 Td +(instance )Tj +3.895 0 Td +(with )Tj +2.228 0 Td +(the )Tj +1.672 0 Td +(name )Tj +/TT1 1 Tf +2.727 0 Td +(xraymodel)Tj +/TT0 1 Tf +( )Tj +5.738 0 Td +(is )Tj +1.005 0 Td +(tr)Tj +0.599 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.488 0 Td +(ersed. )Tj +2.894 0 Td +(Its )Tj +1.283 0 Td +(method )Tj +/TT1 1 Tf +3.617 0 Td +(getXray\(\))Tj +/TT0 1 Tf +( )Tj +5.738 0 Td +(is )Tj +-41.533 -1.44 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.86 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.054 0 Td +(returns )Tj +3.443 0 Td +(an )Tj +1.554 0 Td +(object )Tj +3.166 0 Td +(\(the )Tj +/TT1 1 Tf +2.11 0 Td +(XRay)Tj +/TT0 1 Tf +( )Tj +2.898 0 Td +(from )Tj +2.498 0 Td +(Listing )Tj +3.277 0 Td +(72\) )Tj +1.888 0 Td +(with )Tj +2.388 0 Td +(the )Tj +/TT1 1 Tf +1.832 0 Td +(getYesterdayHits)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +-32.348 -1.44 Td +(getTodayHits)Tj +/TT0 1 Tf +( )Tj +7.532 0 Td +(and )Tj +/TT1 1 Tf +1.942 0 Td +(getHitsPerHour)Tj +/TT0 1 Tf +( )Tj +8.732 0 Td +(methods. )Tj +/TT1 1 Tf +4.276 0 Td +(XRay)Tj +/TT0 1 Tf +( )Tj +2.731 0 Td +(results )Tj +3.053 0 Td +(can )Tj +1.886 0 Td +(be )Tj +1.386 0 Td +(directly )Tj +3.553 0 Td +(merged )Tj +3.552 0 Td +(with )Tj +2.22 0 Td +(the )Tj +-40.866 -1.44 Td +(Roller page.)Tj +1.8 -2.24 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.453 0 Td +(could )Tj +2.787 0 Td +(similarly )Tj +4.008 0 Td +(integr)Tj +2.433 0 Td +(ate )Tj +1.619 0 Td +(a )Tj +0.841 0 Td +(REST )Tj +2.508 0 Td +(client )Tj +2.731 0 Td +(with )Tj +2.231 0 Td +(a )Tj +0.841 0 Td +(JSF )Tj +1.619 0 Td +(page. )Tj +2.583 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.453 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.287 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.841 0 Td +(to )Tj +1.175 0 Td +(expose )Tj +/TT1 1 Tf +3.342 0 Td +(XRay)Tj +/TT0 1 Tf +( )Tj +-39.8 -1.44 Td +(with )Tj +2.245 0 Td +(a )Tj +0.855 0 Td +(CDI )Tj +2.078 0 Td +(managed )Tj +4.3 0 Td +(bean )Tj +2.467 0 Td +(denoted )Tj +3.857 0 Td +(with )Tj +/TT1 1 Tf +2.245 0 Td +(@Named\(\223xraymodel\224\))Tj +/TT0 1 Tf +(, )Tj +12.035 0 Td +(and )Tj +1.967 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.467 0 Td +(could )Tj +2.801 0 Td +(integr)Tj +2.433 0 Td +(ate )Tj +1.633 0 Td +(the )Tj +-40.866 -1.44 Td +(i)Tj +0.41 0 Td +(n)Tj +0.689 0 Td +(t)Tj +0.41 0 Td +(e)Tj +0.632 0 Td +(r)Tj +0.466 0 Td +(e)Tj +0.633 0 Td +(s)Tj +0.521 0 Td +(t)Tj +0.41 0 Td +(i)Tj +0.411 0 Td +(n)Tj +0.688 0 Td +(g )Tj +1.344 0 Td +(p)Tj +0.688 0 Td +(r)Tj +0.466 0 Td +(o)Tj +0.688 0 Td +(p)Tj +0.688 0 Td +(e)Tj +0.632 0 Td +(r)Tj +0.466 0 Td +(t)Tj +0.41 0 Td +(y )Tj +1.344 0 Td +(d)Tj +0.688 0 Td +(i)Tj +0.411 0 Td +(r)Tj +0.466 0 Td +(e)Tj +0.632 0 Td +(c)Tj +0.632 0 Td +(t)Tj +0.411 0 Td +(l)Tj +0.41 0 Td +(y )Tj +1.344 0 Td +(i)Tj +0.41 0 Td +(n)Tj +0.689 0 Td +(t)Tj +0.41 0 Td +(o )Tj +1.4 0 Td +(a )Tj +1.344 0 Td +(J)Tj +0.411 0 Td +(S)Tj +0.632 0 Td +(F )Tj +1.344 0 Td +(p)Tj +0.688 0 Td +(a)Tj +0.633 0 Td +(g)Tj +0.632 0 Td +(e )Tj +1.344 0 Td +(u)Tj +0.688 0 Td +(s)Tj +0.522 0 Td +(i)Tj +0.41 0 Td +(n)Tj +0.688 0 Td +(g )Tj +1.344 0 Td +(a)Tj +0.633 0 Td +(n )Tj +1.4 0 Td +(E)Tj +0.632 0 Td +(L )Tj +1.344 0 Td +(e)Tj +0.633 0 Td +(x)Tj +0.632 0 Td +(p)Tj +0.689 0 Td +(r)Tj +0.466 0 Td +(e)Tj +0.632 0 Td +(s)Tj +0.522 0 Td +(s)Tj +0.521 0 Td +(i)Tj +0.41 0 Td +(o)Tj +0.689 0 Td +(n)Tj +0.688 0 Td +(: )Tj +/TT1 1 Tf +1.122 0 Td +(#)Tj +-41.6 -1.44 Td +({xraymodel.xray.yesterdayHits})Tj +/TT2 1 Tf +(.)Tj +/TT3 1 Tf +12 0 0 12 57 431 Tm +(Roller Integr)Tj +5.489 0 Td +(ation)Tj +/TT0 1 Tf +10 0 0 10 75 408.6 Tm +(T)Tj +0.511 0 Td +(he x-r)Tj +2.488 0 Td +(a)Tj +0.47 0 Td +(y/Roller integr)Tj +6.045 0 Td +(ation is ac)Tj +4.373 0 Td +(hiev)Tj +1.822 0 Td +(ed with the classic Gang of F)Tj +12.405 0 Td +(our )Tj +1.686 0 Td +(Adapter pattern )Tj +-31.6 -1.44 Td +(\()Tj +(http://en.wikipedia.org/wiki/Adapter_pattern)Tj +(\). )Tj +20.13 0 Td +(An )Tj +1.548 0 Td +(adapter )Tj +3.548 0 Td +(implements )Tj +5.326 0 Td +(a )Tj +0.825 0 Td +(compatible )Tj +5.16 0 Td +(interface )Tj +4.048 0 Td +(and )Tj +-40.588 -1.44 Td +(delegates all calls to the incompatible interface \(see Listing 75\). )Tj +/TT1 1 Tf +0 -1.79 TD +(import org.apache.roller.weblogger.ui.rendering.model.Model;)Tj +T* +(public class XRayModel implements Model{)Tj +T* +( public static final String XRAYMODEL_NAME = "xraymodel";)Tj +0 -3.58 TD +( private Map configuration;)Tj +0 -1.79 TD +( private XRay xray;)Tj +0 -1.79 TD +( public final static String URL = "http://192.168.0.50:5380/x-ray/)Tj +0 -0.99 TD +(resources/";)Tj +0 -1.79 TD +( public final static String XRAYURL = "XRAY-URL";)Tj +0 -3.58 TD +( @Override)Tj +0 -1.79 TD +( public void init\(Map map\) {)Tj +T* +( this.configuration = map;)Tj +T* +( this.xray = initializeXRay\(this.configuration\);)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( @Override)Tj +ET + +endstream +endobj +304 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 305 0 R>>endobj +305 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(129)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( public String getModelName\(\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( return XRAYMODEL_NAME;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( public XRay getXray\(\){)Tj +0 -1.79 TD +( return xray;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( String extractUrl\(Map map\){)Tj +0 -1.79 TD +( if\(map == null\){)Tj +0 -1.79 TD +( return URL;)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( String url = \(String\) map.get\(XRAYURL\);)Tj +0 -1.79 TD +( if\(url != null\){)Tj +T* +( return url;)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( return URL;)Tj +0 -1.79 TD +( })Tj +0 -3.58 TD +( XRay initializeXRay\(Map map\) {)Tj +0 -1.79 TD +( String url = extractUrl\(map\);)Tj +0 -1.79 TD +( return new XRay\(url\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 75: X-r)Tj +5.99 0 Td +(a)Tj +0.47 0 Td +(y Integr)Tj +3.211 0 Td +(ation with )Tj +4.577 0 Td +(Adapter)Tj +-12.448 -2.24 Td +(In )Tj +1.121 0 Td +(contr)Tj +2.211 0 Td +(ast )Tj +1.454 0 Td +(to )Tj +1.121 0 Td +(a )Tj +0.787 0 Td +(pure )Tj +2.195 0 Td +(Adapter )Tj +3.677 0 Td +(pattern )Tj +3.288 0 Td +(implementation)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +7.317 0 Td +(the )Tj +/TT1 1 Tf +1.621 0 Td +(XRayModel)Tj +/TT0 1 Tf +( )Tj +5.688 0 Td +(class )Tj +2.343 0 Td +(does )Tj +2.288 0 Td +(not )Tj +1.677 0 Td +(delegate )Tj +-38.588 -1.44 Td +(an)Tj +1.038 0 Td +(ything )Tj +3.049 0 Td +(to )Tj +1.215 0 Td +(the )Tj +/TT1 1 Tf +1.715 0 Td +(XRay)Tj +/TT0 1 Tf +( )Tj +2.744 0 Td +(API )Tj +1.882 0 Td +(class; )Tj +2.715 0 Td +(r)Tj +0.321 0 Td +(ather)Tj +2.093 0 Td +(, )Tj +0.659 0 Td +(it )Tj +0.937 0 Td +(exposes )Tj +3.771 0 Td +(the )Tj +/TT1 1 Tf +1.715 0 Td +(XRay)Tj +/TT0 1 Tf +( )Tj +2.781 0 Td +(class )Tj +2.437 0 Td +(with )Tj +2.271 0 Td +(a )Tj +0.881 0 Td +(getter)Tj +2.315 0 Td +(. )Tj +0.762 0 Td +( )Tj +0.307 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.437 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erridden )Tj +-38.588 -1.44 Td +(method )Tj +/TT1 1 Tf +3.668 0 Td +(getModelName)Tj +/TT0 1 Tf +( )Tj +7.59 0 Td +(returns )Tj +3.334 0 Td +(the )Tj +1.723 0 Td +(name )Tj +2.778 0 Td +(to )Tj +1.223 0 Td +(be )Tj +1.445 0 Td +(used )Tj +2.39 0 Td +(in )Tj +1.223 0 Td +(the )Tj +1.723 0 Td +(template )Tj +4.112 0 Td +(to )Tj +1.223 0 Td +(access )Tj +3.167 0 Td +(the )Tj +1.723 0 Td +(model. )Tj +3.316 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/C2_0 1 Tf +-41.144 -1.44 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.937 0 Td +(segment )Tj +3.937 0 Td +(in )Tj +1.215 0 Td +(the )Tj +1.715 0 Td +(path )Tj +/TT1 1 Tf +2.271 0 Td +($xraymodel.xray.mostPopularAsHtml)Tj +/TT0 1 Tf +( )Tj +20.184 0 Td +(is )Tj +1.048 0 Td +(the )Tj +1.715 0 Td +(return )Tj +2.937 0 Td +(v)Tj +0.476 0 Td +(alue )Tj +2.215 0 Td +(of )Tj +1.215 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(getModelName)Tj +/TT0 1 Tf +( )Tj +7.614 0 Td +(method, )Tj +3.97 0 Td +(the )Tj +1.746 0 Td +(next )Tj +2.247 0 Td +(is )Tj +1.079 0 Td +(the )Tj +/TT1 1 Tf +1.746 0 Td +(XRayModel#getXray\(\))Tj +/TT0 1 Tf +( )Tj +11.814 0 Td +(method)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.941 0 Td +(and )Tj +2.025 0 Td +(the )Tj +1.746 0 Td +(last )Tj +1.857 0 Td +(is )Tj +1.079 0 Td +(the )Tj +-40.866 -1.44 Td +(property of the )Tj +/TT1 1 Tf +(XRay)Tj +/TT0 1 Tf +( object itself.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.458 0 Td +(XRayModel)Tj +/TT0 1 Tf +( )Tj +5.803 0 Td +(class )Tj +2.458 0 Td +(together )Tj +3.903 0 Td +(with )Tj +2.292 0 Td +(the )Tj +/TT1 1 Tf +1.736 0 Td +(XRay)Tj +/TT0 1 Tf +( )Tj +2.802 0 Td +(client )Tj +2.792 0 Td +(are )Tj +1.735 0 Td +(pac)Tj +1.538 0 Td +(kaged )Tj +2.958 0 Td +(in )Tj +1.236 0 Td +(a )Tj +0.902 0 Td +(self-containing )Tj +6.738 0 Td +(J)Tj +0.26 0 Td +(AR)Tj +( )Tj +ET + +endstream +endobj +306 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 307 0 R>>endobj +307 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(130)Tj +/C2_0 1 Tf +0 Tc 0 Tw -20.132 57.06 Td +<005D>Tj +/TT0 1 Tf +(le and deplo)Tj +5.936 0 Td +(y)Tj +0.482 0 Td +(ed together with the Roller application.)Tj +ET + +endstream +endobj +308 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 310 0 R>>endobj +309 0 obj<>endobj +310 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(131)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +(Dev)Tj +1.766 0 Td +(elopment Process)Tj +64 0 0 64 443.416 539.8 Tm +(6)Tj +/TT0 1 Tf +10 0 0 10 75 461.4 Tm +(Dev)Tj +1.766 0 Td +(elopment )Tj +4.392 0 Td +(of )Tj +1.169 0 Td +(enterprise )Tj +4.558 0 Td +(applications )Tj +5.56 0 Td +(shouldn\222)Tj +3.688 0 Td +(t )Tj +0.613 0 Td +(be )Tj +1.391 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.835 0 Td +(different )Tj +3.892 0 Td +(than )Tj +2.225 0 Td +(dev)Tj +1.544 0 Td +(elopment )Tj +4.392 0 Td +(of )Tj +1.169 0 Td +(plain )Tj +-40.032 -1.44 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.876 0 Td +(SE )Tj +1.377 0 Td +(applications. )Tj +5.879 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.876 0 Td +(SE )Tj +1.377 0 Td +(applications )Tj +5.601 0 Td +(are )Tj +1.709 0 Td +(built )Tj +2.322 0 Td +(according )Tj +4.655 0 Td +(to )Tj +1.21 0 Td +(the )Tj +1.71 0 Td +(\223Write, )Tj +3.487 0 Td +(Compile, )Tj +4.248 0 Td +(T)Tj +0.456 0 Td +(est, )Tj +1.821 0 Td +(Run\224 )Tj +-40.033 -1.44 Td +(c)Tj +0.476 0 Td +(ycle, )Tj +2.668 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.168 0 Td +(should )Tj +3.503 0 Td +(also )Tj +2.335 0 Td +(be )Tj +1.668 0 Td +(applicable )Tj +5.114 0 Td +(to )Tj +1.446 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.112 0 Td +(EE )Tj +1.612 0 Td +(applications. )Tj +6.115 0 Td +(Unfortunately)Tj +5.855 0 Td +(, )Tj +0.89 0 Td +(because )Tj +4.113 0 Td +(of )Tj +-41.366 -1.44 Td +(dependencies )Tj +6.572 0 Td +(on )Tj +1.737 0 Td +(external )Tj +4.07 0 Td +(resour)Tj +2.655 0 Td +(ces )Tj +2.014 0 Td +(and )Tj +2.237 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.458 0 Td +(runtime, )Tj +4.237 0 Td +(running )Tj +3.96 0 Td +(and )Tj +2.237 0 Td +(testing )Tj +3.404 0 Td +(an )Tj +1.681 0 Td +(enterprise )Tj +-37.977 -1.44 Td +(application )Tj +5.203 0 Td +(without )Tj +3.647 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.867 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(ement )Tj +3.034 0 Td +(takes )Tj +2.534 0 Td +(too )Tj +1.757 0 Td +(long. )Tj +2.498 0 Td +(Also )Tj +2.257 0 Td +(setup, )Tj +/C2_0 1 Tf +2.924 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.785 0 Td +(and )Tj +1.979 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +-39.533 -1.44 Td +(are )Tj +1.785 0 Td +(too )Tj +1.842 0 Td +(complex )Tj +4.175 0 Td +(to )Tj +1.286 0 Td +(be )Tj +1.508 0 Td +(performed )Tj +4.897 0 Td +(in )Tj +1.286 0 Td +(an )Tj +1.508 0 Td +(ad-hoc )Tj +3.453 0 Td +(manner )Tj +3.73 0 Td +(manually)Tj +3.909 0 Td +(. )Tj +0.73 0 Td +(By )Tj +1.563 0 Td +(splitting )Tj +3.843 0 Td +(the )Tj +1.786 0 Td +(testing )Tj +3.231 0 Td +(into )Tj +-40.532 -1.44 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.229 0 Td +(manageable )Tj +5.674 0 Td +(c)Tj +0.482 0 Td +(hunks, )Tj +3.286 0 Td +(and )Tj +2.063 0 Td +(introducing )Tj +5.398 0 Td +(automated )Tj +5.008 0 Td +(setup, )Tj +/C2_0 1 Tf +3.008 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.869 0 Td +(and )Tj +2.063 0 Td +(deplo)Tj +2.434 0 Td +(yment, )Tj +-39.255 -1.44 Td +(y)Tj +0.482 0 Td +(ou can get remarkably close to a build c)Tj +17.26 0 Td +(ycle of a plain J)Tj +6.658 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a SE application. )Tj +-23.546 -2.24 Td +(A )Tj +1.148 0 Td +(fully )Tj +2.371 0 Td +(automated )Tj +5.038 0 Td +(build )Tj +2.705 0 Td +(and )Tj +2.093 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.148 0 Td +(c)Tj +0.476 0 Td +(ycle )Tj +2.259 0 Td +(is )Tj +1.148 0 Td +(the )Tj +/C2_0 1 Tf +1.815 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +2.037 0 Td +(step )Tj +2.204 0 Td +(to)Tj +0.822 0 Td +(w)Tj +0.76 0 Td +(ards )Tj +2.259 0 Td +(the )Tj +1.815 0 Td +(DevOps )Tj +4.037 0 Td +(idea)Tj +( )Tj +-40.366 -1.44 Td +(\()Tj +(http://en.wikipedia.org/wiki/DevOps)Tj +(\), )Tj +16.96 0 Td +(w)Tj +0.76 0 Td +(here )Tj +2.342 0 Td +(the )Tj +1.787 0 Td +(boundary )Tj +4.566 0 Td +(between )Tj +4.121 0 Td +(dev)Tj +1.544 0 Td +(elopers )Tj +3.565 0 Td +(and )Tj +2.065 0 Td +(oper)Tj +1.933 0 Td +(ations )Tj +-39.643 -1.44 Td +(blurs.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.417 0 Td +(separ)Tj +2.266 0 Td +(ation )Tj +2.529 0 Td +(between )Tj +4.029 0 Td +(dev)Tj +1.544 0 Td +(elopers )Tj +3.473 0 Td +(and )Tj +1.973 0 Td +(oper)Tj +1.933 0 Td +(ations )Tj +2.918 0 Td +(is )Tj +1.028 0 Td +(r)Tj +0.321 0 Td +(ather )Tj +/C2_0 1 Tf +2.528 0 Td +<0039004A004C0041005D>Tj +/TT0 1 Tf +(cial. )Tj +4.103 0 Td +(A )Tj +1.028 0 Td +(dev)Tj +1.544 0 Td +(eloper )Tj +3.084 0 Td +(has )Tj +1.806 0 Td +(to )Tj +1.195 0 Td +(set )Tj +-41.033 -1.44 Td +(up )Tj +1.429 0 Td +(the )Tj +1.65 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.706 0 Td +(for )Tj +1.483 0 Td +(dev)Tj +1.544 0 Td +(elopment )Tj +4.373 0 Td +(and )Tj +1.929 0 Td +(test )Tj +1.762 0 Td +(and )Tj +1.928 0 Td +(could )Tj +2.763 0 Td +(reuse )Tj +2.595 0 Td +(his )Tj +1.54 0 Td +(automated )Tj +4.873 0 Td +(process )Tj +3.54 0 Td +(for )Tj +1.483 0 Td +(building )Tj +-38.642 -1.44 Td +(the )Tj +1.877 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.711 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.933 0 Td +(and )Tj +2.155 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.599 0 Td +(the )Tj +1.877 0 Td +(production )Tj +5.268 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.933 0 Td +(as )Tj +1.432 0 Td +(well. )Tj +2.655 0 Td +(DevOps )Tj +4.099 0 Td +(tries )Tj +2.321 0 Td +(to )Tj +-41.366 -1.44 Td +(automate )Tj +4.554 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.886 0 Td +(reasonable )Tj +5.221 0 Td +(step )Tj +2.276 0 Td +(and )Tj +2.165 0 Td +(treat )Tj +2.442 0 Td +(the )Tj +1.887 0 Td +(recipe )Tj +3.22 0 Td +(as )Tj +1.442 0 Td +(code. )Tj +2.906 0 Td +(A )Tj +1.22 0 Td +(fully )Tj +2.443 0 Td +(automated )Tj +5.11 0 Td +(process )Tj +3.776 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(repeatable, )Tj +5.151 0 Td +(so )Tj +1.317 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.484 0 Td +(can )Tj +1.928 0 Td +(apply )Tj +2.762 0 Td +(the )Tj +1.706 0 Td +(same )Tj +2.594 0 Td +(par)Tj +1.377 0 Td +(ameterized )Tj +5.15 0 Td +(automation )Tj +5.263 0 Td +(for )Tj +1.539 0 Td +(local, )Tj +2.762 0 Td +(test, )Tj +2.095 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.54 0 Td +(and )Tj +-40.588 -1.44 Td +(ev)Tj +0.988 0 Td +(en production en)Tj +7.381 0 Td +(vironments.)Tj +/TT1 1 Tf +12 0 0 12 57 178.6001 Tm +(Build and Deplo)Tj +7.103 0 Td +(yment)Tj +/TT0 1 Tf +10 0 0 10 75 156.2001 Tm +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.837 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.226 0 Td +(dev)Tj +1.544 0 Td +(eloped )Tj +3.283 0 Td +(with )Tj +2.227 0 Td +(NetBeans )Tj +4.449 0 Td +(7 )Tj +0.893 0 Td +(\(J)Tj +0.544 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.837 0 Td +(EE )Tj +1.337 0 Td +(edition, )Tj +3.617 0 Td +(http://www)Tj +4.762 0 Td +(.netbeans.org\))Tj +(, )Tj +6.673 0 Td +(tested )Tj +2.838 0 Td +(with )Tj +-40.31 -1.44 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.557 0 Td +(v3.1, )Tj +2.502 0 Td +(and )Tj +1.946 0 Td +(built )Tj +2.28 0 Td +(with )Tj +2.224 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.39 0 Td +(3 )Tj +0.89 0 Td +(as )Tj +1.223 0 Td +(a )Tj +0.834 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.834 0 Td +(EE )Tj +1.334 0 Td +(6 )Tj +0.89 0 Td +(project. )Tj +3.613 0 Td +(It )Tj +0.89 0 Td +(consists )Tj +3.669 0 Td +(of )Tj +1.168 0 Td +(eight )Tj +2.446 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.39 0 Td +(projects)Tj +( )Tj +-38.81 -1.44 Td +(\(some )Tj +3.12 0 Td +(are )Tj +1.897 0 Td +(prototypes\). )Tj +5.548 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.62 0 Td +(bac)Tj +1.538 0 Td +(k-end )Tj +3.009 0 Td +(code )Tj +2.676 0 Td +(discussed )Tj +4.677 0 Td +(in )Tj +1.398 0 Td +(this )Tj +2.065 0 Td +(book )Tj +2.732 0 Td +(comes )Tj +3.342 0 Td +(from )Tj +2.564 0 Td +(the )Tj +/TT3 1 Tf +1.898 0 Td +(x-ray-)Tj +-38.599 -1.44 Td +(services)Tj +/TT0 1 Tf +( )Tj +5.167 0 Td +(module. )Tj +3.849 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT3 1 Tf +1.422 0 Td +(x-ray-services)Tj +/TT0 1 Tf +( )Tj +8.767 0 Td +(module )Tj +3.645 0 Td +(is )Tj +1.033 0 Td +(a )Tj +0.866 0 Td +(self-contained )Tj +6.424 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.866 0 Td +(EE )Tj +1.366 0 Td +(6 )Tj +0.885 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +/C2_0 1 Tf +1.644 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.7 0 Td +(with )Tj +-40.31 -1.44 Td +(REST)Tj +2.056 0 Td +(, EJB beans, CDI managed beans, and JP)Tj +17.23 0 Td +(A 2 entities. )Tj +-17.486 -2.24 Td +(I created the structure of the J)Tj +12.604 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 project with a Ma)Tj +10.474 0 Td +(v)Tj +0.488 0 Td +(en plug-in called \223ar)Tj +8.824 0 Td +(c)Tj +0.482 0 Td +(hetype\224 )Tj +ET + +endstream +endobj +311 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 312 0 R>>endobj +312 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(132)Tj +0 Tc 0 Tw -20.132 57.06 Td +(\()Tj +(http://ma)Tj +4.083 0 Td +(v)Tj +0.488 0 Td +(en.apac)Tj +3.372 0 Td +(he.org/ar)Tj +3.822 0 Td +(c)Tj +0.482 0 Td +(hetype/ma)Tj +4.471 0 Td +(v)Tj +0.488 0 Td +(en-ar)Tj +2.21 0 Td +(c)Tj +0.482 0 Td +(hetype-plugin/)Tj +(\). )Tj +7.172 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hetype )Tj +3.318 0 Td +(is )Tj +1.095 0 Td +(a )Tj +0.928 0 Td +(wizard-like )Tj +5.262 0 Td +(plug-in )Tj +-39.143 -1.44 Td +(that )Tj +1.946 0 Td +(creates )Tj +/C2_0 1 Tf +3.334 0 Td +<0048004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +6.336 0 Td +(projects )Tj +3.724 0 Td +(for )Tj +1.501 0 Td +(v)Tj +0.476 0 Td +(arious )Tj +2.946 0 Td +(tec)Tj +1.26 0 Td +(hnologies. )Tj +4.781 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.223 0 Td +(the )Tj +1.668 0 Td +(initial )Tj +2.78 0 Td +(creation )Tj +3.835 0 Td +(of )Tj +1.168 0 Td +(a )Tj +0.834 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.834 0 Td +(EE )Tj +1.334 0 Td +(6)Tj +( )Tj +-41.644 -1.44 Td +(W)Tj +/C2_0 1 Tf +0.955 0 Td +<001D002E0001005D>Tj +/TT0 1 Tf +(le, projects in the webapp-ja)Tj +14.365 0 Td +(v)Tj +0.476 0 Td +(aee6 artifact can be used \(see Listing 76\).)Tj +/TT1 1 Tf +-15.796 -1.79 Td +(mvn -Darchetype.interactive=true -)Tj +0 -0.99 TD +(DarchetypeGroupId=org.codehaus.mojo.archetypes -)Tj +T* +(DarchetypeArtifactId=webapp-javaee6 archetype:generate)Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 76: J)Tj +4.991 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 Project Gener)Tj +8.824 0 Td +(ation with Ma)Tj +5.973 0 Td +(v)Tj +0.488 0 Td +(en)Tj +-19.422 -2.24 Td +(T)Tj +0.511 0 Td +(here )Tj +2.239 0 Td +(is )Tj +1.017 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.406 0 Td +(a )Tj +0.85 0 Td +(more )Tj +2.572 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.018 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.85 0 Td +(to )Tj +1.184 0 Td +(create )Tj +2.961 0 Td +(a )Tj +0.85 0 Td +(project )Tj +3.351 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.85 0 Td +(just )Tj +1.851 0 Td +(skipping )Tj +3.963 0 Td +(all )Tj +1.406 0 Td +(par)Tj +1.377 0 Td +(ameters )Tj +3.683 0 Td +(and )Tj +-40.588 -1.44 Td +(executing )Tj +4.611 0 Td +(the )Tj +1.777 0 Td +(plain )Tj +/TT1 1 Tf +2.611 0 Td +(mvn )Tj +2.565 0 Td +(archetype:generate)Tj +/TT0 1 Tf +( )Tj +11.245 0 Td +(command. )Tj +4.981 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.666 0 Td +(starts )Tj +2.61 0 Td +(an )Tj +1.499 0 Td +(inter)Tj +1.933 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.943 0 Td +(wizard, )Tj +-38.977 -1.44 Td +(lists all a)Tj +3.694 0 Td +(v)Tj +0.476 0 Td +(ailable ar)Tj +3.989 0 Td +(c)Tj +0.482 0 Td +(hetypes, and prompts y)Tj +9.986 0 Td +(ou for a number:)Tj +/TT1 1 Tf +-18.627 -1.79 Td +(\205)Tj +0 -1.79 TD +(256: remote -> webapp-j2ee14 \(J2EE 1.4 web application archetype\))Tj +/TT2 1 Tf +T* +(257: remote -> webapp-javaee6 \(Archetype for a web application using )Tj +0 -0.99 TD +(Java EE 6.\))Tj +/TT1 1 Tf +0 -1.79 TD +(258: remote -> webapp-jee5 \(JEE 5 web application archetype\))Tj +T* +(\205)Tj +/TT0 1 Tf +1.8 -2.24 Td +(Choosing )Tj +4.46 0 Td +(\223257\224 )Tj +2.958 0 Td +(initiates )Tj +3.737 0 Td +(the )Tj +1.736 0 Td +(gener)Tj +2.377 0 Td +(ation )Tj +2.57 0 Td +(of )Tj +1.236 0 Td +(an )Tj +1.458 0 Td +(empty )Tj +3.069 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.902 0 Td +(EE )Tj +1.402 0 Td +(6 )Tj +0.921 0 Td +(W)Tj +0.955 0 Td +(AR )Tj +1.68 0 Td +(project, )Tj +3.681 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.958 0 Td +(can )Tj +1.958 0 Td +(be)Tj +( )Tj +-41.144 -1.44 Td +(opened )Tj +3.809 0 Td +(with )Tj +2.475 0 Td +(an)Tj +1.038 0 Td +(y )Tj +1.085 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en-capable )Tj +5.364 0 Td +(IDE. )Tj +2.327 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.697 0 Td +(shouldn\222)Tj +3.688 0 Td +(t )Tj +0.863 0 Td +(use )Tj +2.03 0 Td +(the )Tj +1.919 0 Td +(c)Tj +0.482 0 Td +(hosen )Tj +3.142 0 Td +(number )Tj +3.919 0 Td +(for )Tj +1.752 0 Td +(automatic )Tj +-37.921 -1.44 Td +(gener)Tj +2.377 0 Td +(ation )Tj +2.503 0 Td +(of )Tj +1.169 0 Td +(projects )Tj +3.725 0 Td +(in )Tj +1.169 0 Td +(the )Tj +1.669 0 Td +(bac)Tj +1.538 0 Td +(kground, )Tj +4.17 0 Td +(because )Tj +3.836 0 Td +(the )Tj +1.669 0 Td +(number )Tj +3.669 0 Td +(can )Tj +1.891 0 Td +(c)Tj +0.482 0 Td +(hange )Tj +2.947 0 Td +(at )Tj +1.113 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.835 0 Td +(time. )Tj +2.502 0 Td +(In )Tj +1.169 0 Td +(fact, )Tj +2.169 0 Td +(it )Tj +-41.644 -1.44 Td +(alread)Tj +2.643 0 Td +(y c)Tj +1.26 0 Td +(hanged to \223260\224 during the writing of this book.)Tj +-2.103 -2.24 Td +(I )Tj +0.847 0 Td +(created )Tj +3.736 0 Td +(the )Tj +1.903 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.069 0 Td +(services )Tj +3.958 0 Td +(project )Tj +3.57 0 Td +(with )Tj +2.459 0 Td +(the )Tj +1.903 0 Td +(NetBeans )Tj +4.681 0 Td +(7 )Tj +1.125 0 Td +(wizard, )Tj +3.792 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +1.125 0 Td +(uses )Tj +2.403 0 Td +(the )Tj +1.903 0 Td +(same)Tj +( )Tj +-39.978 -1.44 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hetypes )Tj +3.901 0 Td +(\(see )Tj +2.289 0 Td +(Listing )Tj +3.401 0 Td +(76\) )Tj +2.012 0 Td +(to )Tj +1.456 0 Td +(create )Tj +3.233 0 Td +(the )Tj +/TT1 1 Tf +1.956 0 Td +(x-ray-services)Tj +/TT0 1 Tf +( )Tj +9.024 0 Td +(project )Tj +3.623 0 Td +(initially)Tj +3.132 0 Td +(. )Tj +0.9 0 Td +(By )Tj +1.733 0 Td +(using )Tj +2.901 0 Td +(the )Tj +-40.866 -1.44 Td +(NetBeans )Tj +4.463 0 Td +(7 )Tj +0.907 0 Td +(wizard, )Tj +3.574 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.796 0 Td +(project )Tj +3.352 0 Td +(is )Tj +1.018 0 Td +(truly )Tj +2.296 0 Td +(independent )Tj +5.743 0 Td +(of )Tj +1.185 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.851 0 Td +(IDE; )Tj +2.185 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.463 0 Td +(can )Tj +1.907 0 Td +(s)Tj +0.377 0 Td +(witc)Tj +1.816 0 Td +(h )Tj +0.907 0 Td +(bac)Tj +1.538 0 Td +(k )Tj +0.851 0 Td +(and )Tj +1.963 0 Td +(forth )Tj +-40.199 -1.44 Td +(between )Tj +4.006 0 Td +(IDEs )Tj +2.283 0 Td +(as )Tj +1.227 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.45 0 Td +(like. )Tj +2.172 0 Td +(Listing )Tj +3.117 0 Td +(77 )Tj +1.45 0 Td +(sho)Tj +1.489 0 Td +(ws )Tj +1.505 0 Td +(a )Tj +0.838 0 Td +(slightly )Tj +3.395 0 Td +(extended )Tj +/TT1 1 Tf +4.284 0 Td +(pom.xml)Tj +/TT0 1 Tf +( )Tj +4.539 0 Td +(with )Tj +2.228 0 Td +(test )Tj +1.783 0 Td +(dependencies )Tj +-36.253 -1.44 Td +(created b)Tj +3.983 0 Td +(y the )Tj +/TT1 1 Tf +(archetype:generate)Tj +/TT0 1 Tf +( plug-in:)Tj +/TT1 1 Tf +-3.983 -1.79 Td +()Tj +0 -1.79 TD +( 4.0.0)Tj +T* +( com.abien.xray)Tj +T* +( x-ray-services)Tj +T* +( war)Tj +T* +( 1.0-SNAPSHOT)Tj +T* +( x-ray-services Java EE 6 Webapp)Tj +ET + +endstream +endobj +313 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 314 0 R>>endobj +314 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(133)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( http://maven.apache.org)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( )Tj +0 -1.79 TD +( )Tj +T* +( java.net)Tj +T* +( Repository hosting the Glassfish)Tj +T* +( http://download.java.net/maven/glassfish/)Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( maven2.java.net)Tj +T* +( Java.net Repository for Maven 2)Tj +T* +( http://download.java.net/maven/2)Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( org.glassfish.extras)Tj +0 -1.79 TD +( glassfish-embedded-all)Tj +0 -1.79 TD +( 3.0.1)Tj +T* +( provided)Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( org.apache.maven.plugins)Tj +T* +( maven-compiler-plugin)Tj +T* +( 2.3.2)Tj +T* +( )Tj +T* +( 1.6)Tj +ET + +endstream +endobj +315 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 316 0 R>>endobj +316 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(134)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( 1.6)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( )Tj +0 -1.79 TD +( )Tj +T* +( )Tj +T* +( org.apache.maven.plugins)Tj +T* +( maven-war-plugin)Tj +T* +( 2.1)Tj +T* +( )Tj +T* +( false)Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( org.apache.maven.plugins)Tj +T* +( maven-failsafe-plugin)Tj +T* +( 2.7.1)Tj +T* +( )Tj +T* +( )Tj +T* +( x-ray)Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +()Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 77: Complete J)Tj +9.437 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 )Tj +2.853 0 Td +(W)Tj +/C2_0 1 Tf +0.955 0 Td +<001D002E0001001E004D00410044003C0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +7.825 0 Td +(ation pom.xml)Tj +-20.216 -2.24 Td +(By )Tj +1.474 0 Td +(default, )Tj +/TT1 1 Tf +3.587 0 Td +(x-ray-services)Tj +/TT0 1 Tf +( )Tj +8.764 0 Td +(is )Tj +1.03 0 Td +(built )Tj +2.309 0 Td +(with )Tj +2.253 0 Td +(the )Tj +1.697 0 Td +(standard )Tj +/TT1 1 Tf +4.031 0 Td +(mvn)Tj +/TT0 1 Tf +( )Tj +2.163 0 Td +(\()Tj +/TT1 1 Tf +(clean)Tj +/TT0 1 Tf +(\) )Tj +/TT1 1 Tf +3.919 0 Td +(install)Tj +/TT0 1 Tf +( )Tj +4.563 0 Td +(command. )Tj +-37.588 -1.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.533 0 Td +(result )Tj +2.811 0 Td +(is )Tj +1.144 0 Td +(an )Tj +/TT1 1 Tf +1.533 0 Td +(x-ray.war)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +5.878 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.811 0 Td +(that )Tj +2.089 0 Td +(can )Tj +2.033 0 Td +(be )Tj +1.533 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.533 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.977 0 Td +(dropping )Tj +4.368 0 Td +(it )Tj +1.033 0 Td +(into )Tj +2.145 0 Td +(the )Tj +/TT1 1 Tf +1.811 0 Td +(glassfish/)Tj +-36.199 -1.44 Td +(domains/x-ray/autodeploy)Tj +/TT0 1 Tf +( )Tj +14.946 0 Td +(folder)Tj +2.427 0 Td +(. )Tj +0.784 0 Td +(A )Tj +/C2_0 1 Tf +1.21 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.877 0 Td +(system )Tj +3.432 0 Td +(cop)Tj +1.594 0 Td +(y )Tj +1.043 0 Td +(w)Tj +0.766 0 Td +(orks, )Tj +2.599 0 Td +(but )Tj +1.933 0 Td +(doesn\222)Tj +2.798 0 Td +(t )Tj +0.821 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.043 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.655 0 Td +(an)Tj +1.038 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(feedbac)Tj +3.372 0 Td +(k about the deplo)Tj +7.548 0 Td +(yment\222)Tj +2.853 0 Td +(s success. )Tj +/TT1 1 Tf +-13.773 -1.79 Td +(#!/bin/bash)Tj +0 -1.79 TD +(GLASSFISH_HOME=[PATH TO GLASSFISH]/glassfish3.1-current)Tj +T* +(XRAY_WAR=[PATH TO PROJECT]/x-ray/x-ray-services/target/x-ray.war)Tj +T* +($GLASSFISH_HOME/bin/asadmin --port 5348 deploy --force $XRAY_WAR)Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 78: )Tj +4.688 0 Td +(W)Tj +0.955 0 Td +(AR Deplo)Tj +4.212 0 Td +(yment with Command Line Interface)Tj +-8.055 -2.24 Td +(Instead )Tj +3.443 0 Td +(of )Tj +1.22 0 Td +(using )Tj +2.665 0 Td +(a )Tj +0.886 0 Td +(simple )Tj +3.22 0 Td +(cop)Tj +1.594 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.664 0 Td +(GlassF)Tj +2.816 0 Td +(ish\222)Tj +1.409 0 Td +(s )Tj +/TT1 1 Tf +0.775 0 Td +(asadmin)Tj +/TT0 1 Tf +( )Tj +4.587 0 Td +(command )Tj +4.72 0 Td +(line )Tj +1.998 0 Td +(interface )Tj +4.109 0 Td +(is )Tj +1.053 0 Td +(a )Tj +0.886 0 Td +(far )Tj +1.497 0 Td +(better )Tj +-39.755 -1.44 Td +(alternati)Tj +3.483 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.934 0 Td +(for )Tj +1.601 0 Td +(application )Tj +5.27 0 Td +(deplo)Tj +2.434 0 Td +(yment. )Tj +3.305 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.49 0 Td +(asadmin)Tj +/TT0 1 Tf +( )Tj +4.635 0 Td +(command )Tj +4.768 0 Td +(bloc)Tj +1.872 0 Td +(ks )Tj +1.323 0 Td +(until )Tj +2.38 0 Td +(the )Tj +1.768 0 Td +(application )Tj +5.27 0 Td +(is )Tj +ET + +endstream +endobj +317 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 318 0 R>>endobj +318 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(135)Tj +0 Tc 0 Tw -20.132 57.06 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.423 0 Td +(and )Tj +1.979 0 Td +(it )Tj +0.923 0 Td +(informs )Tj +3.59 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.479 0 Td +(about )Tj +2.813 0 Td +(the )Tj +1.701 0 Td +(outcome. )Tj +4.387 0 Td +(An )Tj +1.59 0 Td +(executable )Tj +5.035 0 Td +(bash )Tj +2.368 0 Td +(script )Tj +2.701 0 Td +(wr)Tj +1.099 0 Td +(aps )Tj +1.812 0 Td +(the )Tj +/TT1 1 Tf +1.701 0 Td +(asadmin)Tj +/TT0 1 Tf +( )Tj +-37.999 -1.44 Td +(command and makes it reusable \(see Listing 78\). )Tj +1.8 -2.24 Td +(NetBeans )Tj +4.609 0 Td +(also )Tj +2.22 0 Td +(supports )Tj +4.11 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.72 0 Td +(deplo)Tj +2.434 0 Td +(yments )Tj +3.553 0 Td +(with )Tj +2.387 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.553 0 Td +(directly )Tj +3.72 0 Td +(from )Tj +2.497 0 Td +(the )Tj +1.831 0 Td +(IDE, )Tj +2.331 0 Td +(so )Tj +1.442 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +3.204 0 Td +(script )Tj +2.871 0 Td +(described )Tj +4.705 0 Td +(here )Tj +2.426 0 Td +(is )Tj +1.204 0 Td +(used )Tj +2.538 0 Td +(only )Tj +2.427 0 Td +(for )Tj +1.704 0 Td +(automated )Tj +5.094 0 Td +(deplo)Tj +2.434 0 Td +(yments )Tj +3.593 0 Td +(to )Tj +1.371 0 Td +(an )Tj +1.593 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +-40.032 -1.44 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.777 0 Td +(or )Tj +1.276 0 Td +(during )Tj +3.166 0 Td +(load )Tj +2.277 0 Td +(tests. )Tj +2.499 0 Td +(No )Tj +/C2_0 1 Tf +1.721 0 Td +<002500200021000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +5.555 0 Td +(extensions )Tj +4.889 0 Td +(are )Tj +1.72 0 Td +(required. )Tj +4.277 0 Td +(NetBeans )Tj +4.499 0 Td +(7 )Tj +0.943 0 Td +(uses )Tj +2.221 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(plain )Tj +/TT1 1 Tf +(pom.xml)Tj +/TT0 1 Tf +( without an)Tj +/C2_0 1 Tf +11.521 0 Td +<00510001004B0048003D003B0041005D>Tj +<003B0001005D>Tj +/TT0 1 Tf +(les or extensions.)Tj +/TT2 1 Tf +12 0 0 12 57 513.2 Tm +(Continuous Integr)Tj +7.88 0 Td +(ation and QA)Tj +/TT0 1 Tf +10 0 0 10 75 490.8 Tm +(T)Tj +/C2_0 1 Tf +0.456 0 Td +<004700010048003D004A003E0047004A00450001004C0040003D0001003A004D00410044003C000100410046000100390001003B0044003D0039004A004400510001003C003D005D>Tj +/TT0 1 Tf +(ned en)Tj +18.218 0 Td +(vironment, Hudson )Tj +-20.474 -1.44 Td +(\()Tj +(http://ja)Tj +3.528 0 Td +(v)Tj +0.476 0 Td +(a.net/projects/hudson)Tj +(\) )Tj +9.81 0 Td +(and )Tj +1.917 0 Td +(J)Tj +0.266 0 Td +(enkins )Tj +3.084 0 Td +(\()Tj +(http://jenkins-ci.org)Tj +(\) )Tj +9.198 0 Td +(use )Tj +1.75 0 Td +(exactly )Tj +3.361 0 Td +(the )Tj +1.639 0 Td +(same )Tj +2.527 0 Td +(project )Tj +/C2_0 1 Tf +3.306 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +-40.866 -1.44 Td +(as the IDE \()Tj +/TT1 1 Tf +(pom.xml)Tj +/TT0 1 Tf +(\) and execute the build on the centr)Tj +24.421 0 Td +(al serv)Tj +2.766 0 Td +(er)Tj +0.759 0 Td +(. )Tj +-26.146 -2.24 Td +(A )Tj +1.194 0 Td +(Mer)Tj +1.71 0 Td +(curial )Tj +2.972 0 Td +(\()Tj +(http://mer)Tj +4.434 0 Td +(curial.selenic.com/)Tj +(\) )Tj +8.974 0 Td +(or )Tj +1.416 0 Td +(Git )Tj +1.861 0 Td +(\()Tj +(http://git-scm.com/)Tj +(\) )Tj +9.141 0 Td +(\223push\224 )Tj +3.472 0 Td +(\(or )Tj +1.694 0 Td +(an )Tj +1.583 0 Td +(SVN )Tj +-40.255 -1.44 Td +(commit\) )Tj +3.892 0 Td +(sends )Tj +2.726 0 Td +(a )Tj +0.836 0 Td +(GET )Tj +2.17 0 Td +(request )Tj +3.448 0 Td +(to )Tj +1.17 0 Td +(the )Tj +1.67 0 Td +(Hudson )Tj +3.727 0 Td +(or )Tj +1.225 0 Td +(J)Tj +0.266 0 Td +(enkins )Tj +3.078 0 Td +(API, )Tj +2.115 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.892 0 Td +(initiates )Tj +3.671 0 Td +(a )Tj +0.836 0 Td +(fresh )Tj +2.392 0 Td +(c)Tj +0.482 0 Td +(hec)Tj +1.538 0 Td +(kout. )Tj +2.43 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +-41.144 -1.44 Td +(changegroup)Tj +/TT0 1 Tf +( )Tj +6.882 0 Td +(hook )Tj +2.449 0 Td +(in )Tj +1.115 0 Td +(the )Tj +1.615 0 Td +(Mer)Tj +1.71 0 Td +(curial )Tj +/C2_0 1 Tf +2.726 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +/TT1 1 Tf +2.449 0 Td +(.hg/hgrc)Tj +/TT0 1 Tf +( )Tj +5.082 0 Td +(updates )Tj +3.616 0 Td +(the )Tj +1.615 0 Td +(\223master\224 )Tj +4.002 0 Td +(repository )Tj +4.56 0 Td +(to )Tj +-41.366 -1.44 Td +(the )Tj +1.634 0 Td +(current )Tj +3.357 0 Td +(release )Tj +3.301 0 Td +(and )Tj +1.913 0 Td +(starts )Tj +2.467 0 Td +(the )Tj +1.634 0 Td +(Hudson )Tj +3.692 0 Td +(or )Tj +1.189 0 Td +(J)Tj +0.266 0 Td +(enkins )Tj +3.08 0 Td +(build )Tj +2.525 0 Td +(job )Tj +1.69 0 Td +(using )Tj +2.58 0 Td +(an )Tj +1.356 0 Td +(HTTP )Tj +2.747 0 Td +(interface )Tj +4.024 0 Td +(\(see )Tj +1.967 0 Td +(Listing)Tj +( )Tj +-39.421 -1.44 Td +(79\). )Tj +1.923 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.385 0 Td +(changegroup)Tj +/TT0 1 Tf +( )Tj +6.93 0 Td +(hook )Tj +2.497 0 Td +(is )Tj +0.996 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.476 0 Td +(ated )Tj +2.163 0 Td +(on )Tj +1.441 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.662 0 Td +(push )Tj +2.386 0 Td +(from )Tj +2.329 0 Td +(a )Tj +0.829 0 Td +(local )Tj +2.441 0 Td +(dev)Tj +1.544 0 Td +(eloper )Tj +3.052 0 Td +(repository )Tj +4.608 0 Td +(to )Tj +1.163 0 Td +(the )Tj +-40.866 -1.44 Td +(master )Tj +3.161 0 Td +(repository)Tj +4.187 0 Td +(. )Tj +0.531 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.383 0 Td +(master )Tj +3.161 0 Td +(repository )Tj +4.606 0 Td +(is )Tj +0.994 0 Td +(usually )Tj +/C2_0 1 Tf +3.385 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +4.94 0 Td +(as )Tj +1.217 0 Td +(the )Tj +1.661 0 Td +(\223default )Tj +3.717 0 Td +(push )Tj +2.385 0 Td +(target\224 )Tj +3.161 0 Td +(in )Tj +1.161 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +-41.644 -1.44 Td +(dev)Tj +1.544 0 Td +(eloper repository)Tj +/TT3 1 Tf +(.)Tj +/TT1 1 Tf +-1.544 -1.79 Td +([hooks])Tj +0 -1.79 TD +(changegroup = hg update >&2)Tj +T* +(changegroup.hudson = curl http:/[HUDSON_HOST]/hudson/job/x-ray/build?)Tj +0 -0.99 TD +(delay=0sec)Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 79: Hook Setup for Mer)Tj +13.216 0 Td +(curial from .hg/hgr)Tj +7.99 0 Td +(c)Tj +-19.406 -2.24 Td +(Hudson )Tj +4.005 0 Td +(manages )Tj +4.392 0 Td +(the )Tj +1.948 0 Td +(dependencies )Tj +6.561 0 Td +(between )Tj +4.282 0 Td +(jobs. )Tj +2.634 0 Td +(A )Tj +1.281 0 Td +(successful )Tj +4.949 0 Td +(job )Tj +2.004 0 Td +(triggers )Tj +3.725 0 Td +(the )Tj +1.948 0 Td +(action)Tj +( )Tj +/C2_0 1 Tf +-39.532 -1.44 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed )Tj +4.313 0 Td +(in )Tj +1.312 0 Td +(the )Tj +1.812 0 Td +(P)Tj +0.511 0 Td +(ost-build )Tj +4.221 0 Td +(Actions )Tj +3.702 0 Td +(section )Tj +3.535 0 Td +(of )Tj +1.312 0 Td +(the )Tj +1.812 0 Td +(Hudson )Tj +3.869 0 Td +(UI )Tj +1.534 0 Td +(\(see )Tj +2.145 0 Td +(F)Tj +0.482 0 Td +(igure )Tj +2.645 0 Td +(3\), )Tj +1.59 0 Td +(for )Tj +1.645 0 Td +(example, )Tj +4.423 0 Td +(the )Tj +-40.866 -1.44 Td +(execution of the next job.)Tj +ET + +endstream +endobj +319 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 323 0 R>>endobj +320 0 obj<>endobj +321 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 444/Filter/FlateDecode/Width 785/Length 36695/Type/XObject/BitsPerComponent 8>>stream +H}lUmo>[K[ҖV%Њ`cLRYRE*<լFs[Z1l:vfY21,`ܒ%1qƇC/Ŗa~%ߜ=w~\zI 0_^*.R(]-OuT5'st.u8R_;$'նSjrجYY?uZ¹_'brL^~S {]Cי%3ʚ^0%g3AU֣z1&C(E/=WZ}zﰎP3Cd7աlBo/=JI3,w}恳Λzb3ʚSd`*S_aEɕ2@8@8C, g0_u{ߞ>SL9eBa`jgN?ls_qI[ؽ;Sۻ~npջO]cN=fQdzwޏTc{4o2a;k3A-Ep~z Lg4|ޟpLvPEQEQ5o|//WIng9**W3AUNq &|J/Q\@˷xSUUV^x@jkkӆ lwޭ1Ֆ-[uu)!2ΦYs}WYtvW%ǜ^7k"NnYW 9]:J|=oLtn4n~XrVZ$SEQEQc|͘1c\;32s;;?sйv>w=xULz{碼 +N_^UgYݸK;ݚ= o:>{\SMMoT^EQEQ*///4GycE\hT׮䉤$;-]tKnbzmf7CJY)lݩPzi~jA ]O[#g7<%R>ڧ>ޱB 5s֓޵JQo{XEsxA~5oY{t͗-Lwn:-ZH3gTbb-o>#G9rȑ H"dܵ`0-lZ3f hhlԋ>6Cx3a2ӂs3+9g@ {ݿW7,u9_es݌vjTvC5t#L^k;9e4qAMP7OW^fJɘ,miQf_(.}ƃusLLҍs[5woMEEEJIIVrr1ROPZX3)*;WsHhm۶ͮIMIyם i&;3ڴ5%kU0Lk{sf;4E\J{'{seJ6[KYM-I\7us-Ջ{f&7᮪,ȫec>88Nuq;8~# ++HY G5ZI[UemYl6pq*f6[hT7u?nsәei:&=s?eXپ_;|y~yLeFq!V^X,0$|9*/P]/[W~>Yd}:{ f$za/-p YGּGs}KoGJ~k5jm G[0,vקcݩk`CEpO_gn========Rddd(Y,qajV+dU>=Ą̙31>!; Nj=:'Q fP{s{BhmmUV[joZ~%%%:;;qѠl\+%'\.ZZZC'C477#++KT(L&$''#2'3XdOQ^ {P6lp/Ըaf"/#s4=t5t÷w2{*o2g"3#%e8QeϪ~wUʧTM7+ȾA߷Vb퍻 >zzzzzzz.]WU5% d]cc#{zzv?ȷSO}?}WULi~Yf jkkQQQAQEQE,&3X/)W}oűkQ9ˎ1jExU/jLאkB]lT6&e ax1"[2\SՓLA +ze_qb,&5fsrl_:x=|F~_B! b2݊ݒ]W8˻=LTv7ŪkڐCd.wޔӫU.H6ʓa{LTWǿEFA"R䡅 +`QW(Hť Ԃ`(XDUbTl]?GD}ouMSBz3ü; Tl$s Y-_"^4¾h2lm%vG_MB|/6@s&AA"պ4T '=Ծ8ZG6~W|/[ px!EIN_?Lhp]$>7RlrA2/[ӏ}!fi#;7AAC9 C|s;.?<^i^*>`E,Vlm>`;ģ }^<oYZ{k3A1G:SPy0o#ZAP?!k1mx/AbG| ط9$~w* +'S, VC8AÏbf[iQ״;BHg+ܛ  rqYԹ8Yŝ@?rS.#&yڪde[y4m|7C/2e A+x^?_Ȟ6p\1);/e}Z +;R;Sl2nChJ=B uJln<<$L6t m[u~m zĨ]eޖhZq/W 㦱z<6ߩ? ~{ggg3<$#9׌Di۩Vϳl]B1Ộ>ܓ˨b;=>ޘ;srGbLWby_߫anwuHsJ,KtW'7LxuR]Y|҄@S ٭GN! bl9D}Zi^*SEv$|e#ߥ(͂d,k eaPK^ډPcٛxP³u +(`VFN\ +l v=-dh 9AA 9(I©ݿR5硽&8~hk*Hx(ىutW-p4TLټ,4 (VM!eICYրd}f]ܠ"WG ^l#Rb:'TlBF`xc"CixپVRtMsWA3;g{vr{  Ɔ=9=S`MđmKK*wy˗q<9keC( Ķu-乲(jz[=ͳzw6|Sˬ6WkfF6&B1VoOT~Y|O(THi dA@`Z%ve"ìn~%f1uֱ1ih];qvetսw'{{  H!Q{Vw iЦ7"MثǶP.Zש{7B"Allaک5ellÅ/13bLUo!&{'(LyJc^0?Ҷ*.{jJPc0IY~uor/ޣ|'A16q`/T姢i#7ZbvZ MG@qOVj pSR:/Z$0#K?7¡SKQĩ`A + bQ3S?Ts!LtxuLڴmE uAt5k {&fU8_l{Ƭ]s\OKs76w5aE;Ξ=G +_*&ŰP3P2ó~We?9zt-^BDDD!y3z1Cƕ!L&bX,k7ŰlHJJbX,b Bѓ=oXF;nem<3ƈ\*pԮ-DQΫd׮)cƜC$QRRlLH2-$T_T$Hfᗎ4_>#1POFss3<X,b^9hgcUCY -{⛓[emr9w( KxGuV|[?/diһ13gm!In)MkDMߩhKEEbX,2z1',O#?9 +oBdXQيyYzsce0 Mfl=~ېgGуGBT( +TUL!_qqE<7!*}3;d1z'f<=;vĈۄы=Ycy +ƿ.خXx# E'g?EccPRj9t]G3:.6J9Ϩ{z"z"S}Q5!̘[;T |KSplt+䖉~3Dػ{|c^kGcCG}K! FMyʊm2?u\x=ڪq潕r?5Õ xTɵCMLw:zSw2DuL._ƍuy=bx9v]XZRq?' +e3!ÜDo{fq=\䱮~C.!$T_T#*}FbSnDDD!no۶؅[?2? 09 82T>7GGʵCMDz<8gPESgǦ4w/2/ź(ݣ6Db{~+f{p{Io_!R?'0duPK(BХw]^E>5\={ _02!zz]m=JjrκY8oN)_,Α!0c}ǿކAY w:aIdX>KAMH=;I"xhqXU<J*&wXm{D>W͋4Dy-R_q9WU:BpQ]~,{캒L)olDѯ{֣Ȝbb\XO ոbE Y}Q(oeQ7qf/aRBlKd9?1Kv̮= z8lI6B6$BHaQ  qGЖcZm-RjKANw*CUIv#Idy?'|w`5gUSB7CY(SNGn7gaڱv-c2RsgS<7ٱC5?qf@~ںU)ھKk陗ԙ3g}jTz;5JEErx߭\se+xuoNR7&:q^nuwꧻw6YY5%Ju9{Vέ諣KS/S }!-?m{knTXXhgOۮfv?:_fON>܁2}a<9"U1`3/-,+^#ghq]UΞ%wUMCy/ +]d[!k>0<:\踹~x@s>F,\t_yz:=pϸ`gskQkF盜=@_!l%[p%\3[6^::s|COZ߽smv64foE%a+GUtz'Ƕ/c =\C8\xĤEiu< eݪ;xd>w4%,úŬHꊜ=|/UwtTZ5jvRQS4{v#/C]#ZT,Rg˒Ҳ%^s{Ff%ɝMf_˜E*TWfЪ6+<9v +$oym=Wujj**T5yo+Vjbf;:"= '{323f"]DUif*-WEC!Y85%% Z(0b7`=KOuYo_ν>z ߝUwL|m6KI7kO]f?9|Y{r`>:\:ߡ-tD*{NOOAR ^?˹Nɟ3f_j~6}s,tD*{$aHe¾\fT,7h 3tD*{.,'aHeCB ̞Ix5(Ѫ%"FU0F h"VK\5@.%&\4V5Dڎ3QxL_ߒSxzww˲lC^2H r1ގ7kdXC|^՘$gCVz* F!E1pg""""" +y:Ϋ*TQ9!Gdn}m֛3p\g360osOq?wq}W=ݿ؀;QL8ӻѷ{3BQ;U(uڒbg&wrϋՌ7ޔ_XbkQgCH<[,cK22׼IODDDDD?{ډtрGKz/tI~ݘ"V$PF΋?31ϸKzWcłcjZc=Y ENag~~ kes8ֿ1-ݩϋjo*GD_-M8Z~^=ZYVޜ!㛜OKWOAewuw DŽy؏YXTuĹ:kvB?cz;zhATv-'~ߣxq>iyW"""""A<2EG;NED{zW&+Cpe 2ƥ׵Lً ADDDD#('+1Q=K.精*C =ux"G/\^׉rD}ؼWq]5_p1>í͈7dпf8Ҥd&,;{xv2/Sl,b-AQX,4iӬVFcౠ)QTec{ ;\BXu} +."""""L8/2Gݿ9DDDDDD#X,bXG[DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD%Gm p4YsDDDDDDn95s1wӈ%>׬ʕsb GZ'-(?FY#{VȵՊJ444o9F%""""0GCdDʱWdL|I3ˬ! +,X0L~K`ƍC̈́ɩHM,Kc0)3j$TW#E1 ~x29 ~y&dTlmX2ks%Gg2+8n[*&&!}8XDG.FCllQFy E\\\+ <UOdY|V3׬t\Sof ^Ipb\=Mbof[ 4*ߡƲR,""""jK_@uΟ*󃨳qy uVX]\g `9 +fNBEa;\f3vd2!,,̫XDDZgPZ{A3bO>Fr?CO.(v{EjI992Wߦ tV;zW%DDDDDPih/ỮZ|3U'mr]bg/ +sJ/hl߾Z?jAdD ($$$ȵbϠdbkzDp0M[]ؽևWkYKy~Wڃ4׳"CSOcVRZyO3{dy߫3Zaˍȱq~̈Fe pQX +yb]W>~;SԇS_5ĕMmy| z;d~yY,uY"ABj`j@ +5 +(( +JKA:Д贙JzN1~wg:ęNy=.{A_$-"Yiiij@bNԈ"==]޿5dW2Cη2CŸ=r|ryfY +lP}^ҌefGW W32C=QV<]U2GR߽ +vVhl,nI.ƛbdsGjn0`Bvv61'jDmtt(XbQy̻r szƇ9bY} W3ѓF VN8ܲ60;.CR\ܿj(8tuu;5VCDDDDDNӊg{['Zf fY3VL`ZC̉""""cJjj۹7z^H΍E:. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""";LHAȲ'CyDFV3NF7.FCeFZd*m#/F6Y#?YIf~ qṈU׺뺌y0ky\H|mfng'zHEվǝoGx wv>""""'YLN{AyBffb!1f#|gu\^=zĊg! Q}ɻޥ&$֩%jwN`'~ÙnZ;s#͉;O-z"NmKmXwo+%rULxBC됩PyoWp=+-ﻮi$9m,ñp~xown9T%ӯۊAxHSaf87ticWIno x""""!%GCof/e_E_갵Z>d~%R{/յ晍Xܭ':ڱq1L$ uWǥw S⸙@w>:~|@0d/!Dv߹&_S{47 4ۯϨ:×{a{sJTϕk,Pܯvo"ѧq[d!Г!|3C:\2D ^>{K9i!=ms5o+zlQ;:Oo3kߜݳN%{PƟ]EA"FoƍQQ0- . +!hDCm:ZS5^B?tL'v2I~e/&ͼ~}9{?gQ'{~VwTWhvVNj}OGO[t:,wL* +HF[Wݔ\f7魇CL<:\znodmPoN!Bw>4ε.\DMQ4V~sc]z7_BAS +7YK답2̟&=BV`mQ*[:䞯Vb4~N=˰rH1.s1.(tg|q<Ǩ3MyoN!Bw~4E5֓d.pONh]&eGT}PݽYP{z{=y-x錖w>z>g{@‚;2PmUFy]WhygЭolϼߜB!6M kVF#j{$r0XAa5o/d֨=jV/{4s7 {m7'B!B!BEa0 `0cB!B!B!B!B!B!B!B!B!B!By%;P_:'KqN-DB!B!֢`e yt9Eݛxdb}x]hZ*[nG8#Q8fkuXtG?BQ_:5xf"N^Soڑjk*uk-}Q0i8*'˽}bACCF f2p8d=Z>rS!XƠ[ل8KBF.]d*tB֨S}V6 'gl7D]^>KC|0Z}}@oP==!#!ӛ!ds)rǧa_tZ\i¥_ed]݂o,c˲xf0`6mڄx& a6Z'$ PCY u?=Np.Q"u_+tvМa8uaqBlo?mK]VF z֮o]":i G]r}7&Zu!,.Vh ~B[Ji(>d纊B{q,=!ԿܬwQՔ xxz?t7$'En_`CfY!b'Z;%bQqaxj~2B[\7{;HeWeM!ۂgZ]uaKAbY<nDNvr{scs@I\ȥ18{79p] Ɖwr^CQ {|7e}D@\6yl 1<]GDDD>ۆuQX)>ņQ;|VHCeKqZΝ.())Add$-vĘko<{xyϗ9ԁ*bU{=8qm(v;$'欭yPyp(w%IgpNϙPTA}_C9=FlC9&~Yk85iv?S_ ,8bϿ}!bK{Q-uaxpboFi_\3o3)kQF_3My[ڷlc]~(όGI/cvmY>'r?__ //vĘ>>>SQA@E_bݘ;z,fšoX,mz#4ں7R fqW(zf'37F>z=""""GmbǾ8V֝vI\Åm}\t:$'' nb䙰SUg=. `yCDDDDb_uxAPf.Ÿ?#c^&ZHHH@bb&D~(QW<{hm/MG<}[[P!^D^^^ndmCCY.zķcDDDDDDW|Kӱ:e>lFw}I1DDDDDDpݲon/@TWWN1"NÅmv /`}Y +bB&Yk9ӭ +YYY^wXvv6vzD-DtЌ0U܃1% //USi]G~j޳ѤgwN +&"ah>:re!戹EQ:tE~{{{CӍhVUƊ**?܋Nw{x$7.6=^4w^syeHD6z}"""" e+Z$Y?vv|yw{jppSuD9ntnGT寐sdBss z=|}}G4&c eFz|>rk-$.aݙf3ܭ/{y0ȣ_w8Ty?O1blk qvsv)=1Mȥ2/yz؋;7ob2.jգ}JWb(9w̜9 (f4`+渥GV;g!gR r +pk<*Qs79;Dݣ?[=^H8}G]:/ɻ&k5^؃ox;wk;}W{-XS9ƧuZGb=lF|׳~<}}dϠxdܻq,Lz9wzsAhh%DD_XX֌z!wpN+~PO>88P7c˪4.>l]&ju1*qPkǂ $y]>L^0&Tz )f/xp/ŏL8Xۈg$G6E-vc,c'.R!bA{"ǞcucVkx?6&3  3fA*D( +XwVs`S("RX`mQcتƬֵcpM ?Lw7&Ps_ɛ99yϙ?ϭ_?JԨRz,X<-h 2_LpT~ѵF\3; pu&<:z]mt +Xje1;BDDDD5TQ_5+ީZ!Z -uYݍq>jWbShؾEχ`/|9qM#//m.?؛2\F<_Bf ,x^'֪YP5>OPjDvQ罣 +hjhtӑm)F/=JJϟH囈1[.4eiu!FUpw?nu5E|v,>U}2=2Eqt=:i*}gXYh^Usa 5^OyQQQʜJr5Q#j]g-*o';zMΥ;C̊=r\9n~ +i#z̵mcB35}9dϟH_}|SG~upWmoWuDu sыe-B#loRt7;b2;Z?YeEKK + K\5gr6@)dVF=vwfo_5z=vB:~ʱN7I-^!sDA4,A9h},ROoHMME{{;.Q#j=DDDDDX2pt=6 b%ń8{>NL" $&&"))D 0EPaFO[9JZhɒצ"///3Eh… vA.[~l6>}{z+DDDDD/kQGC+^18@.,Tv<{ KB'GQd۵O.[~^N!!!AGGl6+3DkkKDDDDҰeȜ ÙR\= & 9)60Vf qYV~~~VQQ=BmmmG||2FH\<QOUXW㕉HY~RX'ϘjT(x?%M}H#Y Ҍv)% +9BX(O|#=^OQػw/zRXAAAxfY֊: qMY}e؛ X$Who!`v|R%){ z-S΃F;y\% %(NA+7r۸wg:čXz,E^Ojصkىn\r FY+qIU{ԠX)Ƿ_4əֈ Nㅀxj߆@ iR%઒gF 8U5JogHyN7il޷k>BMDDDDB&۵VGV9Y~;*˺0WR4WdbɼhyIf +z{{1}t$%%Ǐ#\96m$g;jC/Q9]܁ 28S=o! E}`ݴ3~fuh?P nspwD1YJ} e;pފ\<Ҽ {XȚ/kaGcn8"aY + Ƹ6"*@!"TZAC1֧ "d bLhmvتiIM^ ::i8Nn9® |?3?g{7zгgD:~+1V=twɌEu,ADDDl#Czf﫸S'ƥPru8\޷VÍrXy`HHH@LL Ν;'{N\pA~...Bs/W/8{#Ǭs_Qg5F_n!=d `BZq+" HέuNc^݇"N3Zw-ObAȃwHDce]+rIyڅeS,g*B|gh$k~E.>ϹZ?enRb}eKΩ.-y}]2mX̫ $Df˞z ;!&$Tge8QM eі1;ՈCvܾ}[)QUU5 qrLu8ZM_~T!\σsà ŝ&WaTv}L3QĻwRuiXˎhnF{{;ʾ}}|Ѥus{ْ*xm<9.sCcE\$}߅oW ym+@tmU:Q :_±-yx`:f-m-sfB}g"WoaP܊2$tks(S +;6{_p&cU{ +T=tj98tD-. +Wo@L Ƕx"v>ZPDJw\;VD(//G||s*ݞg1G!pRGu~?!0\c?-3L?skf!<=ϫω3C y5kDwZgs2߳}&?t’7:L}""""zBjJgb#oF׶B2?T!,l,yq O HIIARRcb80FH(/cz 2ܷh+Ý߿/'l70[{Xt=bIkϦm[+sĄ#rgڪqxb_- E懶%8Ӳz8o9bXCC0΀Xeͬ:Y9񜍈:5q뙮 *#)eeO ""ZbLa~`DY2m#bV$D=CSƵm-We} *˱N[DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDs ] aMoG#9O05lЍlY!.kHDxCo7X[GGZZZw^bX,DO3g +uPD>v#8C;7ca?qQֆ Fm] \So M3gbX,k Jb'{iw7: 9[d_ dKmI;a`DOçe`𵁿u9=&ãa>+4}n[6]GD?~~ "z1ѓ=d;tCS<'cN.X/5S#s#(&/g__psc}ǍtwU9m(jB>E\&3uާj@nI~7sS`, .\1Y|=CD8&f"""g/C=oZz撜,d9S_$k(W!ZZ?enR˱g~8c{0@v}xMLr1$ l +4P!@Ȧ4M1 Z ԇF*E؂Q[P@Uzv}b~?ґs3~}Ջjq:ru5n x +e1gutx^L_pPU&f אkKtNw yv*|7/er9D\w+V@ng9dE t5Gpnf"""G\2e2'گZhNMmӪZM'z~2"1l:{fnWk\xxq̴Nsgk`s]NϞ!¿wњy Az3rUg [~Ca]2es^~4aY]mߞ!R_j}"GCsD=.ב}[ꊡi:~_eW&ʗo r:O}?pyeWd v_{ +/V矿ܱ'|S՜2ńN/~Y{00| +٧bϡ;>1w!""<bQ= !_Z927͖!X.TB歨wVAւ|^{71"3g ePgx]Qd9jo=C6FڍFNDF{닓ظb=uNnBx;|q3M ri}|O >;oZ8s #Nmw9 +pLxn`{s/b3K|_ނ ?_ / r9czU"]Ŭȓdža\WZFܵz0I*]mX\rx<Q@gpYb:^/>+2u +T;я,b[v>Λ*O{]W;~|Ƕ](0CNfNUcvzs`b3.wpeYqfK%k3'ZՃW[իWPF`({V".'_B5;\3﹆k9 +N5:;: LeEbliS-1EeXcF{}zx"""J*y_X!\x zZR_Caf wڒ/Y,MfZ:k.:?ǿ71mc3Dx/Z,nXGPDBxy*7>{H)!F|DBc+?$C8ޅ +3M4C3u} :Ծrq;վM~`cS+Fjx%#~:a"xZ__dMs?>1ꙑ 몧jO|Nً(i1CD!*Cun}:9f֩5x_V- !uo[P sfQگ?5|.B-b] :qz[ >1"MGd(i1CD! iBwS?%pwM5 Q13LÔ<Oj^<q%Ӿ榏DDDL!hyp"kbV`e +5ys,DDD!h ADDDD4 f6&|>66666666qh5Q2A{{;;`0d#QrkmmŒ%KdҥK֖`%|pj%S9MѦj d;v&w@[/lIFz1ZD3uuBHn ѻJСC0MS&!;;[yjpβ`9q_I\-뗻?(5z1/l=Vc]2v'e{xbk± Uw@DDDx<8pvcҤIQM>@nn+ 'Vk[ ٯ(+ zLl:lRLM PF`Ģ ZpF@j$2Q*A)RQDJ_JC "ZUB(y]Ύgf&Fqy~ҋΞYsl:Nf}TwO[Uyuqz+>'{\|qL:sSȳᾶ ag1LYs,sb:\^SrXK"""oBT9@ QRR"׊=6ba־>n}x{$갲nӠq~sh]ts_jWNx?C\^faG/|ǞǓtWuR9H=ʡr_ƍq:5?z3=EM>bsm|bh3^ndQg3uG#=Do`o?ޣ߁9VŷcLN:_k-yYwy?".re΁M#C<GYY%D`Yyy\#NH^^hY+Z[h*_%k7VC_{1qe|ff[?}ZNsнط*Ѥ+jtkdȁrng{qKU 28g8x5ZrN2.X?ޗu9#t?hР*bOB9s.'v˫RQ Aumx J`"'"""FD?yf̚5 z=Fx&*++iӦ!Ϛgc5γח[5~~Op_%NS;;8! ^n/qw8 }UpT{`Ii}{EwbS\q^.J׷キ93Ϧ}_N߿2O?l[x$1v1qyWxOqHow̑2M#DYY0 ~zL̉5b-!bVݙWk!rS;Ɗ +TWW +ɵVw8וߵh^Svϩ5!l!S!m6!`g~yϲS-7W#߳ʑ+uttt yyyx2[<sHSC|l.jKG#ɺa.rur@ 㕞NԨ.j\lŚ_wո7e=D=.wZ2S/5`O5. ~IOznolyƋ[vű(%+{C6cCl=}+.&؞okCYYQk=t3[̙wPlذP:Z1'ֈnz.YM\Ig Uw:ze7!.duzͺd]nm)jr'2q]NMO˼[¼G;V;|gďQjrb~v^lغ _veS͕:DDDDHAA>kעsεbNk(3#I_4 Nsc|FBP3{yC}&P$R<ػO~! of\|"""D"cǎ̙3CkŞM_iws1sDDDDD$ C̉5S?$)jUBXq?GDDDDDOqDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDnb1l۶ ǏАsbXKDDDDDO^X~>r+Wb֭9N󡪺uubT#^v:@걘mvV)3аh>$r73J=6GEC +ԍ&^NgG0^k_sp7“%;J9iElc)ןǾ>Q>n),.ηxC6=)9@__8d/!z]\KP(hũ(jɦ8ԗ;_nJ"5Rm *R9k]f%NWW3mj]4iR5SےmI?f<˽s4O$߯VmrzszsyŖx.5KZ*F%ޗ=ɼqMŕyJSQKCyqTbz +N>]U"^$\Q8~cb"jszxEOk12|-_:XQ=D8w!œ\~# ()[|ҪV1֭[T-Gzx<M􉱬,lٲ%n qNnaWfA ]WoE䧡g-!zۧTXd.r eL|nT"~y9QQr=)֗LqϮ;!czh$sޅ.xc1YL fzEKȫ{ԝH +FX>""""4Q!==IIIp:p8dsx5ɏ.)+Fg!BcrEBpfOŏ 8CyN7uv5yJ=Zˆߟ1mu5菷Wt8XܑxaHǾB[^CXk;g ADDD4"D=PSSǃDfL}9-Ę -[9ysΜފ 20#x~X[&*0UOf箽slņ lw>ֿ^R ,}fva9k̟h5MQ{.!fQ#K;?78{X<Ĥe".}26=b=qĻ#3Y; 'N1;_ [v.;q(L{(DjL*|mߢo|Z +[#> ^/сN&1FF}lY'uOP9-[[5WmYmN)k fף +vVUjl۶-nVdeS1f$MD/P`3n#CISQzb[/u~k̊,IW + 1Y:uDDDD#%7Ӈ;4Z=8rhB#/S-5kѢ( +8-[,&x\1ϐs:n*԰Tju:QŜZ=qcp o ^& 2{S:!x_ճ(]ﶷ;=kyXgMDDD%0M/ERY?vf\= w/4b{XďqfT/t:&ՊĈ&v;|>+rn-j.Kۖ]dorಅi2wST a i5. +2Yp]:SM)2c+6 +8OtTgfN,9箵s i8=&"""r#i8ӶJ҂] W{<9/ĵuسq.fg˵%99HKKBxs8HJJرc\ƐE ї{_mߞV+Ѷ9&}j CsVO`vjxY/`?A'|˓>}(u'r떭ŁO&BλMܾ3|pqiWupwٙH[V+ϩ by.75|&fLw_T/`VWqkŻ>?;ۂ79;xwݲ#ɗJ bwRZAN}wK8wAq7~xy)Y{}s%.FU?ikGoߎZB +Medd9b`k!Mċ9=󚯝9G{emNn??bI b(vzFMc>w+S8*tw4yŸ]ziiUoW#ߗJ=[oz}jm('=df *: ?\?2RjN\ܳoƙW l2444`ذaHVJJ +^oȐ=ߏ^eM*CQ=}ֆ}mWTO5WPOkO%vgYJHȩ=J +;X?/ YV0ow oVjA۱=~Y?Q=w\4dyaky}5TQ:YԮ@I7 4W<ϧ;ã68E4k#ڄw6|ѓgj d~URL ry6oċ1a[V ؾeEFFr55yOΑsd-cġ-A蟿[P!;;[lp%{F[nI"#Azڏv{KJ$KHOk!Ct7[;;2^8t/ d'tS;->A5&@ۦiO}{L !֖{/!Ӊ̱P'} X!Qqo{<\t^a0$G+ܮ%"}dޞ#U!"Zy'瓈|Rم&dq|[5~wgvTw͑KhicOϮUVX/- vp{rk! +p_kD*ׄ?].{u8@<.}BQSĮ}3my7k AkUn2_@tۗC<^{w\"zcbu̾u_2DÞ#?;CE0wً&d|wšœqb{mMspj[UC*?,@+Ni\4iw Ƣ555CNN9pD^88X]laZE/gw}[z ښnVۡkݑk}_!oozwZVh'}\n]rDׅe$~*Wahb.bbbPZZV;vt9r|pM!zH(iķL:4H9zTx>Țœم&]A 69 ^/ + QTTd8=9%4q͙ __vDQG瓈+qe>S5ٿ[f"""""""""""""""""p233 """""3C0G9"a """"htDDDDDd(C0GQ82skصkנDDDDD?2D1zW""""Y a#S_>JDDDD8c """"hXr`^g}6mP f""""a5Cd$$;!fniĤGu]Ol f""""p8M}iF_@P ۞<1!Gg#ɾ'1>8~~|p35WFNĻE;ߖd_]ͭ813ǎ1PL X!6To5cĞ-wcr;ވOѼ6}q$ QϞV"iţS;C/d9wn~Wk<; huDC^fM: FxO}Ʃ,őၟ1z؞t4ch^>8X=񘜚[^ߚ}6~I-tn:ʑ!t/պb4#oCt/m~vh(G#ҽ||XWrt&wth(GцX^>5PNb#artk}J%2:} n6ޗ!ZuS #kCwmV^C](@EUGkGCE`_ +endstream +endobj +322 0 obj<>endobj +323 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(136)Tj +ET +q +478.615 641 -421.615 -238 re +W n +q +422.692276 0 0 239.0769348 56.4615326 402.4614105 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 394 Tm +(F)Tj +0.482 0 Td +(igure 3: Initial X-r)Tj +7.546 0 Td +(a)Tj +0.47 0 Td +(y Build in Hudson)Tj +-6.698 -2.24 Td +(All jobs are executed in the follo)Tj +13.995 0 Td +(wing sequence \(see F)Tj +9.152 0 Td +(igure 4\):)Tj +/C2_0 1 Tf +-23.847 -2.24 Td +<005B>Tj +/TT1 1 Tf +2.5 0 Td +(x-ray)Tj +/TT0 1 Tf +( )Tj +3.618 0 Td +(\(initial )Tj +3.342 0 Td +(build )Tj +2.842 0 Td +(and )Tj +2.23 0 Td +(unit )Tj +2.286 0 Td +(test )Tj +2.063 0 Td +(execution )Tj +4.842 0 Td +(triggered )Tj +4.396 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.118 0 Td +(a )Tj +1.118 0 Td +(post-commit )Tj +6.008 0 Td +(hook)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.036 0 Td +(for )Tj +-37.433 -1.44 Td +(example, the )Tj +/TT1 1 Tf +(changegroup)Tj +/TT0 1 Tf +( hook in Mer)Tj +17.982 0 Td +(curial\))Tj +/C2_0 1 Tf +-20.482 -2.24 Td +<005B>Tj +/TT1 1 Tf +2.5 0 Td +(x-ray-integration)Tj +/TT0 1 Tf +( )Tj +10.703 0 Td +(\(execution )Tj +5.003 0 Td +(of )Tj +1.335 0 Td +(local )Tj +2.613 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.669 0 Td +(tests )Tj +2.335 0 Td +(with )Tj +2.391 0 Td +(embedded )Tj +5.058 0 Td +(container )Tj +-34.543 -1.44 Td +(and JP)Tj +2.669 0 Td +(A persistence\))Tj +/C2_0 1 Tf +-5.169 -2.24 Td +<005B>Tj +/TT1 1 Tf +2.5 0 Td +(x-ray-setup-server)Tj +/TT0 1 Tf +( \(GlassF)Tj +14.174 0 Td +(ish installation)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( setup)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( and restart\))Tj +/C2_0 1 Tf +-16.674 -2.24 Td +<005B>Tj +/TT1 1 Tf +2.5 0 Td +(x-ray-deploy)Tj +/TT0 1 Tf +( \(deplo)Tj +10.191 0 Td +(yment to integr)Tj +6.49 0 Td +(ation en)Tj +3.49 0 Td +(vironment\))Tj +/C2_0 1 Tf +-22.671 -2.24 Td +<005B>Tj +/TT1 1 Tf +2.5 0 Td +(x-ray-setup-fitnesse)Tj +/TT0 1 Tf +( \(build and deplo)Tj +/C2_1 1 Tf +19.384 0 Td +<00510045003D0046004C00010047003E0001005D>Tj +/TT0 1 Tf +(xture code; optional\))Tj +/C2_0 1 Tf +-21.884 -2.24 Td +<005B>Tj +/TT1 1 Tf +2.5 0 Td +(x-ray-fitnesse)Tj +/TT0 1 Tf +( \(execution of functional tests\))Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT1 1 Tf +2.5 0 Td +(x-ray-sonar)Tj +/TT0 1 Tf +( \(static code analysis\))Tj +-1.8 -2.24 Td +(Hudson )Tj +3.809 0 Td +(initially )Tj +3.642 0 Td +(c)Tj +0.482 0 Td +(hec)Tj +1.538 0 Td +(ks )Tj +1.307 0 Td +(out )Tj +1.808 0 Td +(all )Tj +1.474 0 Td +(the )Tj +1.752 0 Td +(sour)Tj +1.822 0 Td +(ces, )Tj +2.085 0 Td +(builds )Tj +3.031 0 Td +(the )Tj +1.752 0 Td +(project)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.669 0 Td +(and )Tj +2.03 0 Td +(performs )Tj +4.196 0 Td +(unit )Tj +2.086 0 Td +(tests )Tj +2.252 0 Td +(\(see )Tj +-40.533 -1.44 Td +(F)Tj +0.482 0 Td +(igure )Tj +2.451 0 Td +(3\). )Tj +1.359 0 Td +(All )Tj +1.507 0 Td +(unit )Tj +1.952 0 Td +(tests )Tj +2.118 0 Td +(access )Tj +3.062 0 Td +(a )Tj +0.784 0 Td +(moc)Tj +1.871 0 Td +(ked-out )Tj +3.563 0 Td +(en)Tj +1.044 0 Td +(vironment, )Tj +4.952 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +/C2_1 1 Tf +0.84 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly )Tj +5.453 0 Td +(speeds )Tj +3.174 0 Td +(up )Tj +1.396 0 Td +(the )Tj +1.618 0 Td +(build.)Tj +-39.698 -1.44 Td +(A )Tj +1.064 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.287 0 Td +(build )Tj +2.621 0 Td +(with )Tj +2.287 0 Td +(unit )Tj +2.065 0 Td +(tests )Tj +2.231 0 Td +(takes )Tj +2.564 0 Td +(less )Tj +1.953 0 Td +(than )Tj +2.287 0 Td +(5 )Tj +0.953 0 Td +(seconds. )Tj +4.121 0 Td +(Successful )Tj +4.843 0 Td +(completion )Tj +5.288 0 Td +(of )Tj +1.231 0 Td +(the )Tj +1.731 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.897 0 Td +(job )Tj +-40.81 -1.44 Td +(automatically )Tj +6.239 0 Td +(triggers )Tj +3.515 0 Td +(the )Tj +1.738 0 Td +(execution )Tj +4.628 0 Td +(of )Tj +1.238 0 Td +(the )Tj +1.738 0 Td +(next )Tj +2.238 0 Td +(stage: )Tj +2.849 0 Td +(the )Tj +/TT1 1 Tf +1.738 0 Td +(x-ray-integration)Tj +/TT0 1 Tf +( )Tj +10.606 0 Td +(job. )Tj +/TT1 1 Tf +2.072 0 Td +(x-ray-)Tj +-38.599 -1.44 Td +(integration)Tj +/TT0 1 Tf +( acts on the same sour)Tj +16.148 0 Td +(ces but executes )Tj +/TT1 1 Tf +(mvn failsafe:integration-test)Tj +/TT0 1 Tf +(. )Tj +ET + +endstream +endobj +324 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 326 0 R>>endobj +325 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 289/Filter/FlateDecode/Width 810/Length 53363/Type/XObject/BitsPerComponent 8>>stream +H׿khЀ4``3za7bܸ2rq{Wx@LeT*f5Fߠ''ٲc;JdxfY:e0 }Q}+)&&iiҮ駟L1‡qSك)c-zJ)S)@S)@S)@S)@S)@S)@_KS}UZzr )ncZ贫dɅ^ٟ~Qzaʲ,C::9Jg `k&߾Nʇ7Kf=e 6S0 {ɶSɶ ]´QOq䅱.// (}@fev|<9&Tx;8;g `kҩ&kOo_׉.wWݻ$b)~ZUVEZ*rS> ?Q0Vɏf~C?/O{PNGsN&)ڵ~M&U?'?֛y4sKcܵۛ>ry驜龑e0MFp4VFÁFޱ:vC^<{[3)@m_KD/Dou2Q4[S>2Ԧۭf)q7jI/zJؗoٱX#w]i߉VNr-[{J;}I>٘/:-ֵ{}KȒ/~y?{=RC.wʛSA8=&j:m˕r\,7͠wDt ^}Ʌ޿.tۖӶOKzIO'KNgNӥ{87(+ƍzQmͶewcS]?{=TQһ}?[m^Km/ޮn~L&ꝝSr,ZU^<)n}ܬŗYWg `XK?|Oٞʹ7(}oSns)UVZUbݗs) =(z +=(z +=(z +=(z +=8tt-i{9tiO3B!r>@!B!S!B!E =B!RS!B!E =B!RSj]策Zs9 [ղy196۶UdR*mTmuYy[*XZ+ 3{#y{&өs E|w Ӕi{{.-s^}V;sAR ^; Y*AYz|0Y|9|w-9Ԝ[zv$}oAov9ޓ#psWn>X_׵9|)|)|X}'ϳUOOκgY)d,uǡ{)/n*eq`iǦ)Ӹ58H)gA +Jiζ{aʲ-ΐi2Vo,޳ey2fv*lmZ#lˍ^#Oa]w-Q_&[K{qHrK\Z*CU;M׼Ҹ6;4WOZÇKvK+csծjC]}ن?}ܭzQSMw-M4n^?4VgWo}nz +]o./\}^WVo-= Kqqzn߽ˬw'XӖ$xFno^itėK[Ʋ5ܝϛͽS=ڮa ׶vG,\:w8nجm-׼u|XuǰmoI%Y(hؓS5>b fq>VfzĚ߷f=j4= UN7}O+h;7=\ˮ(vG~<7Tmgؗi$ߛpט86}Xm wc91j4[(m,0t8+kX4+cR{ڝH?7+{M?.p8,|)EtmܬIh2(wv.S +j,z(*֣AY^s3D3XJBk׬]#YO+TYV r[$߮z?`q#w3k\g3/To炔|9%=^s7SΟ-,^Ab0[PYGg-W4! Pvm- y|#9Y#4Nsʹ.m2y͘UX攨ߑs]> Iq]p *EcVUrks9@94[yQY^s  ,~ۜ]唂Y5nIb?Dy2{wokBPN&Iϫe? HUs^<"X|`2}n ?7gt 2ܘCh淊\\ iL}k\$p8nZ `'u.Xv8fyq;[@4ݮPH~!1Ɛ{R^g1(y)ý +}QcVUrZY{-} Bo߹hP{|֣;DB!9d=T-~5Of]cb݃H4M0*g"&?O?gaPJ eh*!y<3?s.bs/>*=1gY~(8ӓ6XΉ!CH\WHX̗Y_pgy9Dz$NZ\48fI,pH/kk +-S +j}fq^˹~4"gS)'.~5_\cA99eCק)iQ^oA/7:Q$z | {$<yIԬ!*>/Bss4wB R)@?ڪ%w|StU.~uAZо;PJ)RJϕ9RJ)RdNRJ)6S(RJ)tNRJ)&!B!S!B! B!Bj9B!`NY:[@!BȺ9eihn!B!b_l,fƝ/$<Սg;{'`@xSZ>jM!B!d]srFxlqjUl*ǩß|`k%Fx8ڊ?C܃G54%xvS!BVE]>K1vyAܹMknނXjNы˗pl?3an¥.34n#5ᛋ<nęja?,CO׊Ѵt{!B!+-2^vcl.ab‰7qn9˃ظqUd)9eO֣Pu &\qqـx3t͊ xy NLZ:ɇI9G::QrMQG!BH>ct\@+n\ƙ3:z6㾫O/4啃6⊳Sسk~$@Sq +:?f} ݉A'$y秙ǝoiuVфB!Db) Z1r'::ZQYY۫{o+n݁Eա7/y0|AR yYLNi5~,?fHjkXYzCu5d)k=F&:ـ³&Sxq͆'W;aڹ=\<ړo=y泒B[,a>:0E"?%ەov(uC9NfB!+v=҃^']ؼe;Cfݍ>T6?Ė +l1l۶;vL\=滻?_~vwfМɮ2<?eTv5Y`b! !$@!R@ YA1RP/,Za/(UwY :'~hOOnB/̙{y}=3-@qǡ٨4hPd$"%ֱ鐈\ڽ:vǦ<(_S~͚;W!ҕiQb*HNH&m>=%`CGv9**@<mCp8*qaG2#,9"5H/@ƶ[)i +E7B"r : ݮsy(\N9b Nb'N'NʂDtN9k<|s>N\lڎo{kW!k)L0%ns`W < NI8f? ^ͳHUTdjdB~NJvk +&TY,0dAsKT=,O8AMN#TW=I6?(6roRyZBiúF9FV]R}¬2E2G1̃z9,YpN/9NJTɑ5<'OgKrnF-GQdgg~-6$WQmtL@]2D((0n1{ DHPr +\  ٨)Ԡ8; ͙HOR!%!{zvs%<-ʹ=% y wW30*D<1:X>1-0 }`D'O).RqJ# 5[QENJ61== q; k+?MLa3ŭ2q&/]K۸yLa!,4-4X9|bGh'iG6zo-o%[7HCXȃ}_3炤sM9KK@ ښ51&簌ro=[)[n45UᨅHqJl,'U=8^SRi8wO P +SnvRp.>ݫCsPCJ;Y0ddB=kPEM\ESy:?֡מ[)p?]݋9]Ud}XsO~30&0nl &soQrc0:g~HVI|^=5{Gs<g!d[Un3`f2HkN@.WZcW/f S`7!B|zn>'ݱ-V\[g0N"$9<3"_7qO~۵2s}쁠9Ow`!BƮpDZ*sס}?=l BĬǺu1hj9w MU$O@bbd29RRHKK\zOj#Z@pʺ|\59iQ v-k+WeM~:Ґ;ǍxUGws݊=̕S qBJ/L|3`L`߁IFv H q]Q*dr#0yǓx{WG|Tc䂛xq{Pc ({ubmc/G&o̜/Pbh <JP* p{+  vߦ{bvQq vt2Lڰͭ5 +W)T`w{uLO}\b/\Q2mkZE{~}5h>ʱFg}Ri ִۛxAu3Cl('dbl͚&'*t*31*ݜ+}t6 qd(NsV[Ւ{qruBGсvzvOaKTVω~\.Fw(R7C ^q+Jx8#]D +46ɐ| W08tg"Z@pfYN۷a~= ٰH=lAU/fs>FNc5AV)rSD _K_9q~bq>wb*2Lm^yHLQ='@x?_rLly>=?!ۤ.ƍJ{Ydk9X4H1`0@xYήN}s;r+DUXL).2) A>۴g2LF+=|TcA?ViԙoLƹ&J@ %쒈i,*0b, +"k3FvI"(UTm[d[vwNg쌻r_Ls. "0@3`Y̿ss%M}Tfc>_JlYwǸ%3.Nz+ wN'x;#Va"4 O<+WYbS<|N\\Ok]4Nt3pXcV|X +.83p+NjLkdד?M3pFM&gS2Fڟ.C;~yv?LL rXOd}/k8.̧|E5'%_B0bP#HkNذb%J-H{(6ATͅԯI"L#hTf;Lf]nb8uj!֪- b SFKeg,G#B?^jFߧ]q: LbK& H Zi}YIgTpj%I9Ç! cPױe,`:ltlcN̿ss򮙦y=f<cs~¨RSC@cuSRW3k[Of{a gϞan4A^7&3Vуp/o]4]N|ՅF:޲0fcM8W Կ\iGf6t7`(Bp"嘳MVw Խt~$rr(cupPD!9(Hq8-({sP(ΖSfFļlѪh(j2-Zh~co$uE +z`rZFɑXZdW"JN g=e%Il.5!rK +Aw, Mm?LQ-& +~ݔ'J >VIg\-{ +"߹9y38 ˞i`1`VC/a`3#_86Bt.>0/@ rxPsP%4xq=\vɺuZz FٰGrKHNIvIu 횤r>}/ {Ukll+7j2qm *>(WJEhM9[:\+ +lb됥>ydc,ä} i2M;BVc8\ cK$7D9Dhκj6:sND/NfOiR@j,kF1ߏLh q7K;0W\t_>TG ϲGyƍǡ +zyBNS:B(3a%);h\sfО}L,fMAz9<҈9#g?c~ěj-Y1'yssgr5>49S F1X ώTVP^Ob+I}8ۋ7rkX{))OtD$&&I)S +pf+;!/k)k?4\u/`[![vƝw< gmޅm/ 2^oXPZ;[1%*"I#^1'Fjt Vy&ϣPG+%jzN~Y<QDKO`ݮ yJEAPşb90,14 '!Y?E"8 +*UR&19FSDg^:0?A@x.r_u,7,(^ jP$/ \Ec-v4ӚԴlf-|ϗCӚ4sNG3V@]==30>5MV7b˿-yUR7(iBʶ$<<+|=n?+t2ќ_f|tƆ?ɹC+E~YOcyTK|pȁ/U?Qkpcw85}A]Nr6 !Dr9!bMؗ9nzy?]xxoȵUBگp5;\>h\W#pl/5h:tQjE xW !Idr]f7y#UY:0>Xa>X%gշ;ذ,gw75 }p+{rM,K9 șX!'!D BLۏs%en}ܹxx#p C<8,~33~ [zoȕU@Wꗸ/\0b(I.yl߇U[MPoɘUj6G2,)xN?  YYr&SDQDpb\Xx8'sȋjxh̀+ x&HDq4cOߗ :!RDDDD:nWsHQRD jB j;, DLl FYp#׋}؁jF#BCCh'&S@$ヾ-hZo ?>\8lC2hZu=___n_N,tuC,IijMkDDDDDt+GN;*"N8:Gq@8 Wn;wq!\-v=w[q 6 f: .t2"dXqqqHKMӵ8+Gj%llh - V&7 ,ˇdR WR$84JVyɜ"bKM=_p؍ؽ0rs򐛛Ɲ8& wo }-rDP;_** +!!!,vzh?)[!"""א-ir7au `Y=66FQ=+YVX,' 'M4(,d`t:zL&CSomG;qw6hs5+lV)V\W*(O!̏RG""""ٶ Y$jy{{c޼y?LNQ(Y~~~XtٴZ-bbb$&&9Mhu^HH*R{ќ5ٜDQSy|W+y@;""""9"""""ƜBDDDDD9\ s +"""""r5s +bX,bZ +"""""r5)DDDDDjS0Lhsv DDDDDss%vvDDDDDsty\(#8ZoA1^Ա+#H;""""9A٤g_>6QEnB0S±)3e)!pd@]A<2p?i֜4Qn("8t9r ұ}W%wT`5K-ۛ攠 q23"-YakvţPֲU8Q^ Y:\i/C9rv2=D/#X.w!e|ZJ^ض[닰uhl,]v*ڄ9JNȉGws>H+$Ũ}%;] h0`9M%q8P#vH8C:/u[!&íPK835&#}5Q{*p@ m/ԕI,QBA !CA肢X ViNZ]vgӝ;cSؓ">@H|̙9s_{χ[lb_6FO8B{b7 N<(Q\ n*DO Պ'3GE68عɡF7s)./t\GXkϲw /Hnk;P7H Q=02222222222ͦ*Z[LӦjL&! +? ˺6r,tz+ N:5qqNhunx#;h)ˡAW";%+VfdȖxJmmulpng>Wr}ۧZ߂JxY>?.cۇIMH&5ebElԨn~EO]FFFFFFFF`Ujkm˚9BwX}*qILL>JK[-3zr/1N!S2Ylwt9Sc%{L: CYz޷]zߑͱ|/a`,DUhQCyΠL:2=WүiW>ҩȼ(J:6cfAA1Lä$hdꈋ`0J +>30tJ񬞲x/ +ESO{??©nm 2YE#'Jcʺ[DiDl^0]Aigs=Ei)ͅ}fYÏUG\L&4FIW/VT2KIMV5j3̿q46w<Jo2j7yҚoBSMz9x/)٫D\^E3㡹n a4 %5z\X2H(} C}WArBWIcM%n1"qɼZ؝UP7h4AVr_,ߧXV~DO1({xol/:mӚY=p%מz7+4)uZd搕l!51[|}r'܌ +93%gץ|}t#QDE-AO_RFFJLr)(͛}El_v\$*ʤsk3( \^b򺙸Ӎ΍w.YdֈAi~W̚o`RbN/5/E=Rל@-V_TS#ְ}4XszS{d^kZߦ@ N/yʊ:%#Qu w͏%8 FgRPtZ3<|2\OF mnrgvJV9xr~JuMx*܌uɞBj~\oZ9cI5,A3xhH0dJDQ?vL ]E(V}[pQOF$%G$Z\͔Ĩ8ۅ&\c{|r#-^Xe^7:LNMJV=geqVL=7ϼ;\Cj77CFi>XwO-P=2g_1L`{efnt%ngcyjaqeq<=.ej7I=8E} ?NUY2zͩSXjKX&`qu”J?zHV/m +IZd߳9^mϏΐwF/-_ezRSQc)DEhkfŽ{^444!!A +4 +AWG0֔p]5)8\lm+O +(4R,^UCySn(ă} jXg݆ q-Fk)(:rJP]Ma%()P^!-B9AƟ2 gS2HɑYw|ABD}[6uK(tw'5E_H& AH ͏JȼF^p˳;05ex{ȳFQ'oi0v~ҙ@^7W"=1j:E) A¤icr0L J#om`Bקg((2{1nnPrf àMgOuXyEx Z*q8Dw ?TFScZԡ y瀩(7]pUg1☥A8| +~|TEs}i c2]($ mnͭIBth=Iͤ:͇kBjNZ>L៑a=R~4BX +-#Zʪf FY;x&Z+Zc10U}\Z9p}(@A^H$񈉑P^a[[[; v"1Q$9,7"''UDO\koA9j0Y'΃xpj܄Uml]>/+ۿШaۖB|U G\#uf(o)q"gv0Woej2!(XwrDBD_1JH{Jy%*)9zø|+PQVLA\轊ǰ&̀e<[lmhDYdMx69/DNy{4`98&l "#Z)-}o`؎N8np\A]^⽂8E2ήPz۶Y&sѷCp}8hnu~kzESmn^.CqoOlj8׼f ǡ +>XWD#h| +ɻZmwhGI"7"* 2mD}r_9mnͭon?'2CNh-n'A4YB*;B82'X.#[.Cz&y29e$쵌Sh Naq*n&%K\3u:mX)hx=T^Z3 VЌ+q9ޤ3Ӭsմ9cqIQu!c*5fsz5n?.ɷ, sRsd J=10:UIB'TSB䠯RW/r&;ٕ&^҅œR.~/4)sCFeJd5C]*6iyH6dk?L@v]諴C$]! +/*lQnњ?8(KnD+^'!!m ubp5"""˽8v aPO\9Ԭ s|?͸7=m`B[zO䝶4f:6 91 +FTH]re5•*v=2e3,śO(Le/ ^ +U`6.f%Jx&td![}J.8wVS9EJҎm7IMMarvM',RسSXSQ&r油U;ogQmj3֌ l:zܵikqZ8}R3NܓqO9Gms]vgVGU3Y92fpwE"ea:ٍwÎ2ӘPhES{p_Yjw\ߨdjBgh4QOBCP(Vkgbh06th͕Sxk1z델{+o{rnzsg`̒1^4x`6nYl F- ΍sQkKv0jam]QT>X]0lm|_>Q桶bUI +K[G}~"0j͗RSw&)|%/Njsث$2rAĩXMQ(<)˟R/B^v/#rKI|sR9$xw}F3' Aˈcd y966`䟸;\+c%j7%h7z( E7`gkRE0>"NÕ5"37a9iBU"Ayv_>",<|p8'O)Cf0h,Mr7GJ׌UX "*61s +)KG06F5H& %i k2Nin`da`D''H7 V 2IК-1?s9'JVek[7eM_a8X+k^B~+D@bPx+a{`309WIXj4 u!$H~$wi~3naW;36Fل۹$&zczv0Jj,*hmi\/@n9WE@b*JԳ\)ܽ A)SsDgUaMx38kgV#E{[YEX1+DFjI1= o_;Sg;qricTXpCsi8 #JѺ1nCggMږFHRw>[XSB`-ca]:QV#ِee5} N(QD%JO^eSΧFIjWU=^ CJ"Lhn߉~7TD( +H$O\9?uT7.ADB"a!%!aS#`TVE)Ztą,Ƕjfzk\>|S?;ew1#4ϯs=}~\hƹCx0s HKKS-8'x_%u]5/}I*KPr yۊL|ܵtDDDD4:1_<:o/^; ח1"y,>£ዧR.ƭ1jqzQ\\ N`k) 22HMMhDIQ!0dk>ߖ?opwȁG R76fSs 6Y- +:b(bPy}sLrh4tΆfSAm ]-ߋ?;nA?^TVV*tPE {^""""FQARq^/cGEE!66VHر{BZrLj;wD\\̖^ Ţ4yYYY:Vߕ} +Ѷ֜DQDxxZ|_2-m[4m4""""" +5)DDDDDjS(0QySX,bX,+Ԋ(T0QaN!""""PÜBDDDDD9e}TWnhbNY!.-m[Sv|܌}kpsȉLbyؠ/Uퟃ +ѶKr =R6yN.LӬAcDC-Tt֘0iǯڹ'z*uaP""""UDQ&y58w]gQvI{ox!I1R| T[Sp€a#:*82a6 9r܌ہ\spBG )؄l ĺ\#/Cp<;׉W󈈈BTtzzUtui|:ۂs1<ֆ3-`N)U&AY-%R-ÓWFaDo cl\qۊ01b_IT*qN~9]T yޝW&܋sIi!tv{l١f(‡V\҇C0ކən֚StZ5fqĢU% e,2QIyM1a)f,㫱r<gLw&lTYAUW=*k)24eˀ6u6=J 0d 9){(_3QGk&̴`ӂ/wU 7ke_Q^ a$O \9 ⻟QhsɎZ q)3T4㴈E\ HL+-Zjq8._C/ߧ+JD!"!H H,J)D YA1ZP *?ظVXwYfE[kw;uک髼hГ  +Z*k{-$عbTP(C^D +-& l.ES=uߟڄ?<@À q,(u`DGO~\sFUSx<v9J*J*% NNӺ#;O`>iqC(:qA23WB$ Zރus̝"PNc3`:tS +JP*N98)2)C8׾7!k L10%>`gW.##N8f: +NDΉ@VrN9D{TŃhդ` V_IZH/%*O ZMq +x|(i +ߨ&\CPWgbe@B5Iz&֖]-|3)%snZtνRڌf2= ^6}BbλU@<`bFv;LZINQ%hkk@ϱ_`$7zmG2}y"eTNJQi98+2'|Z(\ms g[mӢuc QSnM +r[U~[e1vKpA37{+g=&jv=YlX0qvqb|']b`V y?'N!vDS +XD)=Nŀ&3jJkhz=6IOѹf +4tx1&91@m(L`|@{LeUx-ՊR\ȟײ֣}dF|aiT=ɜ[s 5l#K+(ގIMM=w + n;yzz&$ٲ p!d9%-/ o4>Af&&83pa&:Y-SQoW7ih^A5* +(bUPh^[wھ ;S/57w/W86A'C]#)Q;l_E_/4Ns7Ʃ9!@v ۓG'q9-pІσ,‹6&*Ɩum}6%8Vl%֙"Qha-\xZCzQ~q渼5\N$cgZ1rZ ϽVN')jAg68[XX"#%%qQ/ȕ5P(BV*dg@""/O;vqa?iNthZ,'qX㲻f<6-ܖ8iPMejjX踙Q?ԠESyЈ{f<8+.Qu8E]l#la@L`d߁ɻ Frȹ0q-1j4`4?O 'qc=>h)q͑olb&ԙxU1&ъ;/^ifq(kM76ekk ;dE>wl%6ĕ99<#tmD#F\mi^B+ 0z01 ®!37,,ˠP V1kF.A;ND-fd5]1ar. 1?z8tc4kjеJ }7׽ߞl ssE=R2s|r3StrNq +lNuh_}3)sU#F(vn6Cc}nd&=^T˛!_i3e4>Z\pUlvDbXZ<RzGNT{CB8eD1rZG%w6 m%pmZwn`tm)I*õ}9\Z<l_oS>K"T#jb0`J0/Cg)ۈE&BΉU7(>6 FL|4l_tL]?SwߑoKAX.! +D)` QdB{$"XRËjJށӊmo.vn]_8w?ޯwCH$;W߇g~)" +ޤBy~{IἈQū{޸6#xf kK=G'^kIX^LUi%3mɽo@uYy*VVm_Th"mи~{P::Q>\xVCř&#!LH 2rYuw% 7Y`_uiQ<ͳi5 0E 8!uHۯ?3ѕx&=X I0Gv6.Mo(=zOhH?Q'›)vcA̿G@snnsn1zFsB9%s +ӰD cal,8a3y9LYn%um[wP|!9M0m>~4u@5ÿ`Gqq ,)f.477I,[VQ^6ZPSSfW}T̆S +ip:'Ç xou[}_Z͵zUZ-8B,Z\j79p[mcر9:q3nyh6}]K|TT|]?UDnC4]@)*(\½|4C +{P9<լiamZ8>O}\z?H_BkH v|u/8eJD}ϩu44 gC zU^>Uf}V;֠Xeڧ+(t¤QM.36c^/L4"#A4>O8yҠ"bۓ= ;[nIS?uC>Zg<};xT.u./H-aG"2+qY^zO Xs-) %T5gOA &`, `= w(kÈD"G4$XZ~ +\ Gڞ7Gʠ/e>ŋQWWb+*S0WAWck]@7GKl8E075> z^oݭʡ6+vXߡ]uHLs-+_2FQϴ}byvQ41b+"c*n!y+ FXh΃`0CDe!Gd3bm猟d7vk)ߗ11Dokz7{? NIMWw(, e%TJ!|(Cs*W6/>\߇6H8¤!T)Mm3AG𓔛ve|AECHv/HLqZӖS\]>POO֟˺|14^wGfh,ε979pJ'۱prg XQb)!a,c(x[]k7Ơ(_r/J1R[98Ǣnˎ bVX%%T7Q{܅$m}DDk ӗzY8zG7|ˌH[09$f N1c賗hss +gl`;?4;Ⱦhn[)4^RY9ۧ+&x-̛dDIS://tI:!M<1& !]3`bMVQc7%sABt\ٽyuḴ^!7p3r"c6_G4gEYn.Q{S{D!rY2Ϲ9_LWua]͜zaDV[#! V)|.==;=Amb Y4*Wq&7AY"X^>9wA!X\𹤹zJe('nwQ";!}a\W ' FYRDUsZ]+3a^ebł͙b=ւ͌W5v-U+|9קQ.3E)G숝蘃>},-4e\#̲[a/ރFF}Qz0[6j;@b]qp +E%G'x~3҇TyIwۛ\,)J9'V7rs[Fwf}Bg0ʴqDNd'_ +<2U\D'z?ax;*{a8K;I^w+/fϠWwSܰpz0OlBܑWz'ވЧ1A[g?禪*7 >MǓ9]*/#:THϷQ_L\Taՙãs3Czj36 9֔kxُ&hm/naeu?aJl[QFcO||0Q SrSqAhT[4ޜ3{\ܟR$\ݙ+u "pcO +>ڗ[Mkk>^="n)H\o9{D.Y%D WLJ'fQ˥rNX2㎣UN(_v +_NX +yMnBDV"iG|wk^m:KXG3~z`ֽg:3zzצtK&{=G2#gi$Jx=eiـm-N`(Wp Mmhx*ѷ6h"9Erv*lηwKBd{E,K0_(YtD>8ˎŭ +K+\r)ZyMc"4 (;*ܤϧxC{A4Z} <;\\\nM7@ʜg?N E`9IQAF4~Ӷ7 +DvD%O{Qq/ƹmx g.6\GFKG6n#::Fsqm 1P(j1o<,Z!!!ZqT*rɒ2:co%vu$z;7bu~VZ*8gƢ{9DDDDDmIb2lؼv'RSM8ܶ{Yvk7:Nǡ ?f͚[a<9E"}ܹdbAll,6öJt!Ⱓ$u%V4b+E[| n@xv111'\]]n':C(<[Jk_Cʲk< +Bٳgk`ku)ڳDGG.\dxsDRhljAfz*j*N>ބ]Ut +RB;,Y"?W*HTA1+PM;J5qitpwwKb̙OL$Hh1|9 !44˖-CXXӤd2IJzNx"ET@DDDD4mM4 T*2$yxxSJKyӁ*S """"^4M6"""""r6)DDDDDlS0),bX,lEDDDDD,S0aN!"""""gÜ|TyѴŜ|=""""ik2rZ+-gܛ8;ݝᢠ\$AL:QaP""8"bYTFkWYt*Zڿ~M/x.YTts7<.(,F?#xTy8(6'XkCp8p/0dwµ:l{_ +J}1-oR}v܅J6k@t IWt(p8;[r>X=m_k9oc,͈p=EKAi}ĥCn%/9 4vC| +WLDtb=TCro'D)簒a[ߞri,t=p8g1ѲJwoD +E[8xh;u@sk-JEÝp<%-KAB EL+MvOt4t4@rjwP݂ԁ(K'-PV#T-C\ywj_ļ>.H5>p8}-f/jkAWWZZĶm^plفdHtdbD<ZȁHzHj[&z:A <ue)7a,`f#:N'KQU}J=H10Et p8I"vقnwG߇27,Y9 nqR@;9тH^f)(zY_\d9IjQ =K4Br*qȖC.y?AȽC0Y60%B(zuN3`z@2 +,B吳D\_8 ;s8p>)6m݀76÷͆n,]uI٭()e+WL!_ɱ@]CpbNf)yE`Ce(p8%1) +[VgƲ+8jɹGq :Ct 0,Xg/@5QNg3! mGi'1KnR C +] l@o`#t`e3\=`]'߁%| f6*?R{Hr~FǑp8 ";]=Q +J–5"]Wh/ +V#bc!OIHHDffzc0ЎnSL=%#o/ FȖs}oxJ5uS`P/K4ormrO"d:{[L`%q>0q *7Q~K!OIt90Hd|l~X3j4t:&9vpۭ NHdenm};i5RofojL888iՇ$;tLCx~dDsvS03[Hu)_éXª߈Ӫsx?0,Y+T;QPFGny;,}z͖Bg>9۠k#+f)koCeNr*7P:Ce +1AvCPq|p\i O9FC0 U(V>X4_&?1aNޡ!#90 X!~<%OLxJcaսHqOzQ=<ڛ<9՚EiY#ktc||)4ǟTvqs<}h8=Vq~ct;d*ċhoa:GT:}AP͎˞~pvRWy4ԏ?jyØiݿCkz00ꍐ5zd8Ct1?=e@Y:7OC>v Hi3Y$~6uM|Mlb'q>av^*fɨ̃4l]yٚ8iu;)pQØ[+Kֵe݇j+m{\y#|{syFIgA-] Mڌ 8J:jh*`S&vsQX6! WX|/tS5 ;' -̷tJ1d3;x18"NX-r` +EQZg*3L:&vӂ)ƶc%,L=y c ٰ.>OUjk[-+בylZ;ϋ ex +H|#tM)hw$O JaջgyR dOqV-N9}CxuE ֭:TUiVWARc4psGЯע M0[jټ?/rt +C̢eƫ`CU6*PQ +iH Q+OR$; y@e]<wI(:l#<*=BNOhW^1FI|H$Neyrݟm|WPz>C/7.+"8H=:4XL]*)x:9U +ywO!~G(zxeŃ0eep8Ϻ.cY~nB[p+8 {ajۆfijAl٢2n/|Kjk 0hDss+.s;_p#:w3rtV};9Π7`[?}y 5R**tW_tKQ^h QbPuQS(-BJ)jkp쿰NnP@t@#^$- ꐶ?ikT~M%FmMRI@q + (`yPl)jߠyN!jg-XzvF N VSYysztt~ȤG"Tƻm-Lvcgc59-ѝiq!"5w F`gC\G`h|N ju?B<+˴t vN:00bX6XRDxVƉoؗNF1qȋx#|^i)[~?,\~<0Eh.?7ا) +,XΒhpv&0܍}_~*q4qjL}i| k!;5T^.D`{Wg&u +C>0`Fyw/ٝY<77xlU似Ny8UX%kj3POFae0?;O0WޠUk9` gVO2&Dq:L`e<߽6tlݪ +__Boo/C]]=Ԍ66sc.ܽ0/qݱMB9:EPbo PVj^{"PսCzM+~.,h2kPm̃y.qxN5{Bضs`"_p]-{@E+?Z{O_'b{gPl )NK߁6.89-su*6I͚]B[w|{&GsW'D0FIA' 7y_ J:E}ޥ +?,GG5N0𘨏hΣ6ʺRWJkp|Prlbh,C$I8o+]ڜ TRx]u{PxG&WF''rZb> k3}zM{S0kk+kyo B26eؽIRbN2wd Z*bx4q4V=+KvȪg47ΠDt +^7Lj2*A4E$t|dkS>/xa$~I4B +_8n>ĕ+WwC(ͭS0ba̾CPNPn/ߧ4\f ƈ$r !YaA XnViZDž]kѵLUR[]T6 +L+*vYwn;v:}>b%ߙ3'sss|Rq +$6yKN_v1JtT*C,gPq\Py6vBa|Ȱ"!=@_=$(7U9n4&DQ HȘl撡K /^5|x~mt迭^ '3(_ٟhzId#/)9%o%;PhH`^J%F"Y_ppNٞH)9SdmI((b11BC.)s!=ܽˍw0VMkxF!|61G{2y#ξC>k ;ˇpkMꀁ%drH}X9Q4oq8%ۚq +Vin =pycJDqJh;OI |/a;1(6t{w< TL0̇m NyTMpX){ /ExÇQ[^$Q/7dZ*_~'N +[i~)k#YhkH*D |qp1zR->{#%(W +U-('E,~Mso \!~Tb*W%.YgP (VˎAxo=řRE,ǚy2FUФgbX_d>)fN1c;P^T?$QQ[jvC/@CW"={xrӵ'd]rr/*ٹ}Yr|x.צOx+\n'Lzޠ<6o-14D`w{x=/ٚVFwHe[\^s@(/iߘdtwgOES'TqD9l}sX3IgJqc~tXVz _”)=սmCci%c|b02e +99ȱ7qA3m_rJvnHZ/#x%%"RDf1]`쒒>_BRcUmb`F(8ۆHYw +"Ȼ!H5YV\~ (8TzDrX!=`]˯)93"qXjŃmB^+8ZZ|kJm+} Y_j؋N8` +C+,j /ڠ"^"0Ooau({ch0N1vߚdsu+רjc{ڽ0nje k;yf&jK-!3ȎSQ |/Q@i7'8Bi['S/L.h;o[=_p~RuGvbc|,Q8ن\o7m_r)=J\b wZ HZ1lCH*@+N*dd?BQiqKּ˪}`̤ J\BR@*/X 7FL0gOz?x-tZ-fyɇf-4N+[NZO1l>\f pio2}[7|k|+x6|~ly-xٜ'V?xmټ1f)VN%lWw(7 ;,@&T7DUz +}lxn T>] ,rC~?Pޒ#%%1zaֆ^'=DIko#C6o J(Ѯڟ_⽪/R)=?%WaEt$*K++ :ݯ7 Jo:>@g7|ƘEE(գs_h2|"7ڥshՑ TߦO<6@61K`x7; e cUاFy珏8^c:{PhȀ`΀&ދdet0e_qw)Lo J(9fxJS?)/-YGv]T /l݊ⵥ(,(blkڂ8~:}Fl5NQ*H[lBiTg^8^rɕ[H pO "ntjtvBsΌNmIV?9/V gow~ +O# Y8$UDT?!hvVLDDDDG@ QuzN +r JUV:7\䥃6&o#z=RRRꭽNB||<+סbUGD*@_yCdd*5ρ " uxoxNV<If"ju}DDDDD.LyqxAu3gc80pQ9[qܸ;1\Gqfr0 ƍC,S$ bbbeAV#'PNA9_'vMC}g;߳m6 5"Vy=/]ghܥ>L~`}XUo={v{{8?}3W'057ɩ1\v^C[G3, rrrׇzKg9"־i&@P 77FUl7? YG S@:0sGe 7ߝ󙙙HNN\.ǺuVaad߇z)DDDD-@qz=ZɃD" * +z^.HMm500 ~oݺ5,v@h )V<;(sTB}|Au34~@C\5Ͱl}s;v_Ud?A>S<è0!p]8qbbbf͚>nV)֮]x$&&͖R FNӄp.\W(}sw%|O~$EB""""OJ;IRDFFk Q8  +d^'v +QS(ܰS(ܰS(ܰS(ܼp8 !""""" +""""" +7""""" +7""""" +7씕{!""""bMtUhkiǹhBDDDD,5Q%z|wąCN\oo ~;qAZc,.fgPjnsRbEuhl؍C#l"""" %"݁6p- a%pZK04L~k{p!zT\Ca1<o:hIR$| ӈZ/6~KBeNٚ7NmډT[T谪iSǡ`GpIlLxǒ:8 ;?N(*0 G %F3,%V8+>)5YF)F؄v4#GViki`$}-g"vC4{=WW{]scFjH+5"**2}O(&830*(WGͬFo#n-0ەaư׏!I?Ү>ӇOmN-7h1n-bTWNil _ :QF=X|'X .=&p wcn}~9ڊPwzoNHc_dE܅*s((`TeGN F0٦|)ŵ&s1e;[ťQia40z&]@É"3SqJfmWM"BǑGqe:DDDDD&J멇6nX,&!as:Rv7'BT0x/Μɉnx\SdR P25 +df"+m'TQ8/RgScFotޅ[ݸs%8?`&[v9d4h@P0!$!$@@0 1!J=0\TAԊ"^ tv9әNL?BZr)CՈgf{z7;y6hy01(.2␮&c lV;3 \2vq?G1<83t290ԡdGLD"ҚqHB4WbYlF΁PS (LE) z%,9 +ɠ"qO +FК)d(ۯ@!%wqX&yR9|x:\ۏ!QZRl-p9`@0-6킯^'SO1v.u2 PiwƵu6zNS u,,,,,,,,,_)CkVBHކHAKk!H@DDh"6v/3 p0zOb7oWYf=%)NMp̐V;j ((*C>)#%MFt0Fw1ژ9S?1h%Z+)nT)rP\d֤O!BįpR!.C{xt%t!]N#LN<Vo-<4+؇g?Qz33OI-r -iVYOifZm1bf,xa{dtS)"Q"rY̜! DD$?a-YO[g5谪.RZ;±?#kA2rֿrFjKCE>8 sj?w9Hnpp:XJ_/55^fO _gO[ن8x/Yr;VMcj;$qN|9Nնʹ0ݍRkɹ`yUa F B'7Α%rÜGpi|H3ws[ Z,ݻߍ;|W#IZ@hbϞ8Nj FRR2m|\mx\k\dRkUcP™l3Ы00u)s`v +N5~xO{ÅR_Ŀ&iEI"^,l*u݁ZzMQwC#Zehp>{8wz2 &'?@`z6$.!jw@ˀQL04FCx5\f{ Ip'Є FH\| +5zZj#pu*>_OMeg6l3H%` +L0Q@GQ6`Pэ춠VCg:Mhitw?Lg˾+zιIH t*̜={<<ߏCi S\gc;,CO=22 +$r^WVЌǩNrN07a%(qYkhbiix~eу}. 羠җ>MxѣyE괐\!p=:uMz赊O̟uFʭ̱zHWC.CuÄIV/y>\i' s9yM( ++ݰi0wmɐ* "H ./{Hħ >'?x{?rFαJl:9;ع`(*sԢ ICE/w>v^M^6W!@$]?#xTbeoQ +O\Vh.7|}5*+V"%% ~xc0 ̄;Lde ''m(,TBo :._|סm5fw5FNA;^*v5.XU8SD%Ni| +W\q] +׌Q!O'?A)؏p?47|0|@7 zPkm$KB*4c`>M?}mRĽUkZ;Rh&|~1e"? +B};z}><d;j<q¹ʘ(V_6ۧޏ~8DzMc䜨!lDcg`T^n[I͹8yRnCE9V>^,=YTe!wN 8􉋄Gx6kË/0660n&"LrvZ>:SM~ވƃJ|ӱ %Kj5ҿFo+aɮ +gVǛÌQh-8YkmQAY`=3t%;[n, k۶ng\SKx>b?s|wB +*,j=҆ptzPymipym>d\EnBz-fb#GM T,MIԓ~;'ox䰵X0zgV&P ev2!&5)@S571c?j/6%k2THc jƕ }P-;W8vѻTT3},1-fah͗Sa߲p&.Z L3.}nRbwCi#R\kΉ<# hvksŶr.v4aT`==:_cN. *N9iRH$bV[TYSf;ڣXUt b^BubqVl,T[ncr ܺs¶ZN[W +_Zd:q%IFڊqX1FInus{g?ݰ/ÌBD]_Hchm9PP(%_O5M.#5PxD]G[L~ 7a'WzC!lW*77w{9Rِu8XNiH_wp4Si]2>%GMԘJAG6umrP׎e +_Q)i +Dp!0G1?8m[;~{/ Oo },0$&sS_,qY&}qu$b p){ +5;P 1OJT*?jZԶGM@`淚*qh&v4xtH}\|AA{6g˳EV~"wEP\ߕ^&+`8D88Fg,+[sCf`X1D(B]{<"Y-U wm2{ +1KSwᜆ3dC=\$qX7nUwGQP~j_C=܉=MhlG5!!!pww0^3PLBMqZ 5`wk6O>oBE:9 +J%O*b WG@|Eq-8=JIK@LE-R #_:#Ew6ߒ؋3ոaP.^o$^RSVj!""* +NNN^3e˖A,^^^ Ćvb;NCV+7yܽ OpzO sn/F!tOOO:#bCa"!f;)\0I_?{PWa6],ңw%inB`ĮK@||pçn +p)ŹL+NG`}Z>q "! F?MEBD$sbgc5 DFf:4M K%ϑ yamz `t݀)6W݉mMGN~t7LS͏M> g)CDDDD6-);Cwo3{ӄG[10h؇cqz.^Ko kd.0t~q3wQ*g`H2S=39T7?]]-/Hݐk}P+P?gADDDD7p+:bapd޽wF18ԅ SN>7'zٯN9|(9*ZdXԘsGZmDYW`OƻQ^-2O Rã5??Ԧ")( MDDDD$Isd7b{>P(jk˃EN~v Ng~?vG01y >&z NhdԶ<1zI"GDġMi齹x5V9C]30f߇~CʾTr 7*[ . 8 +c`Z>VE3=ɸSpųzE/5 rkb0v!^ۍܒ1 +O5l((EZMJ+E \G4xb:l%;a1> [ń3Vr^g9(1!:LkG| $j_ԭ.~n_AH&QFJȮiH`_/E&lDDDDnd`whmDY7W' bbfs =+S{:0sk&ۙgbyQRuCtǀs[D쇜*ڤ}-ǠZ9t蜆)6 @WgU_AV!Nai>53pU@^m>`n8 ds r/ k?CV*[!"""w,'8tphlď ".:) jV<˯ٜévڵ +qvrW0:֝-ͳN),; +[A]DwL)ޤtJ94zLw~q rg~(5/N_Oi`kH3[!߇ g&@8=Ȯi~\s:EvM=IBCerb14}0/.mL7[W]0^8_Í^N 30iA&x9ݮy7 b{鮹C۟f՟泽قT;*;))--q=?.mY( Źcں}1ۀ 8;10)Na3Jj%:ALRg, uu KwMRhmVӔ]i5 +{`C&^JakHGysν9l8=-a;`Ҭ 5r6]9} EAp#tbx>;mIN1D>xo-i dSt^J&'ea'V+]%2A~= +?Eϡl]D^?;pvF^b v+ρ(LTCQt.1|H6´U%*_8϶m/9 =%,--PEb'0dq8 ׹2:Br) wMQDسTO:1cqUym?gFә] E0/lpY_8'MX]]M|8;%Q[XHHr!6byX'Ռ/xögB0 VtJa/bdkw<%tuJŊLcmNi|ai)CU|iI6y+Wsd?A"4=egPO/}} vg.2%^xI`Z|Jc (O0J·@c`m,WJl~΂rbsr;Ն~6sm9|{X$l};o9hxʦ0 cM8+ XB2|v,V$सX)-: +[mJ8#jwF(7ˆpU ae0gCkk*mEsm:笘'm22b,qߓKԻgJ^#ܷ{6\Ѵ ;ꔬyj>h4ȴ:79}9:_eH;4Pw@y\o 7%(-5&X~\r +۽) +y +*/u'H#]G +>F΃7cXBU'p/?4 lюc1蚎{!1|ʮSt +<)0MKSPyE4/ _wȻ,WO={dlыŹ428P]393N7&ɔt=;KfQ p6/pcnm4t>T-_YUn_K4p erؚeX^=氹,=,Ow!I}I>\u)jFގXr(z)+GDX_N8 61Q+蔬x ;Wm~{u3˔\9`b".].jy/,U`i!MeZP`/&>+]QRbPrvK{7#rnhB6:H_]M砪|m~KC Pn:+7nQ&rzYL/;n5qʖE)h:xyvFU*t +vf:e/@ +yIL2t +[!Q~.n+P[0g(K~Z(ZKeۡ{pTވ'/"yz^zf.+ :5xW>׉uOn?s4^ bE ̭Lgwqż Ӫ5͏bOM]3;ze^l <|Q)&gCl3ظ q2,\.ƄXs%n:,{S#D%Z#4<ڃA8qswx&M&w2lI= p\,m)1v<.z.r6ҘmhrG\Zzf~ q^6}6r綂sBi>cR;pNo#HJY2 JK8tl& '7,}s J).#M>⋦bLi@O8彋bu Hh4"R#*PQUm~@]]<ܸν;[K!Km7_ȅ&Bcn D%ʊ5Fe64j]Qj]f"Un.ێ; mٟ9&!n(]Qys~u-0'<2@x Ҳ X/)4aȪ2<)#oc-i3; EnSrK,2tH"Q+/x3p}N1>2]grh[}g=טx4 )IVk+X]»k5LOT'ǩPl•=bLIn4AiI8hܗ&Gvmnv?:sUm=7lAk13DN2{6ײjt6IN멐n[L% |׌DָMazZO?E4iBQ#'kA^0ED 9e﹍ +^z2{2NClX90І'e7D#ʄڹswԢ3C!eSTE'P_4ii/Ɯ7Yc99&sqa[­S~^6r<ezO;]Wn[!8& pˆ>WtjTw{RKLP[z!R>q/aiM"Z$qE%m]rN,s8%9sSX˪-IOYFI~ 9sdc[wFwO.@G_'ӓ$6t(|?C3I G\ژ 3J7atN8;AL[Iӑ 0 =\)q5>ǜ僊n6&yֽ9eƤf헮̞,ę(@Z8eFcYb0jFEF;G5UNyZKpJ+淎 ?@Ϸϡy߫70x1u`(1ʺuVkc7N⛯Y%mmm Ǒ]o8DS|1}Ja‡P0>j$2a`[~ +v:ZEbl߁ ۸~d6?QdZ?KfY[#s(}9y`B=+1h/ZA%g.lXrO\Em_qy5y&xC$hat` BFxn,;X.l$*Ե`ʬN)y)xVyMlsu/Xn|39$iHl(ˋAg!9s/Ӣ$ӱn!Y+8x0V;>} zQ5jFNdPҮш&\ 9sfkB{[Z2G-vyə} QꋵX}!kᅶ՘Sgsq.:`aM+x$nY1GsCeod{"s +d.R]$9.9ׅ]XVnx/=;n4='獾04lveh?ɉd97nlwEocxb#DQJKEGYy^ďjZ%mb:ܪ^drOWȮ5uj,u.jMRO6j2Q509Ϩ7ǞB(#(k +VV(00f9;-*ͩY]qa Bb.EMU-Z[^C[K^jqR i^PD\8 =xtuRT~yǼH_vaOʳ,():BḋjE&Ħ7%P> q\R˧׌d#8c^Ȇj~gcM}P4Ș1Oo"j)sc}]x9gܜј|xHSSq^qnX݁YPi ˞kx;z]w|\wg{/dlI2(3N9td^Z) padT&mMFV]dU!{U=8c; _0 +7v>`)9=t]}w{Uw0Fh=T3 QgIN䱺S^C3K3ZEƏZ@{68^#hs[l`ne^0?I@$@eH$@ĄK@ Z;]q[EuTovkg;;N;+n~];{S +ZP1N^ysy`/#[7iz~{t7![KQޫ%il밮,ιm΅a]\t?3: ?6e +yfgcnno線B 2LiHKK$#Ê|oݨkXlN9{z Hu_|d?CS14[%h?L'S@ݝe]޶?,QhgURǠ2Dm[pme%2pdWe٢wv+k{('WuKގKzM\3y`qŠr uԜ}{B(VMLuo,]":P\UY^޾38""""ZT\攋JF)g7'DMb񫡗QP w زl(PTF'}V\. $$$C؜f F8 P3wO>EwQ2,Ч0ڟO2/rJBQŜ!sHYI9\LP>)_c3{0:""""Z ڽ?h\uJ-iW>zp!\޹9ǕJ.Ʃ9WFx`XaͱR~zlذ((*Aa8 u P[ 䓻Oqym1L>n*Pz`YE"6'ˎ$Y%ťs3M >y>ѣj؋/q>:pp jkP[[/k0qN^1~~g>;[}U[>הgWy~ff&0'`EtuGX}JlthWt܎.縡R)YYYp\r.H߇&_^/<:<111(ɌAd )`X`v3kD^?m{'s@sKqxq^zz|6111+*O +@hdBDDDDϠmFYp.zѲt:֮]sRr V`@||lf6 999˃9MnZq>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(137)Tj +ET +q +484 612 -408 -145 re +W n +q +409.2334137 0 0 146.0104523 75.4947662 466.4947662 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 455.6 Tm +(F)Tj +0.482 0 Td +(igure 4: X-r)Tj +4.822 0 Td +(a)Tj +0.47 0 Td +(y J)Tj +1.044 0 Td +(obs in Hudson)Tj +-5.018 -2.24 Td +(All )Tj +1.943 0 Td +(test )Tj +2.165 0 Td +(classes )Tj +3.665 0 Td +(ending )Tj +3.666 0 Td +(with )Tj +2.61 0 Td +(\223IT\224 )Tj +2.442 0 Td +(\(for )Tj +2.165 0 Td +(Integr)Tj +2.433 0 Td +(ation )Tj +2.814 0 Td +(T)Tj +0.456 0 Td +(est\) )Tj +2.165 0 Td +(are )Tj +2.053 0 Td +(executed )Tj +4.61 0 Td +(in )Tj +1.554 0 Td +(the )Tj +/TT1 1 Tf +2.054 0 Td +(x-ray-)Tj +-38.599 -1.44 Td +(integration)Tj +/TT0 1 Tf +( )Tj +7.072 0 Td +(phase. )Tj +3.213 0 Td +(Although )Tj +4.418 0 Td +(the )Tj +1.805 0 Td +(JUnit )Tj +2.639 0 Td +(and )Tj +2.083 0 Td +(ScalaT)Tj +2.734 0 Td +(est )Tj +1.638 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.scalatest.org/)Tj +(\) )Tj +6.584 0 Td +(fr)Tj +0.599 0 Td +(amew)Tj +2.599 0 Td +(orks )Tj +-40.422 -1.44 Td +(are )Tj +1.653 0 Td +(still )Tj +1.821 0 Td +(used, )Tj +2.599 0 Td +(the )Tj +1.654 0 Td +(test )Tj +1.765 0 Td +(classes )Tj +3.265 0 Td +(do )Tj +1.432 0 Td +(not )Tj +1.71 0 Td +(moc)Tj +1.871 0 Td +(k )Tj +0.82 0 Td +(out )Tj +1.71 0 Td +(the )Tj +1.654 0 Td +(test )Tj +1.765 0 Td +(en)Tj +1.044 0 Td +(vironment )Tj +4.71 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.82 0 Td +(more. )Tj +2.746 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.376 0 Td +(persistence)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.349 0 Td +(or )Tj +-41.311 -1.44 Td +(ev)Tj +0.988 0 Td +(en the w)Tj +3.706 0 Td +(hole application serv)Tj +8.992 0 Td +(er \(with )Tj +3.52 0 Td +(Arquillian\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( is started in process.)Tj +-15.406 -2.24 Td +(After )Tj +2.357 0 Td +(the )Tj +1.635 0 Td +(successful )Tj +4.636 0 Td +(execution )Tj +4.525 0 Td +(of )Tj +1.135 0 Td +(all )Tj +1.357 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.469 0 Td +(tests)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.385 0 Td +(a )Tj +0.801 0 Td +(fresh )Tj +2.357 0 Td +(instance )Tj +3.858 0 Td +(of )Tj +1.135 0 Td +(the )Tj +1.635 0 Td +(application )Tj +5.137 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +-41.367 -1.44 Td +(is created with a simple bash script \(see 80\) wr)Tj +20.051 0 Td +(apped as Hudson job )Tj +/TT1 1 Tf +(x-ray-setup-server)Tj +/TT2 1 Tf +(.)Tj +/TT1 1 Tf +-20.051 -1.79 Td +(#!/bin/bash)Tj +0 -1.79 TD +(GLASSFISH_HOME=[PATH_TO_GLASSFISH]/glassfish3.1-current)Tj +T* +($GLASSFISH_HOME/bin/asadmin delete-domain x-ray)Tj +T* +($GLASSFISH_HOME/bin/asadmin create-domain --portbase 5300 --)Tj +0 -0.99 TD +(nopassword=true x-ray)Tj +0 -1.79 TD +(cp ./jdbc-drivers/hsql2/* $GLASSFISH_HOME/glassfish/domains/x-ray/lib/)Tj +0 -0.99 TD +(ext)Tj +0 -3.58 TD +($GLASSFISH_HOME/bin/asadmin start-domain x-ray)Tj +0 -1.79 TD +($GLASSFISH_HOME/bin/asadmin create-jdbc-connection-pool --port 5348 )Tj +0 -0.99 TD +(--datasourceclassname org.hsqldb.jdbc.JDBCDataSource --restype )Tj +T* +(javax.sql.ConnectionPoolDataSource --property )Tj +T* +("User=****:Password=****:Database=jdbc\\\\:hsqldb\\\\:hsql\\\\://localho\ st\\)Tj +T* +(\\:9093/x-ray" hsqldb)Tj +0 -1.79 TD +($GLASSFISH_HOME/bin/asadmin create-jdbc-resource --port 5348 --)Tj +0 -0.99 TD +(connectionpoolid hsqldb jdbc/hitscounter)Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 80: )Tj +4.688 0 Td +(A)Tj +0.649 0 Td +(utomatic Domain Creation)Tj +ET + +endstream +endobj +327 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 328 0 R>>endobj +328 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(138)Tj +/TT1 1 Tf +0 Tc 0 Tw -18.332 57.06 Td +(x-ray-services)Tj +/TT0 1 Tf +( )Tj +8.972 0 Td +(is )Tj +1.237 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.626 0 Td +(\(with )Tj +2.738 0 Td +(the )Tj +1.904 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +1.07 0 Td +(discussed )Tj +/TT1 1 Tf +4.683 0 Td +(asadmin)Tj +/TT0 1 Tf +( )Tj +4.771 0 Td +(deplo)Tj +2.434 0 Td +(y )Tj +1.07 0 Td +(command )Tj +-37.866 -1.44 Td +(wr)Tj +1.099 0 Td +(apped )Tj +3.206 0 Td +(as )Tj +1.427 0 Td +(the )Tj +/TT1 1 Tf +1.872 0 Td +(x-ray-deploy)Tj +/TT0 1 Tf +( )Tj +7.74 0 Td +(Hudson )Tj +3.929 0 Td +(job\) )Tj +2.206 0 Td +(into )Tj +2.206 0 Td +(the )Tj +1.872 0 Td +(freshly )Tj +3.372 0 Td +(created )Tj +3.705 0 Td +(and )Tj +2.15 0 Td +(started )Tj +3.372 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +/TT1 1 Tf +-40.977 -1.44 Td +(x-ray)Tj +/TT0 1 Tf +( )Tj +3.284 0 Td +(domain. )Tj +3.804 0 Td +(After )Tj +2.34 0 Td +(the )Tj +1.617 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +2.951 0 Td +(of )Tj +1.117 0 Td +(the )Tj +1.617 0 Td +(application, )Tj +5.398 0 Td +(the)Tj +/TT1 1 Tf +( )Tj +1.94 0 Td +(x-ray-fitnesse)Tj +/TT0 1 Tf +( )Tj +8.685 0 Td +(job )Tj +1.674 0 Td +(executes )Tj +4.006 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(functional tests remotely)Tj +10.412 0 Td +(. )Tj +/TT2 1 Tf +12 0 0 12 57 550 Tm +(F)Tj +0.482 0 Td +(itnesse + J)Tj +4.428 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE = Good F)Tj +6.127 0 Td +(riends)Tj +/TT0 1 Tf +10 0 0 10 75 527.6 Tm +(Functional )Tj +4.945 0 Td +(tests )Tj +2.221 0 Td +(are )Tj +1.72 0 Td +(similar )Tj +3.276 0 Td +(to )Tj +1.221 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.555 0 Td +(tests )Tj +2.221 0 Td +(\(and )Tj +2.277 0 Td +(sometimes )Tj +4.943 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.443 0 Td +(unit )Tj +2.055 0 Td +(tests\), )Tj +2.777 0 Td +(but )Tj +1.777 0 Td +(they )Tj +2.221 0 Td +(are )Tj +-40.867 -1.44 Td +(dedicated )Tj +4.555 0 Td +(to )Tj +1.165 0 Td +(stakeholders )Tj +5.666 0 Td +(with )Tj +2.221 0 Td +(domain )Tj +3.61 0 Td +(or )Tj +1.22 0 Td +(business )Tj +3.944 0 Td +(responsibilities. )Tj +7.001 0 Td +(Integr)Tj +2.433 0 Td +(ation )Tj +2.499 0 Td +(tests )Tj +2.165 0 Td +(are )Tj +1.664 0 Td +(dri)Tj +1.149 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.387 0 Td +(b)Tj +0.538 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(dev)Tj +1.544 0 Td +(elopers and functional tests are dri)Tj +14.766 0 Td +(v)Tj +0.488 0 Td +(en b)Tj +1.872 0 Td +(y product o)Tj +4.935 0 Td +(wners or business experts. )Tj +-21.805 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.564 0 Td +(primary )Tj +3.841 0 Td +(goal )Tj +2.342 0 Td +(of )Tj +1.342 0 Td +(functional )Tj +4.844 0 Td +(tests )Tj +2.342 0 Td +(is )Tj +1.175 0 Td +(the )Tj +1.842 0 Td +(v)Tj +/C2_0 1 Tf +0.488 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +(cation )Tj +4.843 0 Td +(of )Tj +1.342 0 Td +(the )Tj +1.842 0 Td +(correct )Tj +3.508 0 Td +(functionality )Tj +5.9 0 Td +(of )Tj +1.342 0 Td +(the )Tj +-40.866 -1.44 Td +(system. )Tj +3.546 0 Td +(F)Tj +0.482 0 Td +(itnesse )Tj +3.269 0 Td +(\()Tj +/C2_0 1 Tf +<0040004C004C00480017000C000C005D>Tj +/TT0 1 Tf +(tnesse.org)Tj +(\) )Tj +8.272 0 Td +(is )Tj +1.046 0 Td +(an )Tj +1.435 0 Td +(excellent )Tj +4.269 0 Td +(tool )Tj +2.047 0 Td +(for )Tj +1.546 0 Td +(bridging )Tj +3.936 0 Td +(the )Tj +1.713 0 Td +(gap )Tj +1.935 0 Td +(between )Tj +4.047 0 Td +(dev)Tj +1.544 0 Td +(elopers )Tj +-39.088 -1.44 Td +(and )Tj +1.951 0 Td +(domain )Tj +3.618 0 Td +(experts. )Tj +3.673 0 Td +(Domain )Tj +3.84 0 Td +(experts )Tj +3.395 0 Td +(are )Tj +1.672 0 Td +(able )Tj +2.173 0 Td +(to )Tj +1.173 0 Td +(maintain )Tj +4.118 0 Td +(the )Tj +/C2_0 1 Tf +1.673 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +5.786 0 Td +(and )Tj +1.951 0 Td +(execute )Tj +3.673 0 Td +(the )Tj +1.673 0 Td +(tests )Tj +-40.366 -1.44 Td +(without an)Tj +4.596 0 Td +(y dev)Tj +2.322 0 Td +(eloper interv)Tj +5.434 0 Td +(ention. )Tj +-10.552 -2.24 Td +(F)Tj +0.482 0 Td +(itnesse )Tj +3.208 0 Td +(is )Tj +0.985 0 Td +(a )Tj +0.818 0 Td +(\223wiki )Tj +2.596 0 Td +(on )Tj +1.43 0 Td +(steroids\224 )Tj +4.041 0 Td +(that )Tj +1.93 0 Td +(comes )Tj +3.096 0 Td +(with )Tj +2.208 0 Td +(its )Tj +1.263 0 Td +(o)Tj +0.544 0 Td +(wn )Tj +1.652 0 Td +(read)Tj +1.865 0 Td +(y-to-use )Tj +3.726 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.374 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.559 0 Td +(A )Tj +0.985 0 Td +(wiki )Tj +2.152 0 Td +(page )Tj +-40.144 -1.44 Td +(can )Tj +2.108 0 Td +(be )Tj +1.608 0 Td +(created, )Tj +3.997 0 Td +(v)Tj +0.488 0 Td +(ersioned)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.47 0 Td +(and )Tj +2.164 0 Td +(maintained )Tj +5.387 0 Td +(directly )Tj +3.775 0 Td +(from )Tj +2.552 0 Td +(the )Tj +1.886 0 Td +(UI. )Tj +1.849 0 Td +(W)Tj +0.982 0 Td +(iki )Tj +1.608 0 Td +(tables )Tj +3.053 0 Td +(are )Tj +1.885 0 Td +(treated )Tj +3.497 0 Td +(as )Tj +-41.311 -1.44 Td +(\223bidirectional\224 )Tj +6.849 0 Td +(test )Tj +1.959 0 Td +(data )Tj +/C2_0 1 Tf +2.348 0 Td +<0006005D>Tj +/TT0 1 Tf +(xture\). )Tj +3.997 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.57 0 Td +(input )Tj +2.738 0 Td +(is )Tj +1.181 0 Td +(parsed )Tj +3.348 0 Td +(and )Tj +2.126 0 Td +(passed )Tj +3.404 0 Td +(to )Tj +1.348 0 Td +(a )Tj +1.014 0 Td +(declared )Tj +/C2_0 1 Tf +4.237 0 Td +<005D>Tj +/TT0 1 Tf +(xture )Tj +3.237 0 Td +(class. )Tj +-39.866 -1.44 Td +(V)Tj +/C2_0 1 Tf +0.612 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +(cation )Tj +4.614 0 Td +(is )Tj +0.946 0 Td +(performed )Tj +4.724 0 Td +(and )Tj +1.891 0 Td +(the )Tj +1.613 0 Td +(actual )Tj +2.891 0 Td +(outcome )Tj +4.058 0 Td +(is )Tj +0.946 0 Td +(compared )Tj +4.613 0 Td +(with )Tj +2.169 0 Td +(the )Tj +1.613 0 Td +(expected )Tj +4.169 0 Td +(result. )Tj +2.891 0 Td +(Successful )Tj +-37.754 -1.44 Td +(tests are highlighted as green cells, failed tests are red)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( and exceptions are y)Tj +32.354 0 Td +(ello)Tj +1.6 0 Td +(w \(see F)Tj +3.483 0 Td +(igure 5\).)Tj +ET + +endstream +endobj +329 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 331 0 R>>endobj +330 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 665/Filter/FlateDecode/Width 893/Length 97746/Type/XObject/BitsPerComponent 8>>stream +H_H\g'I1:f2Xk̩ZZ;AdTiDfeKIi .;G&ˮl놴ZZ]ݛn_w\Mcc\|8swΜyoևgh{u3kYzJ덎bxxDšvgnB`WWW=Ǿd[سB!Erݳk.^hbVyh7Gv9yk?nkϞ=cզWwjb:~[XxKKKX^O>^VqMc6wY[]L&H$088==hoo u~M;l!\Yx{a߁_{ W ~}<8Uz63߉~(χ`0h]w5&5z;Ǝo͛7{٬5[x$v~K8FЀP(*kjjg:ŜYV[w>8^CYe +{\#9qsbdžxfffd0sD;^CW2-^G6 Ez{{㖗bnn{[>qcMW_~aǹ.K$y;ϐo;5`&##Ssmmm<[WZZj֡/..Z ީ؃l|G<ў~:z<|ޗ_kul5o?siooGKK Dtv-wŜY+{h+-;vÃd\< ^}V[777\.7oio;eީ DQtww#ç4kcvtt .#HXױɤ;|BwGUU0fff>va=f({$G x(x[M[ѷ]w FeӶsu?ܮĚ]LTw'ˢU'0€ 83b^CF:m eYZ'EKٶj&hw.lbk!eLjZ*{1DSu&xs#iګÞ]FӋ3μ?ssg(r#B}ڨJh8B!f}6DVVYYI555\]]l9s~xjf3փ`?m6 8籰 +ţwV$I$IjPAȐz 㳶}oUK|,|vކX=i(:n|L_\n~EQ8tv 7Gїw2<}ϊsYYI$I$IZ=el"?Q|Oh՚B5؉ྜ\6Sgj zRxjG$I$I$-evOo/Mə/k Ukb[}*~Um5ޛ >^EnDVLg%%%l= £4EF㿩K;5^HFG [>Cp p_Ͱ`OKSS[S~b~ZZ=[Dc.Sgnz&%I$I$i)+-Jdow)|DwӁ eF;10H<s1_(++Ξ;Öּ}p\MLLcXn}3f6,J4u}Rsr=6 ;[]7oL#vguu5?_cFQ +Bl˅CF>xU?66ϥ*II$I$IZVSh+@ ;z(kߧ>nT\~jj\|Ka!(ݠ)9%Sg˗/gv0 ۷yor2փ6sr(//O(N'ip>R7|F_cXo8T!X3  ^_aYK'Osٱ?$I$IjcU7T(\4_a%gL*Z%-:#RJ5~JX366abvnϨ׳B P__o4pjiiaUWWv'_5v(*z稼" 6>9ms: 5̙`>ޏsq jѽ{r8s`Dz {p·TfT%%%QVV)ž}'XVo۔$I$I'-..\{(ݔ`5|nXM)[̷*7xx444B1{΃~?y^6߻]=惩nn-o577hd?=wF;xKK EFZ]0xy8_"^crªM1p\uub`>Λ̺/-- + + +v`ل> +ţS$I$Iur9^+콸q2^bVng^AmPdLub̋0Ofu|U/;8N^(~:|0ir2yIQڶm}v2{ Cf'8h#a4!F)aS>}tj?w{%Ú=MuMu_GGgTTVVF}݈gsCz>%I$I$IZ@iuBv)svj|r3<0ù+)Oy0CRRx~?uuus~sCTSS3}|/x 㳫PMFz:L]]]428=Qwwe{N:h4<lΝgv[ioKWyM)pNu~q}öX3~ٓlYDDDDDDD 7P")z"Rz($qz0`|xxqP'vVЊYy/,e+ N<`#|A_;V`0; `lɁ=3jwĐVe֒$-e0LqVFFA-XɁ13zWVVmgvëX0_}}=V6Jп hhhT˴ +^Eu Ѻt ]Ls\~{3߮da>v2r!dăd_'mҸVO1lڧt:>d>1R{V 566a:::hdx=w\l 8we{?g#PN^SAA sȝR_x;}uh(88?OẇC}gl^c!}uuu=̆<_gg'{ƹaN̒z8#̣2gOC̗|7WzXWK {8|Ur2HA >Ee8[iȣԋC~vo3Ƥz /L7z}} b2m(oejjjhhhZ[[ǎood555}փ}v; + }u]d8?OvR`Rp3a}}=W"s'{c^1ORx\`y\sXA[6oR+x?m+|g13c֢<+;솆yoWi;`tD$BggZ|E,ߌ +@3ɻ|Ք)-%YjLY轾$oxn`>ן5 +4XL1iE=RŦ)/H$)bօBk`dpbdT65{W +0Qvtp{J E0$'NcXfXGdd|zxvL|>pЛyytnw97Wfܘ^͇=߽{Go%L{Kgɻ}%qSc_{>KWdS2Y|""""""ߣiSzSEYzO6xB#I G̬m6d$e|%\o]=\Z]]ns8΁=p^st WX ff>}d|$Mq<?~L555l>vÆ <3ig}Q ?~2xOx`Vy>̃>*"/FP]jͥ?O6*f>32U2JL5Sn~2e%Qj2H+hur,enL5% d6i)d%JO>-[ӨhrgedJ + ~>ZDG-̙.Hqp + U'4u#"""""" \_jhNڤ> +XfŞ*c190ܿRNY40ԿNaa!r>X}XVI;_=`7`&_8}0_tt4Ӗ͛|6>8aaƃ !cccs\|'N*lbPyy99 =L{KkM7sj8wd~vϦipm[>~)uTɚF8}mioVze6$.pngꦭ}vJw̳TRCoUZ5e#0b"Fy'<[t,""""""2х(^MQc;G)=x{u[󅮧. + X]s֗Ws`HCX2~@)+CG5 A#Cn466rJJJzs2;d8 78 eGPG)dQBZ4u$.JCl f5k/jzQnڋiګ \3{s^|XdXH{*ni惷y]:݇F݇>j˰?^:xO`&jnnfa}5%%c,܁:GdϛO(pdUY_45yeK9szi|Fqg2ڿWi-%>9.fS}q}#8QSDM,ٳ'`P-$>i𪶒i:m֣[|_vVos_OUC Qkk+577> [OSww7蠺:zxm400@|Eϟ  X,466~fkƲ$IST̷݇|rv|cIÜp-[}|l6Ѱ&xcǏoa<|tR/XjT\3mfG4s;n}v )w<몊or{jkSё}}?~_ſ{#P0455ed>kmoӣϭ\߬eKpOZZtV>`$_Cϒ72rv;$h4炂6͛f_||E7wYt>``܃d>b_l?`(Ysݐu]_wMnuTTF3RR9bԪP{Dcb~shӾ|AtRi=E:5#3*\*S5l̥(~>vOQ-s2"5mߋ%VM"w"""""""ɩJHMIi6ܛm<יKHH5̇k0n>/XCKuw?~ѷ"N>OG* ||<TTTй_ogN$}Tzz:{/)) .>Mh\f|$q'a:;jdZXXX,TRRBuuu_l5!X2*:s 577 xXٍ֧CCC<7µ@%.j9]lTVeJ7I?VgUv2E/s>E&QۋԓiB?a̗m)i_]ޚճ뇯V3,יQedkx"?VDDDDDD$YIyZcN!U= +v7헤>G3:2]ϋyd%~sߟ#=cccΖi`>f9 tOJg rOպ3'ORMs_PP݇zm`Uy=##ר}I3>פ5">"uO---ltT]]M0" Yn0SQq%Ȏ jz6ԥ`>%74)xG1c޲ϺgF|Eo߯eit[#z0_gM.B|NDDDDDD{J4\;/80_-Xös5扊"K1 +Son>oy>>1OTtmF7n`l6~@xC_<@yde6$L6}p|܇aR*//uq=xCCClף |ֲF#=l/v=}Y%ك<#=@<;:x0junee%[Pr'8g[ɣ[r(ԇzW뻑L1uyx6>J}z>#'"""""+hMN oSяb{o+N3 }_I PWWGp8=H'˶{p惍hUwdKJJbEs7`>}p#柘G} +`Ajkkp0|H{d2Qaa![J{ װ6̅fwBފ +r:k,7Jͳ͇ 󺦒i6e.0uefRiU7ީ[kP .ŠVQ."=V"fE X$v*Z'c &$TmXTLhQmin _MFtb2u3Xua/?{}sγ/;XB)qy )gji23!R4,9I.w"'F߬;LeiS|""""""o`02cOhI E 3c)>S->Ks}9ZRʁmEF}5^O?昮3 ^2Ld4Qy飧}+vMd"}0_ttI g󥦦~g*wfTtmyC*g㰟0XaG 5ӝg6?c=´._>߬V+1 Nɝ?&唞x[Ӎi7'c(-Jin1gbi(G?K1}?u.2'!ӧ:^Vyi?a>3 W8q)a IfO.tpױQȼ_PަpF 5枡}c0J:oX3{&77a%5 0Savt&Z.nڒi|KoFis]fbP|XODDDDDR)-Ri)*|v6cc•&<"! }}́y0Wg '&=ba>X +3~ԑ{wm/=X}WPP@_=|Hγ-G߱/Xu8>̕`<=fvg1w/]HV董\Q`0L07%=Ax`jL|nH1ݮ7gG]#9L^/ݘ }mk(C|""""""_^J--Mz◟anfD]q{6-NȮA^|fF|wⰋz:3yA +Nsz60L={󆆆rdu6kF*--lܸf3[httԐVeD`/Lr9櫫#׏x$U|0fHOOꡮ`Mh5侏7{xx:lYF;,6E=d>3 g:[WRv- k'~ß8A)jn>9m`*{9 ѤRi:u^!,.>'4_@~:ɬ)+KC%'/EN(-͢}]5^bz|""""""W͏l3)iaRi)*vP|Θ$I;|#/Jq7ܗ`. d0*pݹsY'5ea ̧며t:낂Tff}I\`}}?}1IΓ'9~Cxd8|jNyy9d|Z2٥zvjlMX?PQvoc5nM|Z* }:ͧ]*%Mqfhu w;0cr^j 2k)~9^|50=9WiU-^cRRVMHUU&dтXρy0 |ax]|FFFi7nbNcS^^; +L<}J>|FIΓؾ~ZnX}Cr_bb"^&nwa5 xc!G2֢歬 Vg©8(^F=?%|jLȥ.T ^L[.NV5W|YLf.wE$)RlzJZqbMnC}vbr9-]uu>́y0ÜQ0!^m۶mf4qC;rW^^nwK[f iZ`*Ƃ`. `4X fZl/Nrx=yX,\322}0jK5q>m}c +w#R;x gļjooݍA,EkK\ޚ1:E:i.[v@WRrEJkd*Yˤby &?N͚5vtؽ4ܚσEDDDDDDkL +eƘJ3H bm${m|M|܍U:ٳ]"b7`.̇9KahogRuu5;3gO>Ákl"`0PIq1[ uP/??SI3>pN +'{ޣnO29Ih~5q4 +/(hR% VP\dGDRE>jVT\?ꊵY1ZfEN[鬽֫N;ۋm/ yH3?<9oB~E\B}[I$%ۢgAw<>{d  fwT{-d)& +(_?vrOʶGnɔ 1d;|WUr"jQ^T͓OYLb21WJBi~[\ZlL^D'%uFd(kG#Yi JνD֭jXx1/gZS4t:il6`0=x9?J{m?FlllݻwӮ]dUUU0!xLv>xLr,955gN7/_${ 5Ì^BBBHa z>>ԊQ;˺wfwq6s8Rrѽ\3zhnnY"cM50Aqt#] a 1o&{59(#1g^Pn로J,Qf)=A"m>m|uQd/D>g&Pqi1rW2׌Zh6f.IPC\z.;5!ƣNW2$g\RUwD}2%T_|KJs+\ +ue7x)/Bߋ77ɥٳ_bԻxwC4TMem#7)- kyMf܂2'5OESZ;kZ7p;P2_$jC w d0餁 re2﫦_{hBb!0_]]yd<%h4>#7/_sr0$fjr`>}RSS܇0/**zPujZyrHA;::>;ٳ/0_4Q}%fIОcf9~E9EOmul(;3#&̇dWD|j3vv˜N˰P5?V +󉈈ĢM=쬂YpZ0^ ~KiEIII!= (+{"uւ>ٯhz){ 6[v;.^{&y<{$UUUf#~fނmҋ/h||N|!r0|'YOP܇5|݇Z/n2|xZNsl'}>h&s{+]-GnU"9~oΫtE;Ԙ/ְ)\;Kk_bSdj 0K-mm4)rHUKֶ|""""""?ðCJK#¿H[J9[x,r ۧ{ }FX7.o~E уSMM [΁ۺzn cU]|Z3 Gr_CC>)CI+++5a-k;R|-\n|k`1}PjCJ}|V\#Dܫa&''yh%dӺ9%3*qD3p[g"&);Gt\FĢզ):3~G}}-c(dC*}J};`E~8O> +v.^WBx0O-Ynk yHೀItbÕXs[=܂;Jνs3iu_n㜵zzF-Wtr:`CљgիllLlZ}MMM>݇ࡪ*ڲe Y,}X #ւ=FGG{6=j0U_i45>}ea +**"(oe^6}]tGthyoƣ[g]Cz5d5)K86.)M%rX}/(^:I[$.{;Y~QN3\{bx% + φNL'P!xzaUPiIc]2}&mz P.)""""""Wze-yBYn&7♙+X`3 רp+ZVp8>ޱZ7kpp3tyH690ߏoѩ=G|vvֲpf3}Srt.">\?}9zVZ%o>}z/F05<^gCCF0KQs_FD矷MDDDDDDd:]]ݴ3?͘CT2]ϲb7|(7}p+ZNݟk.N.^HhZPss3V%UTi:8zP*S ׹@DFj1Đ]IaIû+ .k5[v$fLdiFt:^-35-|ޟćg2x_0,jK4_`ܗhCqUܗke S̗'E/Q}}}8wW7ݺuw{|ecѦo|%et;gE}jg$I$IZй7G@+=R387ο*+?H} v }~?k{J''ә>Xnl6fٔIރ ^Y|0Z)|sa]}Oq/8C\v#GP(~Nx؁Or#U_)}}Y硾bJ_I$I$-ѣ[k׮=687οJ+b=EEE }`X;H\\߇BUUU̷=gZn7+Wx]n߾rss\Cq}f^DX'}Gq_vI [oͯӪ$ϴoqFp(ݻ{ 9RuK6+u7gz2O$I$ia=.87οJY, +Bl VK}y^6YO}ޘZs''ә>1}{===6>3l<6>X 3%O1_`܇}X{({YJ(C~jllg0,s|x5L)HJHg7 ӆe0$I$Iro ~\ڰa{*V" 0y<|lmC1p==nEr\qCpgy-?66f=|>^ϳ$j)|)z$FOU؈>}DYS qNa'ZbTMW՛ lޛz$I$IVV\577` l6Ç:::G wvuuu졪*v1fCbmQTTƜ}:.> >F3y}{"+~:kqN>711 +{W.?WTїe0$I$IJp8޽8--- s )w<}餏?CjR2Lq`$i$)_݇P oPGaTgP}}=O&$8ϛWbJ$I$IRmSp8C^gl6bM6#}0H$BP(=KZVX,T\\w  v̇9`>8Tqt3J4⾧*lḐ}[^1n3Z444Pgg'eݻ{!LC[I$I$If0488B NlWrE0Q8NTYY+//gf O݇fO1F}\qx04y1?YJWуl|5]Ѧ3+I$I$IS pPO{eQ0UZZN`N2{b422S؁ uj2^?}q&Opf]^2sK4Ma{555c=K`{sb5Zes(/o=GU)w̙6?Vߦ$I$I$}8 VSOZ0Lv;(ރ|.NδQcc#ֲ`JfgX}&)}yyyN΃ + S̗9}Kl'|kC9|>y<r> Cy.[Ѷ3j]>w1''ڵ U#sd|F$I$I$J-;DMMMl4~"^`: +Wxӽ700@`~zl':}0_yy9l6ڊ .3GOۜhG1T}Mwb>.}iii4~ssgy>nUI}}=R( 6^TϕY:Z}_[?KkGhFn)8=5goW[SI$I$鋵f]=&ڤM'LNM;l޼"mٲ]G%:::胃}I޻ϚrDfiOEjRYY + + +x{;wn_(/yd%O1ߺe y0  0Qǃ466L{Vb}gI]:d]کfK1_zeO'Ob=ZsJ$I$IK-Zz'dۚ K]jUVVR(b/D|(// δK@Z[[م0dֲ $bPQQb=0$n|{R89rBrq_5r31FV8\Is BL9\,)V7AFhd -,!ͥ-ۺ4UQM]i45ai4j3y1 W8y9֛ i>@q^H ܽKD[K o57rs3%>[]$W޵Xc]dJ88EPjާD2)W$wRU]i&1_xC)Ex&v6N3YgaǖXW$)>qyFF[ +wa_B3>Hܻ5&/9IZW+<߻BFɪ" ϺAB P+<\^L^|GM<<<<<<{!47@@|ANa{_Ppf 6qR1I{=L?\r>{Wn#z68oKTek@M u`*A^g]_+dg|@dlZc%pQݸ{uPc,%7w҃mp鵧h׈}Ѧy|jYF4=cFK}Rs3rͶ}pb> ZXwC;oxi}ZVt(5s ^=EL&r"1̈CIHH;TWZ-|sox%n8MXrB|bo'y X/s*јq5[xFug<3q +6&h٠/]PX{`d]bu:7Cu-F-&k[#՜w}߰kJNyh +x1hb4?˸v.;"ј3!X4hkWQ}%. qN'nVgXڽ/36Od(Un\M֊c ihhӧO8;0{~;9{x귶L= 79DdE+5, И5|}VVyeYui p#/uY863aO^.$Skl7' (saoC<`g!-8; +{i:OZ-p_3zq`Vjcy87 zI~Y\4ZG}K;_11W脱G gP2 | E;OA'uvv}I轅a ݎxF~-/~~-?Kq?&TR9PW'!UE[NT+,,ϝ=###d=\YIII{omc?{M-g| ?ӄ?):Θ!̩虜t%B+'`(+}wE#4%&AvR~/ه}Pg!گ OpJG۠|cY yITUY +Y?7fo_@NĚye%-baB7+BW;O!-BIM\цrRSS1Rn|44n'YVbSCCpu:f1__Sv&cj4#1Imx_VC}}h~Z["^>%2͇z6[VAfCQ~]qVe=D=My2 UɁ69qnt=BT2wiLLI975\`<1k99̗a71q.\iy8Ng +\EvsoؙovnBccc&ZJ>4_J +~'5 MVBKy<p8}6j|-ͰsNƹ~swB8ㅺ +=\M~?Ѻ0*UH MuV}ТlM\#qjj +fffBxpD[[Bc%}!Vc{D%foO&k = K,~NK?='h٫*좘.gPFVf3y;O МҼw~CNC=GʾQkq$mY cQ#kqB~~|c+JߟD--zu֟/‹zpbL)__j-B]]8;ߡ I)o~ަ +(5&~FϧatP)dCVwVbo^G0jL|aJ=]9{ 0 01Y{s,pf 4Yp~9#)=BU{Z{=tj!(bCkr\eq/_3\9R:sx[#9-䔊RO#={<&VȀcާdyҞw0қ| k/MWV}baavYp:"ts@:X<-Qyh8R=.pl$x|x:L_o*"e$rFOEq0ܐa=  beOc8Nb~jϡ?󍍍`] k#STSE1DdqXK=zy[?tttӝ[sYЫ LMMoYV0tyyyh@VFuO566&CC_OGs:u+"QSS6vkәO`a+o" +(ؗYj- y*0 0`OHNvcxɂ688H499Iwy8S_O.fXAtj%A?qC_`0FYYSjr?Nss>~?wb\,-QV(a2 0 0N#S,T*׻ovv B[[8N8u9梷áˡ "`^KWRR<y 䖒^`qq1yal||ꤥɾn[eaaf@PO{ݻ{ѵ```Ν;gv0㘇\WW9ޕa'4${!B!xccc "(:noaaIWPEfzo¬yrCh4%C[X?3iՑr8k8MNN}">'9y}& T*Jj-n3 0 0L6=p8tXznz'};hAZZݻl6 B0E1t7`\Br~'9㘇s/Zz{ maaf7·ޛuJ}(}$'^*8NW?,Jh$y9_(@@uu5a1N'ys$oxyxaaLM^wkfZUËY7\{1`zJN(™zcccabb|AGvp:LAAٯۘ(<\Qb ƪŤV0+ZW5N6"."l.V|@ A<*p>j}JLS=mN{j%Enfvveq/>!;?of"((b|MDDDD>+`(lB3_JTSDAv\TcW/F;50->J0\ub[4m[x6Y+d?*1DY(t\'"j<6>͕"a:yD p.FIk9"y2r*H]Q眈|Qo:2O#y3jQ,0'߬Qμ8eVW +'ƅ/h*!Tndj4Wlu칳bCF9OEZ Ez)kg`դ33K眈|נIRΩ:6_7K3c`6n[3٬l|L'֧!F1B݁i"GSfu*Opf:F|XǤI5L[3_GD^ qiO""""e,vg:r?9(m̑o=vQ26oE9ߙi +N;6Iu+a;P1!Tu nWY)ju}/sҼ*FQG]>VzώګO>t; +{=ѓt|DDDDDˀIR.Կ3HYeVai66bm:br]H؅LMP:y=ؾN;-Q眈|XЫRPJdkuâچL,LNZשmHDΕu3ޜ̗,͛?A_tLRf;3 +͟s""""a7Y.o<, #a`$n[z;5S:6?ʙ,Vx%fTwW:gQ&1VNweaߖv-P8bk3o ;>uN3|DDDDIºr+WBf>N1/ 9[;Ϡ72!|ԝ'b#gªE(ԏ(z7md+]ޙy腧g> ~ hۇUzqwWzZD1Qw2HgOm.J7k\T2 +|yy1.ƖeX7k,>1eF= _kr>3OsrRf*~E챺sƳe>^["zt?ة0ػLFOިZ3.ǥyO2&y[`ºY{tUϢvDJkcm?5]~iDYCBTo>f?us~^j*z4w_[tI<%}]_lϽ;ǚ33M028JCqݾcLWz^3œw}/lzYmO|.9ίm~޲ ZY+;a0ª@]ynͼ|Up/{BN]-5G7,Jߥwz_6.jEaͦɾ[\Ѯ#*?#yDvo M-ڇ͊g٣Ep$>fx!>z{$a[/w ,<+?^8_Ӎ_ПB.`wPu;6PTaIx>~Euw)NtlJB[k4ͬY,ƬfaeeWX F%0Al@ҤWcb:tl;c'4$s޻{#3[Zg9trsfAK04҈=_!8%t:sy%z=.gB!$/p5sN'j(`b=w n)֒i֥bI<9hdet6זgXa, 9#4a}Fx>} A9䌡(y>+l/B~{hHD|-_2G'ހ\L]RKN_V0E.[z QwU0Cc;NOx] Ƚ:Fy>,__3sC߁||UA;j55I䤶HgbWsк}K٠>QV#칹x|~'ze+9=}柗|oVjMQsoxJP/L#4zCX`5k,G߅s +`97l8=0zp1gB]Sχ4)^w uC3mB Pwo]3&]׷Ø:5ovQ8S ocN67_Q#c3#w^`v!B1tu/Иr ' \.D/#|1heϷ?cOž:XGּЪ-"u7MjpdxKW LFmL \agvRDj]'Kkp.@MȃE`zka5lm/6V-^)C唍Xa +EleBᤠ=E~5US{#rJVjt$oW3Wv=k{9 P 6:\$%lxP36ceǾ NAw5'vyLѥ8vqa?Sՙ&pЭ7kпra73})8bߑqL>\28|\B>mxnC9F +&YO&ZH#4G,jUW%|=lj;oޟiY {F +X~gq]zl}bCHӵ3_%l aLQx} >n?rm;] f7:@F>K͹5SD/d<C,rhNx#|Bg! ĒYG3w]c(y*́.R~&u4smnŗ _?{ Ln0*jTH(_[^}6UGx83N +fs{ ꊉSWg5.9庾=_j)5 }6( +z}?7FT ӛ>!yO' Zq.T&7xwvɬ-3z=JſTf}DpZ^,6.H# y ?7n(zX<lVOK{#s+:8M= &g1B]SkM䩐)ׄaB1o¸n =wԱq$Ʊ#}ZMC<_E~7~Z;Z|N P_P|HZCIui-A_ zC.\ZE`\_DZQn@ӕ/: 7?PД¾f <8 iB?iUpߗua*KS˿YR M#p;1'}l|Q͏ٽ6+^}3~{2R^0F^M敆q{A;"j`obk~?:7pVYnH#|نc^唝dnj9OA+L|! 2^>gB!$ N ߡ?.MZ#Xʟ⾤CÛ19y>O$ yג|[P_ў/|Y|lUiv9qg# apEľh)U3/ +N\K?ϗrJvͩ_,x905q_<7aVb'^$*Z^#gO}hrDܚvc_[ h7H#|?|1hl6Oxo|r-<ҁiU~oY13㷝)>ro횢=(Vmp5`f|/5>ml}"p nn^%?Ńo}CsŞ'"樆H=o0Obb-%/ux2g:ϧEr·"me֩)ɂsp`?X : +{%kԟkRQpk}7Yɮ9Gc;쳯79p.ml 4h|ml,6Ӽ^BBw2{!# ^Fv^HQw1lLw]3J=B z杯Pc=F!Yo5>b\GagV16@{B?h}J||x>꾚Jhɩh~yyj㐿`J6.+UVz/#Tr[uT\A?Y2n&5E̞/ bO1%χ2<_j- + xD[ң>u}HsPf$)6kR$yMGNs_,4<9M%И<4$0 \:Qb⹆ጇ01Ml/k4-+ݝ} w+'~ݷpךCO^MSgjNђ:{}S5{@ɏu+7V3_k25uc\|z7YSu.!5G\~L'c>:r 7|}ĵg\uYyFQ{jqnG3ھ욉d\|JqI^{OJ~~}?w#^D b}(nt6qWқ|̧zN +d㿱'ws+㍚4LJXa-ۮ95t\cZWB;]x2_e;׆EW72 N-W /ZDoIztL%`ߔ125Lnzg+ӗM-RN=pVt{?qϱ³%Ωֵ: /e"_W|:sS~.U簸,^tdٳօ\!;cmR.K7mR˚GSkT;k``77([e?*[sb;ɮZqPilKtsQy}ǵM&N٥m磕ihSL)Ɠ:Gʙbz[ !(K)pmz; :r[~B%swv0,3W51ϔz@R|{ƮvNwHS~0-躾Hap\Ϲ8.~+Ӭz})C9+#7\_jsλv@SRcI|;uˀ* +Yߧctbcin.紥lb^o +u9VzdלGu +i&޳B"e>wch{ +ӹ6j]DFƂNȬ ^p.:A={_} 2벂b]ߛ4(.m3/8?w?9pǮvNstLCslԢ߬ ;尿jؿ}n+ߧlT8>9dD:>9F۩)k1gp|y_*~V%f,{KKM|g8]e瑞?:~Ue\ EfMhSNkvgx'}a/kd2kNYK^]z:ϣrFNy+m;BιEoPv=RuqZaEܜ2Tƍzî_gۭ C%mw]Px!jU2n}I#;;5#'XJ9k?@b7Œ=SfD6Ϣmov8B&gI/|PcKMԜ[YL˳s.ְn%5Q]ah5"g.5Vm4٩8O{jMUNj7%YU)?oeq6_=;_ c4ޜu +}$ԔsK3>ۇcٚWR~Xkji(k^opCl¿O^zH|q.@l|"e>Ŧkeg':>d.fqTiqCc6Rs}>Ҳ_&Iz)֒A1{c~5JP3_hm d>23`ݢɻ~pC>kK+//TQ\*AY͟GA-j!AZs*좓at{N;7PG ­(ZK=t^ôxcS5Z0TF;i{m2_2h|Z2bCH#|%f>2h|VMUԀZ2O@KZl,)(O"J5 ! 7@ +ҋbSUW|o ) 3! +d>ԃ^BH=|I GM]!d>̤w~bT2@ALzgH?j + d&ŦR2@f;C@QSW| 3 X-6Uu-n,K,_׽$|Ioԕ>[PRrԕTc2@f&L,RZl˗F{E4@K㩩+-OΣQ*,14;/wmN%VDgnc8^ ,)^= ˂Oxf(Q"r깧9Q#ֳ U|񁴡\STw=T{zV5M +^\r}A#1h]vղ{Ivf3gf?j#z`92Nmg/}Y2 7:LkwwQc?nَ?^b=»k棉GDDNl>$J֕w`|.d2{}P/7^Xlwn{ؾe;ac]|tX025{_ +5Ms=# ݉#""R'6|FIѺ>?1nJZ݇8Sn /:ޏ\ޡ5lϑpo؂jFG3& +6:ȗ(YW4l㆛st{͗;r\z~}xm4猘gMl>"""ub/gԛn6| [Uu|#yl>|DDD#_Od]wi(yo`mcBf`|Qb{p74߻GDDNl>zu25>4%yyXW"'B&>Te! WpM`Cފll>"""u+4ŠX}֠d#^?TP]j7DɺR|7N5% petu7rנzNbI|{b#۹LoPy9Ml>"""u0?r;(Cx,%A7s;3u{&E[=K9]>G||,4`x=66ߩEttdDbW3Wb. .R7i^ b| ftm|.Y!'Qƻ> ~(رioFPCmwOxs# ]rMFon|HX!gԛjry|#Hsx;08&T-r}ZupEj9(kڮ;$Jx5DHMDGDDN6_pn9#vO&۾u4߂׬͗#^3}x\!gԛl>"RGDDN6_U s(DvvBą x te'pwTj.~z}[7Dɺb6:=M۳Gt>ay<|3M(i+KĂr-&er|Wy'Q|DGDDN~7_K3Ulurܸ1 Mz'" ]󅅯@mlڌyn>ޤh]I{K" +>CDDD+ VĈ]η}!CIW>'#K|^2 +!'Qehh(6:|E.ːK{NmxR{<7QoR|DGDDN?t$J(ԉG4QoR|DGDDNl>$J(ԉG4QoR|DGDDNl>$J(ԉG4QoR曊ºrυ|9gBٍ2l>"""ub/'QB-:w)+KnCkiނ[s-UA0H|K&Eym>rJېKX w)$:H-R⧕y?kl>"""ub/'Q|MDaO >c܁`H<5aԛ/N_3彵G7;V_{|=*1u'B?r,7~U={s޵iNc' I6Ћs] e6LľOsr 3GR`f6ܲANlמt 6Tkgp/ۿny z6ylZv<@,|%m.1m\0/q;Boj}5G:]Lƾ;"u.tPXсckXo_}oΒyhxWL]_#""aD(YWޚ5}쮩AWeZN/Ԙ+wގ{fZu/mܲ9~Pr*;r; `dQ@ 0PRe\D2>G+FthU(&m%캥ݘԺM&Mjvn= sν;&~Ę*Zw>M~Mp'+(|_ӱgl.1d]_g;;8 +}waH abO@$4&\T挜xɩ T.fܠ[YLAqG s#NlHͭQW]t bt(3+ߪd` )ip`ʙ51|a=W|&:IϿHm5Vmr޿]mʽJkbrrHX?OD$D+9[3r(I4:  "PmZY tÍyj%T{ f9yStҰp= 89=^39ntU1=Aomac:|eG5{rAՇI^bJ%ɧ~X8 Y\ %7O)b^]#sJmst[6ͳ$>"^ڣ:( YHo^U|WOVFx!'eOAH묲[ v:usT5yIg%/ɯC~7Dr tٙU0B/6YeηJH=Ai@fF*Ψ' =+pﺾ?*EoDۃs +[t]Ó9oelzvc˧Wcߺ߫z8v$꜏ֽȷ}x#MYn~2& +Y8WR:"&RWy5,A| +8翅uA3Qr&5A۔K׮>o̓dYʜOP'SwIO2XqɵԷM55P__ M{h5Bֽ jC:`<4{K  +:  "Pg.[[N?/ͩ \&٣$'[J{I/ݳYr ?Ou9hS*:AҰǬfۃr:,Pf@l}M)+8F,5^>ԧ͙4.ԛ_bEpp^@lڵM}tlcVPV|aǒvm,սL̏t7=AC 3#ubhoDo201:Χ 8_ U ȓz[/r|Ӑt|bN& &ËbY/|?[}&T !M[%wOs[?It|kdsI h,] Lw`&lV78]tyP(-򀼽W{GB)·  ,t>dj^CuM 4qT(pMLs5*l. H7Ѓw>2Np<}?{eGұx[̩17 +Q2vӱPEBI ۾rX XC92e +?P̫<ݪcI%s5wNEw]^6LˣU:"wM)%ETHnMSq%,;_T"Zku”hqQtNSa <at>AyC 3#u j+Ԭ=#p]_l,qCE9YP,.:YwLZ7;>xz؅m4m%sҎJ1-Jl[!d6nx`elK󙋻XD6)^ies%ɜy5™;xʼnI7d\vI{t?,W\lEm:6G>o^] S?:vW֚;wu7Sv hXWCW?m+cbLX[TzVvEʙ}_z=j:X8 Y=Ai@f.P]s>BNnwg\v6͑y7G) UR{~7@{jdwSYg@ُ8Vwg!+kH/Nxn"Ml~~c/CȜ/6zk+~G֑)c19ԡs-Zy7ڔF%w;S2gImpy.^]yTח$N|!!y50k步g sagV`MMqySa?u/6{.^dh?9G\,n|ٯT3rqPw<ϪL=Ai@fFj2pl" s&>[6/?l`4Yyy8]\kAbgK࿖3˦Şv~5V =[kbk,W(%IAy>? 3 k 92mA*a -%=7ilg#tAAO"H]}8e  q0 5!\~3MACA`=} 6\Bfb8y.qy1/yq삋]3Bc@]ZHPD*S%VIF6wA+jb0No1ko$t4qUlӆ7==sva/ <,>Þ/`b +|s` |}>h> 4lS|01 c+4@ALLh>f}>h> 4f_wK>ZHjWZĦ;6@4AA$ǨWomLL PBA$g5T+4hHQ|4ؚ/KɾYRR &{%c))ۘZY泚mP[`A0,Ҳ()})m=Y?6yگ-j>F;BV|Jcm]c5ySc>)kye^O(^NqM/1|2(`~mQ,TY6U +ZA(*GgQe=AJ6,7;>*hxnc-?'.e%8 q딪+!c#k*lC~&3})k(e1#-5y@GVEѲyޏɰKWEǨWh> +@iF; +|guyZ\|"T 8Fޣ#$Kk| ~|Ji>Cm-0((.;7#~߱rOJ;>ZhgS+55A>Tb LoqU4hK0MgU*eNּǴl>٦j_i>ogJ5i=MϢҜfjl5 W gk49H!3G/u|GB;4M|z` +z:̖CV +<3|v?v~\r!](e7VǨWzׂ{uM|ގR|s!*}M0WޔgK|$-:ǜEGm*kŸdl&ǂ6q%o>U6_eTS6sq)xwyi|VMվR|L 9kdo>GWZ֑QװG LͿO@I6_bv}5=fXR.|TY +hk4]>Ji}oXiys727|߲$|]Ǘ7VǨWjot:~.r~|5]} %-t/Q_>mkksHo<'{Y! +N &3o='kNy:3eiSr:|_.L }0Q~c瑩Bx^w[yYj g4idZ5lS4_8W=~rvuvo3>UB]p;uo[㌢*U)d +&3t-'x:-,I38_8다(,|3.tLϑo5kF;R|_Gt:Z'};8j(QRn\Ng ye^:iIܯho[V5E|_7-V\? +>>$\WWr\)N{ ڠhPX=n"c6jWjo91`δ[T\c+5ͷ3ͅn}0}6p'64ugZD[gjjM3D\3SxNFh>hj>jW?dTsmYV7e/Ž|{L5֒A&_ ʟ|؀͢~Z3'QP4"i>F;?yqrB9p`F-^KQm?!_R&J&&PM4ic6me]=?g`}x~yJsdMJm]QM _&0W_4 +ɭReR 3!,#ޝi&WS0|BnWB5Hoi_YikZk1ͧ#Y (_<7AsNPzzL+!k8)Y;;ޗTyt;mK&I +Rϳ[6GM=wrט_K]wc>EB c+ &MNu糝wg.A)@@4-|F|zh>H+ +vA r}5`+4z#^|`4 ʾB]|zv/[Wh> @ce_kbҋ-+o|zv7+ +vA^oi_.h>=ҏ}H/^|`4 ʾB]|zv/[Wh> @ ʾJsM^DuvЋ@|z/3sK|^̚oJIe{5}386gDxsŠ +A c+ ]:j\Gʖ5ehyJFA?#|k/ŵ_T{~#Ok34i>/[WfU,5ًGz.&=54CA2XWfnӓrcWb:A|*.X{u +wzl I۪j)RsݴEtwѣtsnni5iopRվwE4 +~C]_n ;G{+;Kw -}ѬE4ib$-\oʴ-RCA2xKʬ.J}RytM[w}Sr)O~t\32˥ֿk=57Bo}x@4ce_7ߩw*PAN6nTj%bCdNJ6r#M)pkƈ- ]d|h {x!u)kX.\fF-5[j̘(:ruy^fʢ;" jscmwVu(=ֹHoi_|ؿH3Nn;6YTL?#"#{ s.Ԕ.J2/wRksl5~?VS6Zbl" vvʧ}oL6ioKv3#|Q[ﯥ:]n0|zh>H+*Ќ6iYn\ZxTn/(sZάqω0k>gbN;i>&/v~fb큄yJh>=4$|^Rih05ߏ7_Ɋ7S;͗1Kx ļ߰}=Ocө軸>$w)y޶1#/dGEq04ߌEic;fJh>Ԛ'uxf'NP3V-{u+n5_;1o>c8t̺mk.,5_.Dq B-4ϧ̌}l=UyKEƾ3𫗟o+7nуٶh[{~oi_ݭ,#TWɓwB3"s0V4Ыc]\zJM=?[O 6WGBnu+xZK: ]vH^Ӕio?G]?^]wd^3ˢsdͦ|yUWLg %4^~̓Teq4*o=;w-E)?|.]ն Q1Vi)=-k+!}Ջ=q[6kbij_AQ]LDŽ!)8suȅGdԯ{UgP;Vu#vUVQ1uN5=E)V.]8}}J5-0\~ZIHWXܐvx s\6MWvoy\wf:ѓn,o]٬vSGDDD#2_]Ep:wa{oky?%"ϔהP^[zMN}r^=tċHvl9?u["Mn +k_<,zùlƿck~I6A>k>s#"""OaZ6anzW%}15ߟUc{ه(3S TOVSYG2+!Gi>+\^w~&cw?EJ󵦫J'? +,kbl޽O~{ kLzojq=WިS9Wl>"""6Qߚ=> u}n\)ycy|fΕoj̦H!""Zl>"#6|6Թb \l>""vl>"#6| +37p۱|N٬vS7p۱|N)̜+6#""o#2b;gM+6#""o#2b;ͧ0s|ȈG4j7uV=:~}ǧ9z]CyB?1|Ftt$DDpaȝS9W|؝$ Rf^k;u`wuHu-6ͷƓxZ{A֏sܗjMzYתּ6HMV# +L~6P +u\~Zjw~;ѷ`nE3&hYS{ۿ?hCK spީ6,6Թ9i=c`k )rߦvˍsK:A}m+滂Ա<ʳ(͗oETXGa&1~ž­ZW9g>%,3><7ҟC6U[;o8g +TPӀs{jD-jrU#Xl# +b* FA*tRZhMmA/;aLt޲{ ϝG;AmQT'|?y4ml-Eѓ4PҺ!`Q\5"oצO7WƩGr}hz.>@Fzi,sq6 5SZ9 NTXBfiVjιQ$= ~eK5=TΊcbv5|E|0l|JZ,QվrMgإf˦#:U8sbWu{擷Eρ4pmYnbmO::c-[נ^~gj~~-&)M ˅H?ny+5wenwwvc2))שjdWhȮ{\~v&چi>y9RYT{^j/UnH19NS~ƶ]R|CRƘ(gu9˯Mh`?xm|JqgڿC(i0FUU9˞`&{9Ʒ>HSrcz6_'׭Su3|͗!6jybLqqW|U۹KiUTV}]{;-}N fc?E δ' kny+W͗=/67J +MX}b҇mXJDRMo*kZy?wٟݧ˦C|>Y!>\FcX~FqXEm_?mJRkZ*~;ԖVIMec>Ov`>jTMm745Ica t/i@I~Š7WO軺Rp[^Jϻ*B%RmUہY<^Gt:mV +fo'vִK6(gcZ +gSIO?&͗9})n5 v/:_z*}o}A9=ӭ:/ka`@(i0W!;LyI3F9dy&?AHhSp*?4 3V/[lΟٕ\)h^x فY} U1?pz]N;} ިj_i>T5|J}5FOf_<@ 4AoT| wOf_<@ 4AoT| wOf_<@ 4AoT| wOf_ k;6'A;gU+wmŃm}}}<@ 4@;By/4x:47f,M+)H63hQRMq8 X`(( +be}p@ZkHuqѶ&ۍYlvIz{w;2;;s<G)pw{Χ3C54`T]GQ  BP/8؀ wٷW, +3E lۋ[+6b +|,|ϟsABMKT[)?:~WVVgb 1FMʗ.I< [׺*󽘹y\̵K|Ar>P3t]}uV R̗-]HXL5fFW ?đ;`k9|Qa2cO2!oo/}-#h16^x 7v~<?]At 0-|( hyWޜ NtFo7.9ges>z]\?QaA*lg:WD* q5hwy:O.b8nzdj'b㏸؈Wu3sTtm*Eme~y%e?s{nr;Y- r-:_er\w=:϶Nق~ETHg P_=9x@{ǵbAh">wA1!#5|ߙ}'$⣦4wE;̘v>q E)"'lNpf04CRZOG^;^;xSTkyGuΧog1jzW:&8nޅSNq r9ɝފmЭ$%a˹6VV F[Ӈ]xb^N|x\|x^޸,ٷvױ37݌?| Xgt|U?+| pc?r$z-Nx9r*BMfF1(YXߓ A゜ <=FǺ&?N0 0iQ~'՞p{']ys>Bssr]%Faﶕu&U!策Q-幜O 7t_}<[^Jۡoþ b|N1f+|wUҺץk)P+uxuz"Ԍ ڻT=orI JroNEp<,۫$Ar>P9d 1FMʗ|IU.8?]-9^uq5f%t ]2J&۰yZWLzF&\ ;!`g蚓&Dzf`r;m]9.dB5{&gcCt$t>3Yz)5-ۂcRE@7+9IGA|mr>u|QklVtѱ؞0ϳ:[-GQ:{#`[߷yzk?Y$? e3^/#8@ΧA`VӍf~헝yx^57wpk1,8A Ԑ8!ƨ]iq3^Qbx $\bs_+.W7^(;r,QÍ.}fSr,f3Qe;)*+e9_r++_'n? +[̠%X![59_n6{ n7'4X=|,} 9A!#q>-ʗ[w 4n犯ro$sye,ׯ1/nq9ٹɉ㼆#wtneC+FuOyXˌ*W%ƥe +i9#b ,9jq>'X'ȱѱY"   ?| 1FMʗYg5:%"we;wT)ƛl,xZei!yoތ[ +gtO-8-w~Tu)gv~I)yqKlۀ*9!kp\ƲN,,٫ ,wQuj;2Uمc߃/1ƀf}:r^K RX㵉 +7Al@GjO@˻|ߔ+*|( UWq)TTWFo];]ζ\Ͳ4Ο)pfTv5@iV:T3]|No}|5+b.7mكPtnyU'zU8|c>y" xv #5|?g1jzWυU<}rlOA?u} ( +]5ǂx9yD曎27y/%G= +,!m%~=+Z=dKt~,܋?5TvB!o?AlAGjO@˻|OqUԄ~49AAr>PCG|w8_t8@GA<oG -q>êK>&;?+[)UDQ\_`mn4H +XNZ5F0KW\ (&v`>ĕk- A u ݥ+P@k`fp>|+3:j5F0KW\Q8P|1!Wfu5038j`.v2C=FqP[__4ާ'P@k`fp>h9_xx:|KW\u=A/F2~-&$RvPK[#vFD/WSU16NNWh%yR!q hm톬P8 +zfN9U2|-f$ͩJO(v:{!k*{~Mv8fk,;R 1;u&+1;~͈)=Lzl=w`]lTz}5늼(w|;O/.zak#eLu4]{\@k4 @aw銫`v>K4o $P˛U,3Ї;|=)9A'Tq/)#2rZ9Ґ= =qk:2?Du'3~'ͫs5cL@ ''"޽ɆY3p>_ t|B +c98q>ݥ+zd*sVgƩ$;Wх?˟:?p7G0=?u@%{ߊЊ5t%^X~+[2;m'?U^F/ts⩬SjmZOI i_}zAW4Eu("}^_1iVv RkJvx-pe :%JPdadzѦ|=>˗>2o`n.R~݀0@ ''A4->[r7jnnJ.;|ė.}ɢ4\te%W8`z]@򡯶rͽBq)CHiŞk gTcm UVvzY8)[gb?bF٨Hy!C-)jX[Eյ_'J-ݞWS8/,!k͵;e?Y71k޷T~ 4ljrX<<6vxhZ8q>ݥ+9_3. +KK9^*wЗ/bfndcľ\~X葕}(z8ߐz/a/\sg}}H^Vw&dc3={pLeЛ){@cFչA~-6~ ;g7Sbz_~Gw=x:?D紒.sml<(3~"&`omaxvԔҢwD{/@O@O\s߲VrT=lĸbvN + Jw0DbW?G/ = 0X(.)Qqo/J=}@rD{.DŽ_cR&:mjy3zoZUvԕl˘Io^wvo eNv<| |_,|*6p>8va YGU%[nEzs-9q}cZ5c=7WPt7^JCRrs^Z,N 'kv/q3zo|I;j[y5۾QnmPg_ݧ}]9B^0sZ+~*}!,OXFkjQ]IWs.2b-*uĄIR(|zo/9mǿS:?V%>8?Z*ܿ#F8ߐzHn>9_;Q]e?usgiA?&Χ3f8ߴʫxoWJ+:Чq>޾_Ԏ %뀕b9`gv\xX2zS8&-9R?vSZ87v~kq8Jl^}})r>ݥ+yժ<Ǝno$kFR/.Zy]`s>]Gg}V}j\/,~6ݖ Ͽ&ϔrkƶڽqԗ3zo]5_YN#6Yՙٱs};}_狦SؼuDnjz?˚l 凔~Qe/DtPz%p}{*#1<^džÿB~*l9{ }՜S]H[U|N)}iƙ 'YYV] YPegôᡚYͷtmyzNyg.϶!#3S9eO4ޔ`pХ~W*e*Dh=%Zk6;ZK(ɽ[̙(]3oġAޣ,ti9g-J5>z9cWRۜyz$ +ss\0LQQ |ixȡQ4~w>ۧQa-$̄(ڛ}x35;v+c5v,qFNoZKD5^/!=?F|7'H}Z68+A!;my)f؜m1r7 +4!QݟystiK+fKȭ1sƠ@D8hBz o(YYV]Jz@g;rq<Za5k :HݙzX|DZ6"Q0)kk>Qo *()Ayiv'o+Oy m[0N9i3:wqxAl uxe A) MBGG? WhgD=8{BH$hXz?l>"-o/8v16V#)TRQ-u۹ +9O걭cԈ*ʫ?F<{lj?s7q}3o?&g|||U׼_G67?uW/Nh {rhK҅?}?PZ1!^mL5%8'"鮛kk4)9,BGOg^z@ޯFH˛ }b_I>'17jkms7&-4TxT|=##v>y3٥Ǖo|Ó:l~#yH9ѶG@4w|lnk>٪k^z@ޯFH˛+~ vN4{ttzv_8$ݸ~۹go/A>z Y5sكǏWc "":#0LF|h[Ell:bS)l/̔u\И 29ۨ,fyy=""2?l>"k>:k>y%gl"_#ObWoR̠^Hl|HG4Dϼb^l>""ul>"-6y|U׼b^l>""ul>"-6y|={ױ|IYV]{ױ|II+6_#""_#b'g1[u+6_#""_#b''3|򆽅|O'ٺ<֞jlFmt54_) +C_臅GYu47,fygKA *ص=r\l q7V6OAU=ܘaODD?,l>"355xI5 0 ʱV}fz|wt4_Sawn YwTf"̘ .JR|DDԳ|DZF٪k^k‹Ee*%Ďi븇P= @${l>"-yY3*M$v/T +6.ל*>콹rNw44E~6BiF ZVWXwlL* +k^.ތp Z-o3ʼn(^/?ǭ>i|%q}Z܍cEl{"^hʶxO߆҄͸$@1a_zeUXn>'6Get?敧'K8Ñ%h]Gͧ|𑴭,]q{o>F9UKgw]XV]=v.SfؤZPj)5k~Q!s7o=]4?3O.h[>ՐrJ/=z16"8 I,$ǃOѐ69@ + TOĊJ};s Zz>]ҦxICj#x3,̲7}O놀G;| +Sk\ec+T#x7ߍeX8¯#2t=Ǿ!?o{t*1cRCzvmJhascrU[=&jk]gE[Fı76+!9X;,͗管ݟwrH~'h>Dh>Ӌ^gP5D3ps %P8b㸶7?4S,/u}3J+TJVac|{88RFέ-Vν+\5{6DMtA;Ӻ!`Q|mrkl/%ϭhPjduiזsOseU&|mds<'mpֱޞgǸݣ РxZL/zAվR|o,jcc]y,ngsiʼ+lރƗ.gt黲U]vs|rE;m3]H̛E v5c]sef|h> ӏ};/BUKE~ڢn-WilbnFu#USw yIfͽF l3s%|v(\x5i˘2wx}if{%_ +ٌtCyzE.z7{ߣs|ߤžnR${C3Wޚϩ,}%_[LY۰0R(5~ 6Srt*EeϩQ)l2)O-мe`bͧT+4_BC|:~! 0VMg[&|5 +||6`1D-yiVP$ +(&Bv%o|zAվB.4;4o"n㜙uz7;~ZDŽ;oQBqb':MG;__-+34o`$j/pߡxi֗RLrJes殨c&u|R݇\j.9ڮ"$d51aǦwP0|zAվB.4;4oWj8o1/6-)%`c\VӾq2;(xj>} \h>wh>x|u "seO^lƇlT]oVjsէiNNtJNռ T7tm*K̛Y3O{^:^=bµH[a8S-b5ΐMRo]RvL*$/;:C +&Of_MuU[>_qJsg? ~vAMU鞣::0{GuOi 7{Ϛ;G۴:"IROXBv[CGk?[yOͧT+oͷ-ыƯC̯Oi󩹟|FHΠj_yj>k[7}393. RV 0j(|~^=|fZC56+>_qӵVUrkm8U0sLʺ?HVs4:i&!B1LIbIhJ#$i!~~6d6Vl")RUINc*Jݝwƾ珗?y|~|~o- ޴h;|b-WjPZÆ&~8U:Qht9'u}4| Z˓~)3U 4a+eoK/Ԕ*7*ՎDh> @)IO~22~H3Whl;eӽGe_|\4},_tvIژ"6#004^-V٬vM*Vq\}| ,͡8BQ9<ҼҼjYk) __UK|, 70&z Ӂe;Cc5[bBxT\owV[\KKKk`ݰMZkBanGM=B|Oq+{IUb\\P[-4^K#?ۋjlbRZ-s7ү{hF}CTus>gNI=9{44*?'8Gm7d)}nrPՌRڜ]IBE6_{rjic+.J'|`Dh>%4|6]Ӿ|X_3<4AdW;΋&:۪{ +7{:goG,m4݊^v򝫶7h0=Fk>Q٠h|Jh>8Z;|+y$!!m;>u/.(R̫Vvo7A Ƒ7[HSam|69㮎zRs 5{ߑ+m9~j\ΏF O{JRj*bD@C( YZ}wEwPCm'or -dy %:b)gtt.}\pJi@+^KjJ2˯ʔx\yh^R&Q/-]Qo"oug?<^|Jh>8ZZyr޶i̥lAɸVY1iMN+J-KBuTwMYE6߿zuL3BsT)gI9B\P7:azxfaoB+sI5ͨ=Lg]M \ǭH[8+>^~N=ovPo%:>7_*}*=%T0_m/(5 ćPBAmy uJ +?zSֆkf4ƇNz ǩu7p;jeu){qDZd|1MU]wmg/lSwk K0ⵇp7Vtߎ'|Jh>8ZZ#)V@@C(`[Ǜ4 ƣe_N&I}X?ܿC.SgW~U9BX>uƚ61=;<hŜtɺOO-RljslϺ{xdw;>攝Z'I}L·?ϙQ&wbgާ/h~:/]yoyk?PBA<Ѳ&} 7Z?ɦ;ۗQC{w;P{iΎS}s2xp=ty=C/?q{>9=7׽S~Euq,B<Qy]\X1*F"V]|/*aX5Ah4Q3VifL;3mg2?i2Is}]6{ôY`nb ]3ıb^|dsZ{X`uXScc>o=SzA3p? qIeƑئLL2ϔ?WdsK|y& ܎>[\iA|fD1JNed|!(] 7)l:YFz|*oWY0Z̷߳gT2ϔ?̇DRW\0& V7:_6JIsT¥tHOv7`IV:םz~lLslk\;νn|)r2_NEΝ3^8#sK̇3Po̬؇sƿ|T +3~ ŀub ե(RgJ2EsWw[:7Avf1\պr/VI6<:nwZYz y3G \) t9sٓZΩ~ /7 Lq{*m}tyB7VynO# eYђyB́AZ;ae[{~f=oے[!+m1w.8ch4(Z\yw~:pOBFb%,]nU̙h[-<#SIj8?m#U~_'rvtuw%WOr L +L3ٜDu}D{|:BO^Yna?wWNϧo'LvFvdቌԽ!ykB} [(;6 #iўWk( {f&=Cs_?j4[*+0_o:Y?($!wj+#P)ŰʐvKIrb>͝uF-e6rطˉ%yyى9IlI1W odt6hooMəG<^Ktf-ZQeYE^y˾ø'8ܠq?z XXG,%Nvy5UtGt.Oq\AxW`>;~̷cG(rk2)S×|a>$cٴLqBXH4מPm`BOtVg?+M`-xrhF\Ϳ#ٱdD|!qs*{ @dju&T>E3ș/ۦR Iycz$x`NqI!kZJm1?dVc?;|ϞOZ:IA.q.xg29<_Rͼ:|;Q#^w191_Z@R>jR9MB&x o˳FT8/8 F=Đm `}W35 z \)]v%e= lήHq|зQ`яw7%SL +\&lNcˏq~s9 !AGOZM<T~16v^F}a]6j9jtOs/EEzd&Z(ȱũiOȘjG)œ(gN!c f‚J=vIk/*9DgyC8v3rxرmowq9CTxVu߯D1TWYv FP0I0 +qQ.[+ Op`;Տ$d7|͢Ga?,tF ɽւ7Eׂf|~y3jW@vlÉ.g<'u|O6?8ڹ+'QpkD&2%p/e*X*Ĉlŵ%5jU^ DcU q.HHJ Λ%3^beg|b_͞o| մDm>0o2f> Z?W)Cެ~o|.Cy_d|d5G.6f=s םV̭|B^WTDz9CR {zΔΈ9GJhL|bl %'r_5\.ge5D)x}3^ȟqD[*q쪟uO=iy|O\qw.敠ǂ^CT9t=ib>y՟_=^#=nDҤո11gc{z gM3e*p +W;.f!)\>yb$+c.y \E5oX$r33/6<~R?WqMCydJ&փ5T3ș|I5_˩8i=[A'i=0_+>{37ٻf>9i+1@y*֋)$ 1 .!b {Gϕ:`p3YD[=o'}8ḩ{,q4b>Nj_|=*>Zx.QL0bA|ldP?[#ٞsꁤ.|(B;|{@4;'QmXԒGc22i82 oux' kpYҔ̇DRWz\`HBtv>3&<B>,+l1D. |4=)sT: W&}/+ʯ +: `@pl%j0YQG#HDh-uL'QۦiGi)VM_߽Ǿ8ns={Χd* yc>|?v/{BFiqJ,ߵ& NcG|A6)V\\C$b͔1*}d||z%1_P)YD[2{Ŝn}%5TΠBOf|9E.zFXO>>£a_%:'lkQnH_#?7sma}V~~}Ġu=Oًx֦_s_nI0_DDfO‚h'egr]uN| +m!Y-=g&{+|2 Zۨ 'ďaJcP8,l?~]_vdpaxcCIѹVP3_FWA4^|j[)h1@q&ڋءk_ R#y;.5o#W&%۔7v&X7PnR8@ +"#!u{]{M1nƵ 0 b̞E +/n)ӋR麎o٠*9_Tl4!ǃd.R ̀km5,q_|ᠵ4IyS.bl "c4p4:.?Xw-"-JٸfVl}?CzU`ַJ8ǖKhX +~9~~,e`[޾DzH C ;}x;[s<3UUk`|"HOէwg|z:K\,&'evɗ;~stttHei* ~Tw€qOڡp;@oTn_ +Y|v \캌\aًrצo`[m#j;98ZN龸~09? +[m@V!z 9aiV1.ͶI~-g>;{g74w[df>tꗒ TV? CSQKG%NCq=Fn}j?OD ,%Kc +؏6+m琫[ùR莓t G`2 G-b/J3)J}XԉGA27H5={psa~uWEx8e]*3t4l8bMK{/cgśoIx3Oqa^֜gb>>'ъ'Ék8iݟ." +)#kħՖ2wvU"'I^k?!?ITRK ͱrx2{Ľ2b qs-*/ϴ~ϯ6簤 >IXgQ{ N5JwKk l Nןpal6oI߭Wk$T 4k<1_FWN)^e\,zs5ou8;)zo{|߲m?煎Znʟ u8vu:gOQh@ĭA{ kڿ/\;,q %4'F̧M8xs:}Gaa?1Sf<+шΒ^(h}g8_9}ЅTTX7ڟ\t枸??T?*ƋK␅cT""_?y0rϩ +3o A쇁]"|wZՊ# hkllM|ɾse1"s[އ(::!Y= +E6.⑭aK䤣ՙ_t +v~rq,k +m+vr)6zMTˇ_q-&c>*BS棢R3}m13w(1|j;0ȩ_UV6A}8q_Ⲯ%%N泔k,u0ܶ|h +yb"(BP_G=}gѐ +Lo1 i2B&2M}/k4Bj|t/ +52Rarµ \/N.U07gD%V w/þFv6o%uN.¶ﱗT^g|jE$BP_G1 h_@BJ: : +tΗ) PBP棢RjZǩ*+wl'G6Z`yrϓ3_?T> gBf9 +anǿ7*0҂m |eh +yb"(BP_G****)e>**|1[xvvʷye0K"Ո!k/Ƈkaؗx8-&w~vyn'šrYm0|7VN|`$FVA III`L98оB.43'1| v`L98оB.43'1| v`L98оB.43'1| v`j> +;6_;Q +s+ѧ^:<%m77_21_ϟC? 5{=@8FϽA a[դs_ss }<ʡv|ǩg&(>*X`Y]oh_k^:jߤ:we{H;_nh*=S6RLyMԖQ`yY|\GrURA[}VLϞa;4ꆀcd_k*Ur#h>Y8LK:zgsDp43hlU|Oϲeu?@tqp}*O*M$a.{nW)Ӿnш &hC/]Dܴjh7ks_z[s^?H^*\´t#٢|'yGK]uQO }粷I'c;Q4,y \9:~uz +o" yR4L4ꆀcd_m>]:_\s; ͧ|k46gG>QM4R뮱b #a8UH񷙸6HuD#/Fp먫BKu'ۣ{Z} }RP|SƯx%|3R=n;4~xC*TI*]rgcZ Cgh6FNFϝX8+t0=|NDF2UT"5_ +xq~ڔX]8:$UsWӡ=iRT7=@3m! WO)[ʊWZDmq[K5ڻu@]`D|cY䱯n>MiVސr5Í%unڽ:վ n +v7k$ͽn6>jGcjN]=F+w(륟 88о2|w̼+!NRE@>jW=j[HO[9Ϭ횫Zp(_]Df|fQqm<ܓCl`Y}+#wiwxe^) j4ARr&lH/{.\u{''4~xC*\i}7wYJu)mP~ƴrn 9u}z \|Ej63+N|\[?$Q=_>nTmIo5շܐpGwfGWU4|Oh> Ⱦ +|YG.c|훛+6J>MWQj^VMozR5%FN:u[^Nm^FKQ=-謔{h:0ϫ䆭\%A\toQZ}kC9{kWu_V? eQO |)4{l>07?+;ot1ݙoSS[蝾8{UpM_Z +q59Zh2R[=1e3':A?,ɧ';iT=m u{U<1m[îA:~{Z߷PkХ;ς=N6t:_R4L4+T͘XWOSGRҖvDϣ +񻐿Ops$Hikj8?G+q;YOf}_s8cSּ*c(7=Xh>0|74D'43'1| v`L98оB.43'1| v`L98оB.43'1| v`L98оB.43'1VN"kLzrzWn`i39lU5j;EmkH U=iZ|7E +bMJJ-4+h/נ(3'3/D׺`tMEh 6 ( +Z\5.tF:4x x % 2釶;N}E] >~3{sWϚv'F(Q*n`B;>>I eXqEGuQ`qFzg_л"Ar>0]l69yͽ|w9&IpwՊ뇪b, ?qƊyr/ۍz7W@jK9ض'˜0Db7>{.6H 6m$qO3ɀҁ>;džs,vv=7$s T4>o< 8.|AD 1%s(d~<q1rH_ G ?~BjLY.Q޵rDRYg@%9_X0&p+}uyV \lC`Yßa}t&d_jd= ׮{LFa5?;>ȡwE7p!# ;|![ǻECM\ kNb&S6]\)[?wMC7gҠɵyc3]Ŀл +\BϠy Uw*q8mau<:.x{:1Q\]ƶO$o2*+]:#oBGAwBJf΃ɴۊYn($_X`ֶ9L#WvqB)kw)OLN<\)P)|ƨPJ:x*ldZp_;6YifkE.OkZ\>^ +a%tn򽮜_л"Ar>-˄],5qLʟxf ssY.{%V/*Gt)s.5[Bf?sQFaR:mɆuX[\r!9}:=뇪BoڇƧb/+'ȻkKC]%y;OC?3oƍDŽ1a +~OAZ9_ƶI} 9 +f9Њ3S{Y}2|dreOΜBbDg\^xj%1og {ŕv8|'\bq5ph +16T{lr]%հ{e}RoZ  X\/O5{.WmxRAī9AHi{8Q6XUb?^~Dq^>1Գ+ەK45}JJ5Ē9 Er6iޒq6B|CX8Ʃl{Tl=. /],?F9X;qa|#M +Q=!'8_Qu bs#Vbgt>,o/uӮ1K0 ~z_,M+:7nA|![WSaXo3ls=}+bN'w.`~,_éJm8>ȡwՕ&]RTyHrl/ttw 6vsa;ٙ7| Wr>rb(C ć)czTcp#z(\W=5&;A/m(7_(e + W/ex_漍5xڜ/pԳA푿Yg'Ȼ[ݴW+&4 @fgh{ԧt#'R+j8a +⮸}5ނ{Ւ"/5 앛}泹x 8_uQz ֘ͅoZD1>u_ tT}O'7 `e:wlg#Śֿy/9A7p>sFf7r6ww {)Ω}u| Ջ:&nÉ8U:w_;LD(K:6|q^ǰIAQr{|8u;ԅ؝_J/Rp5024v$vK(-/tك@zC>{\L?c)ԋ5g-90%iouW zh  ^ B +9cNVA:s>GUg'[Y%tE&Z.7`]m-Dm֌i_㾆K)Yηщg88ڞr!TfZ +EUGөyQ '=jQ[ 1AJQVv&QvѾh3vj:vwooo;vg{noyvJS'|ӱYپ9u2o֋%4vs]œG6.Sk9cާCʛkc`}p{|i#Mg|,4_HId(Ks:8M*\{IU湺896/InT pwK1y n4H˺|6ibrVPR =ǩDx]1q[g_iQSwO r{!;m4*dz:7<<ޤ[A8XFy>؝IqQ؂`@O9u>cR<_됆:*^{]W2RuAzM-Siur-qw+d)-Ms(5Cw-msJ{Z^ltgƼA!\z.}6[A͖a[3|YiɾmM5| BiYWw7T}W__*[w\u%9-tF@ər㬣SSK,#vnmY_}͖ uE`~(c;+oʭzK;ұw\!Wk=ǕJEc=tpU+L}3V M&,ۥb:-ZL>[ij-m-EY|]韝ו_L=6_1RgV-.w s=lK7}c֪sȝ[w?]r+uk8BUC6(Q姵MT/Zq +}B7_ {J{ߦFS2g|,4i>uľ;GO +=Mg>%i*}ojW:Or^>j5sάKi=uQLZ֕iҨВA㌟Y ڡXFiZWfi>@``>ZoB@C0Ӵ|etChYWh 2\NӺkb36@41!|+v0 +̰XFiZWf }9q̰XF7ue"G et?8ue"G 5s!O˺2~Fc} +|&$NӺ2~Fc}BiYWf }9q̰Xh>|Ni]E~`KSSUw Ew T̴(11Av7seYOK&~mzY_EbBMx+tt}ӪV$/7ˀ9]-Զ;(s\N ̐a@|DZU4yt$𹘑v,?@֑H0It@X;9yLS~e{n>Ӭwq_ֿ1^]hj1Y?M}>zZy8ꚣz4hn_E ve&Mdy|-e1yӾ<"9-1_)S}$=]=O S[E?YWW[l曽Qx4ŗi uw3kD'o`]2o(}'>ƉɴbzZ#cBS9:h#tY?QnJ"m@|DZUT79ha~}l 'Gzf5}U~ߩ\]{ֳX_oX1Nl[o ok>q]m:&+d.|Ç=tpU.]- rS2ĿC-}+ļ?s \G+Ҕ$p|>JVg\3hmeSYk^K3t~1qN?OI{X@Z SN~DMK:% kT%%4OōtF$ybO5&~Խ=(qa 0"CaʪY|@Ȃf1$_,AAP@  L[u*8mSڮqLfOg2SgL¤cl9}`{w~w~ngNN5 81ȥ[,?(~=:"&}P;kc}^K&jʃwYCp)i$NEjߑ0ܨȰՌIHbk (}Ow4Q][gQȐcTe};7QB~}"Wsb}_q;5MM7 Y.zv[c>MUi !ԕr:gw#PYY^3s? +JÖ9oN~,?G*+a}i7AYGDrZs$\y[Zl<: ~^f!m9xm<ްT֏!X=\ (~<1 + &,E^]qz"״{ =d uQ-RicLAO.0ī|R}|k=E}*Q9 IT\m$G:ŕw7RfG/_nH*?ZcC=r5x3H|4]a>}` D)WZq o1G KerUlS$.J( +bziazY KyH^9_Srˏ0n\P[nx4ߜd eto)Ku'2 +6̷$˲Z ylh`58,Y3{@RslGG|s[\y tD]`uX83̝P0Z~Sӳ VܡItQ@5*vϳz"-'ck44[sDcwa94]38eá@Y8vonT[bۮ*u3># ޾w l>1y~#tuºhOz8t#]xSA/=JTWJ\`0A4yp)=ANHI$k4Է#/T:ޠ%8b kǯwc>]\cO89 +A|wyUbLwQM&3| %po\s Λ6/] a#@65gG + Ofx?3X^BydYC^Mne})A3ܞKۅ*'#M'LL|G|~L ~`K-켾ju=j)%~VJK/KՑ{_d1N֤i*i"/~ޣ=Up:Eɪv`΂*hoj.X[X0FAܷMp~ztf ƪ3Swq  F|ʱO6M$!ԕ JZ j38w߹NA,؎rdEX,V(.oޮ7!ޛWQ^ 5 1I3邗qUk:8 Fzir-(̱Bztbԓ/e>T?A5]\Cܹu֧xVx}bu)YѮSX;;9*-zx_sOJhҧZ&x Jiͣsr8ؒiݩ랺O;TRMt]o;?o_@BRZAGcto ?~K3xHy'uiF_>lny~~><~+󝖮Z +2mlE`{ ^$#rg'Pk]&˜U +SdZpB.:g9&)sy笭^gnNe쏲SӍU\:Ж@u@d}=0@/.-Pܽnn ŅB1j} ʨ/V0%fm{NRkesv3ޒ_:D -]x:?)]ka':E +1qm,Ut joi)8_1|v&(ޕZzPWص|"muEjɷ~MMjko\vbSHgq%dŤٽ{iSr;fϡW,V6C]k_{'“WP@u߽dTʳf.Ÿ.i?~0^"xa>oQڛϷюG?6|C} WG{-y1sc@lJi=6O4x8js>+ux?‚22gUҶJ~X?]RSfԢgݚE>{ }Tifn͚|"5'=qE+bqҼ}ҳJŦTWBO0sy4`kk6'W^EC=Qcz҅x1u!h"JTcG48jurs]{hMlR콡n+9m<=yf +ƑMՏ_Y>IYx$vvJw̒ͯV E_c s>z¯Z@;PyFR0Rlc,,'Y2>%=na8Jl"Tqs(3m.%%dSo,+O쑈?s؜\y _GvDCfF'O'1Ўhp>@(9*j툆:@ |"ɕW^[K(D@@ |"@(9 +7zt|PO'|8H86'W^F/p>5p>oP+|8H_zW|'sm[_~~w,u/}in=$ i;{ڌߛ|Bv'kTGM9h_\|N5?1-^C=IMx5_&րxw¯_ҋ9<|7x4F5^ rZ1kqiu |]!J/sz'؏T6J#5ͷIܺr6if +MlnS}1H9637=s{SZ&C.in47v7~INFzTxf +ts\0h5:UQY{-M^17eP\M9KS7m){'Pa^F4_gZylC6u泮ac 7RBuc ;9^iz7h3= soSawiiԁ#|6z=ŧPno h>%W7>jΕ͗c8Z{5\ ~6cr);/uU6mI9斘)u}DIݽSgx?lBYg},x3\0h5:UJM]BS{1.JNC^Wk|y-lރ7iߊ~p0gF{Q}sR^WѻAElcꦯacVWϚRFp5`N͑. ꆀG͹r|־jw b5mg*ͽoVr^}b +ijz=:5_jԨ%mS\>Bʥ.hX*2 b+πP7}NA~φVSu5_F>Z耮vMI%&f?UGyصmURv7~oQmlhZӑtw.rY=KNvis%':5lӿFj%~Wx{X?ync5\9_J6 /:_4PN 5bGBTSKm.th&˚+ |Joܸ5@͹r|B# _$R +5T3.4SuW m[FhZ^&xhK_ 6ٴQH).-O|eo~ϝ`Mc3fw>I+FodnoӱjkZw=@(jtΕKlxRD2~d4R,eW`t+~r2;;*$J6/_; U3V&5' Sσ)8x2Y|Jh>pjΕip54i>F\.4;4i>s||Jh>ps||Jh>pjoBC(jtoBC(9Wh |ѬEkI˒I;}7I͏I !4eB(F +m5VSuk\տ܉Af#ΑUCk єu"m{>qt_[3qA $0S8rHy"{'PskSiA߭B(9|3/p>M +Z@ZRtpҐy(Ob-&ծo>Xv9o-byo> s)4\Gy"{ͧT+4؅wPLٚysYcmhze7J`Ȳdq~ _>w8ƫIZf.em4iITp^ +덟6^pwh>k)#L|J)j!u3]d˥kcb>`[wLsBu4'|sD[~&.S0ҩ|_ЎyIio7߬sR˾ ϩHuy gi5:U +7vݡF&Xk䱐l0m|?!dtz??5ץ̗]S詣|szkΠޅcΊ,֯s߰IKJup6@͹B]h>?u}q3Δ0A`#<(X53g29=j(8C45h4UIcZV8>&fe&5onSh񞸿~EQ5#Q2ߤykPTZJ|Jg$|'o.U,FlcUcڭ|YoZyێ1NkLW<-?I~C;[tq3֗KJP{^(K-QWQZlNPYkc_j1O& ]pmu/I\c Ý@".' y^(^j Vb?Z.E0'}vߣTz0/ {ϵbp#TkeMH|A6Y_jKJP{^ r'Wzd=f/Z+r 6Fo,bbb0vlFEQЊGQ|AQzt DMŘI+G o81v~vX"Oks8|6aBs}b>_5'a\f<ߕwg$.t-|B޼Wm"=3-譽G +,Ya @oĸLw׆~OQE |q?|Bߟ]\eϵ╨g%́=!É:[qU۴ȍ^a~7}?#ƛ5''ބʹ7cz}9t[_?KJP{^y2*Pm9@ϛv>;ҫPv󍚨Ndjf#!a*~̞WܻH 7EQ54"Q5_o=12*lDENp7GGBl΅%`||Y/8,c]qf<>찾`17'.I^J3Zd ~W~ +n0_=Z0+4EQЈGQ|CX ?o~|I jޫg#t +.Yaszh! sbD05HE|/jA[ +1ŚZX-y_ZNbWB|zYo V\;%ٌҀjSSr{R,~_^Ʋ3qlnՈiU mfuOjV*g[Yqy]DUto2_׼QR>6.fd>(j"Q22_4jR|a~OOțW 64ކ㺝8i'8u:Y[ppW0_*9j؃%]kd~Ӂ!ew=v岷v[ȜY $6UTx܃PImw8_r&QQ2-[ 3ߒÙE[gį{2xyx_UC (Fd>RF|1_Rګ' ZZ1}\ alwʮfsUHZḾrD-%yߦ: %9_dz:?z8>a8f(׬śoפKoT\`c<ڊPVszv=c(*ChS5in4w4eϨJzFb1rk6SEQC'2E)#QOțʓ^rv<g.U͊WSlXoeǟ +%GZ-+ El=4TFz6+=ٓCLylyA6ʞg}ِʱ>4kE~D66 |G*ꥹ7nAf Ic͒|AA uY!۷EQЈGQ|/KJP{^jwXk|r``;#lJzM:[M͒9=M m;^e_Fzɧb>anbu̹zv\wGwsރbo]j>"Nԧ @QE |Gb>!o+ow~E[1fr!;` u̥yҸ*v||;6q6Pu. m9O!Pm8!նe98+_ec.DvX6l>VH-њOh|q~(Fd>RF|1_Rګʓ쾻仜9fv7wty,2%KB^1u&;"g1\El p/+ 6W +y\-SwnBZ(/&Y1CYM6nu8{il=g @QE |Gb>!o+OI-ڂlL ɄABe:ÎUN[vg?FSn;|_Zq0M4[98Wg}e^Q0f'NaAYxZZZ~4Xq,|V6Z <0KdAo(jhD(ecc<8"/A +M8rEZʂi%:JhJٲ%ΥSb-sIh2M5m_9'}}|?tL+']ݻ_~UT>Ν.pc:kx{1UDxGTPq ԢzOy::hce5oFד,?KMPIso e\q@M{q鷶}98FX;fΕe/4qq'3*:p>`-sel* YM[G*:p>v`=̜+8>|aZ8.S +:p>v`=̜+8_0p:\/xt|az9W·kl 2uomhh(B|c<k̹B>ϣc+8FXNԹB>ϣc+8FX;fΕxevX!0p:\ΕxevX!0!0s( +y2u( +ysLMx~*X,H@-;tNеG |d M`Ӭ}^K"+8FXNԹ +|p*`ަ{mV:k$wCzUFq bWz8>*5&TP 5Ox>qh6xoqtVK^4Wkl s fvLz] +6 q(e ^?,%gM4,Lr*/9&hJ/pzds>w}z}wRusT}=O`cwJJ7YX e\fv쌕b~;+aX8a|r]7 |½vD}V%s4!0sz=nB1%'!s5}>ߛdx>3 Z>'UU*G}cqMos:q\1Ƽ?.~!U4~Yu4{+QڹtN&:j)ۑF;.9z}yU-#!HZɟΦl;RQY,\u1t~s~ q?މ[1j㌛E{nbY>YC)x?2P{uW@m>6nyI:yRmolmEҲl?(%>0`-s;ъoowGk]M^!T^:9_O|{\:CoOPz] $ƩgwHQVu13{ M6:pfI}/opG,pbnQG}sf^Y \^p]'h_$[﫿-̥I'NWcWО%H=wfGyk.8q>.SYJ7oLt]?W0]׵ŽP^rɱޯ uSo/ӝe~u>6@1η!HZ:U}az9W@V4&$jgquPҥYW+]+)-儱ʵޫs"ߘ7,^#dO_TC+*4޷Q~㷆 +;Zx633^mO*_,N]G_|OugȤ_J{NİQTG?S\a/Sk/oݽ:ސ/Ǟ+OfMPxG=l^L8rWreێ )/=cG:[ڃ>}/͒?|D cUvz#>#8?ktL+ΗVK]Z{P^^.o!Oy}OfNQߍ^rr.v-[p!]Ľ(J|A>ܭR ~$VQNN!J6j͗4Eh'?8%_5vƑWf_ OKsͼE^w՝j2~>/1/17O5JSb)/?eTugr @D{śjXפPV6z\/VQV !Ԩ4Cj8N/Tf|3N´Cݽ{w%o=Q)|8Ҿ@4}$hˠ&Cj[<)l7{7e/S?6L_cڞ? } H W ZDe39tӓr-| WyipY8?krU^@# +h޳9FyⵤܙzJ2wxג\o>{Q`]G&sZlۭll÷庄w$?x85mѶizHxo;h9y=`hˢ^yOSqDo[u?JAY8Caf]ָR-IrU<ץz2}vONSWRzwPs|{B6hd4WP۞J߬j,k&r@f anl1=4Zi;Wn;)kMT=Nx +[>7J*oS'=_9ꂽ765]mkKsɖ2^R{ mçYjc2_Ë_`;pVIc-CBv+`1%X.'oj]i>%ղ*b* Iw{L*.iy:*ֿCB z<*~u󬤗}^bbI8{=[] WQiq1=Yv;JO[(Kq$1Z[gj7ϣ{RG4iTG:7yg9GyEe3ǵ=zbk5=V4U9y;S;L0믷QCCFss3-x,3dklb u:$]g\ٟlh/_ΧԒ:7̑ze5i_IOes\$.DҺW pgۊ½qJ}DY 1ƑB Z_f)1oZ{_Xy}J^WH4Gu˖]Zwns~>;ɮd/b'4w |qcq4'`0>Sxi8ރK <3C3aV=X<ѣ_|g ++3ک~dq| pv8]3!dklb ɛZW}ΞJC$5LdrS.+? NC8Iy|f!~[8R:ZӯՌ0Ki;Y7ܚN!PSz8|?U|G/46e;CRs! 4Tz-YCy6De3^idv=,-Ⱥ `zYW"#tW&ޑ<`$ڲ碫 +oRqj`_FbKOWyldr<#X 7@y4Խ\*E\ &At[[, +}I=7;_BG# + +hT@B`Caf]Y!("#N:vyo6Vp>`-\NԺB>Q1`#X3 +DGYVp>`-\NԺB>Q1`#X3 +DGYVp>`-\NԺZV%X;f֕t.RH6!!Y|aZu_|b8FX;f/~u|aZu_|b8FX;f/~u|aZu_|b8FX;f/~u|aZuη(gt"wmJ҇ǩ-yܱ@k̺Es@ ϶]rSfўIGc`||yyyɛZW+[Ԋ{6*mW[imFDwۄջOrGu5{5Js2w3Η "Ρ4oD8FX;fU8端TUW,툊͹w,P!bmY 8kMPWWµKtzģz_.=S}omt^wлtmMeX:j&k˨PC[ki}^HIhs|mc5m{t=)}tD{Ήg|cR-Ԙ>OxZ6Cj޴D&7Aup>uu'K˟*_#{_|}#/]zNԾB헕gsp>~z׵jͷڻz~6uq+tRDUrQj$MU y̔8dqVA MRH CX_0^!Q Πa2&Bh[jH+g<~1'i1?99qq!q&]}7XPoMH[wAn=)Mx-ǚo54>{'}a=b|Ε|#h>H"4~sq؝T'v&-'h:F.FuW0DzJP?3o :J]j"5_rYMlο=~n:_O8_V_jsSUsV u qQen2w9 ~INf, +I/cO-b|Lh> \%j>nops %5Q8bķ7RDu>@.of|KhcyGS7zuʛwHksFj+XRV?SFstH=]Sޓ4wD]ԙQ*8C/ch>0gt?8N]jWzOj8/EV!\ķ>k*]m/robhUKޤI7k'j 'q-%' ;gtC9Wzopq;|X,h|#jؼ[o6kp&F{.Q}ye;uz7_M~͚&&s%XA*J-+ښ3i>Ϝv:x swN|Z;gt?8N]*Q}7w޼CrS_W~ȵr7څej:9v +Cǒ[4jc^%s}ֿOVr?650bCo95]esfwi<=/_lx|xF7sy]rE3@RBGFvZl5m-n# ~ԱWkgh^:-CIwUJF󭳔QTj_5l2 ގofg+ .rh>;uD'ݾkZJ/CK§556k-#U؃k(u(xO<=+775M~67FYlkO |aj]'~#&Sݟ_pб[齱;{j[%tҽ'xoSxh>H4s5k-B*x1寮>{)Sm8^͝xG3O~e?l9 ZU*SW\+~^*qUT|@0ݩ\i>0'4:4s| 3\vsK_h>Huh> \Rgt?8N] +͗||<GϹB/4:4~sq؝/} աxF7s%0caw:WsHC9sRgtC9WhT`.S׹B/4:4s| 3\vsK_h>Huh> \Rgt?8N] +͗||<GϹJv/jKt<8)gi7`.S׹Jv$ ,\<~*-=TfD==*3?<>|<GϹJ|j耻~msZz>Hj鹟|]$D{ȯYK:WnetΏA0ݩ\%jZefC5_ɴ[ʮ|ۣl',?_*:UAn0=j:@a{wrѶ4~/ܤfP!5hv]C˩>"QmWӴoJ[RdTʸ 9pnòrn/#;2n= 6.5.JHֹzhbZu˛PknL\t~<{.뻨>g' s +C2Oy6?9hM|?>kz9?3\vs5ڤ%zߒ?K[2ԆqE跾4I+lES]QRY(ʮ˵" /Aͧ[pP뮱R"IuX.5b}y]3]Py[S=Hu7i0pzkB +=tQik>|k!;[-u:WғssX |<GϹ$~Eژ'U F0Ưܬ&mfm^)TJb+uOBb^?uTqE @]HF04bXb #݄.`֕.ۜN DO!g(6c0C$&/Lo$MhRSo^|sΠ__p5{Y1:oe7cJ3⚯\o?}uMύ!AŻ /=Cokein47v. i/7rc +h>x|jbj:W/Kʮ +7"L멄q +YU󪤎nb +rӶo+{(}`U sœCrVc볏c76npۆ焹$mJ/͙&]tE?S4wYO{m۩yvƺ_$g=!4r|^Ia'l.[0Up>{pyk-uT5+ +YSS{i>~}Z *sÛD=hͧ܃j|{6Zܑ5ipp~Py;trR'3ƺ@_,fsE7bLhb34rsT6IV;q+ kxMC)Os)(5-ouKLImTV#'K cUQ!^;L^u)hdaY֌|S-'@S +w|*>tVZ`b=@uCh9W/w}n۠]l[rAq^/wZS)u +ip}U 5*:q:O"Wl(>q{6ߺyU50^ +yԊ+h<7^^ux|^-7)se4~}Use vOjY+)\6*zwV;mQ">Cuϊfn߂tľ{oKs+&U^ɲk{mHcir=BVcK6Nk,`{(J"{:vQ9'ڊ[kFc5sHgԙ=  +w"@n-*^}GOB5RS[q^jH/&kpmW)ڰ0܀8>xU.e#JrTVBTyc6Y1wHͻDGsԕ;{Yj9 Ct>5ߤi (24<8h>5b1[5x2cZNe)aNż?FԕTZsh#7c*|fcĺ^Iu446,S%={;[˽麈xpV +ܘ?q5h>5 \iiD$urw7t2ߏ ѡXltt| /3ߋ^ ѡX7菖sH>h>5 \@u?XVM +͗||jG˹B%/4$:4~}o-+c$ vb2?s8}qX͞߉Iz+-Z*Me4)%2{vss% +?SHS}xZ)`3αqS4e{h鳟4͘2d?qtlh>MWB2weH8Z`] +endstream +endobj +331 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(139)Tj +ET +q +447 585 -372 -276.772 re +W n +q +372.8349915 0 0 277.6074066 74.582489 307.8100433 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 289.2 Tm +(F)Tj +0.482 0 Td +(igure 5: F)Tj +4.039 0 Td +(itnesse )Tj +3.131 0 Td +(W)Tj +0.982 0 Td +(iki )Tj +1.26 0 Td +(T)Tj +0.456 0 Td +(able)Tj +-10.35 -2.24 Td +(Usually)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.955 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.538 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.372 0 Td +(start )Tj +2.204 0 Td +(with )Tj +2.316 0 Td +(the )Tj +1.76 0 Td +(creation )Tj +3.927 0 Td +(of )Tj +1.26 0 Td +(a )Tj +0.926 0 Td +(page )Tj +2.482 0 Td +(just )Tj +1.927 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.926 0 Td +(adding )Tj +3.372 0 Td +(the )Tj +1.76 0 Td +(name )Tj +2.815 0 Td +(of )Tj +1.26 0 Td +(the )Tj +1.76 0 Td +(page )Tj +-40.144 -1.44 Td +(directly )Tj +3.556 0 Td +(in )Tj +1.167 0 Td +(the )Tj +1.667 0 Td +(URL, )Tj +2.5 0 Td +(for )Tj +1.5 0 Td +(example, )Tj +4.278 0 Td +(http://localhost:8080/MyNewT)Tj +13.074 0 Td +(est)Tj +(. )Tj +1.778 0 Td +(F)Tj +0.482 0 Td +(itnesse )Tj +3.223 0 Td +(opens )Tj +2.89 0 Td +(an )Tj +1.389 0 Td +(editor)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.084 0 Td +(and )Tj +-40.588 -1.44 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.588 0 Td +(can )Tj +2.032 0 Td +(start )Tj +2.254 0 Td +(inputting )Tj +4.312 0 Td +(the )Tj +1.81 0 Td +(test )Tj +1.921 0 Td +(data )Tj +2.31 0 Td +(and )Tj +2.088 0 Td +(v)Tj +/C2_0 1 Tf +0.488 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +(cation. )Tj +5.089 0 Td +(Before )Tj +3.254 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.588 0 Td +(start )Tj +2.254 0 Td +(the )Tj +1.81 0 Td +(table )Tj +2.588 0 Td +(creation, )Tj +4.255 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +-41.088 -1.44 Td +(should )Tj +3.405 0 Td +(c)Tj +0.482 0 Td +(hoose )Tj +3.071 0 Td +(a )Tj +1.014 0 Td +(suitable )Tj +/C2_0 1 Tf +3.849 0 Td +<005D>Tj +/TT0 1 Tf +(xture )Tj +3.237 0 Td +(for )Tj +1.681 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.959 0 Td +(test )Tj +1.959 0 Td +(case. )Tj +2.681 0 Td +(I\222m )Tj +1.903 0 Td +(using )Tj +2.793 0 Td +(a )Tj +1.014 0 Td +(DoF)Tj +1.816 0 Td +(ixture )Tj +2.959 0 Td +(\()Tj +/C2_0 1 Tf +<0040004C004C00480017000C000C005D>Tj +/TT0 1 Tf +(tnesse.org/)Tj +-34.307 -1.44 Td +(F)Tj +0.482 0 Td +(itNesse.UserGuide.F)Tj +8.818 0 Td +(ixtureGallery)Tj +5.52 0 Td +(.F)Tj +0.76 0 Td +(itLibr)Tj +2.211 0 Td +(aryF)Tj +1.815 0 Td +(ixtures.DoF)Tj +4.928 0 Td +(ixture)Tj +(\) )Tj +3.297 0 Td +(to )Tj +1.408 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oke )Tj +2.13 0 Td +(the )Tj +1.908 0 Td +(external )Tj +/TT2 1 Tf +4.019 0 Td +(x-ray-)Tj +-38.599 -1.44 Td +(services)Tj +/TT0 1 Tf +( )Tj +5.479 0 Td +(API. )Tj +2.457 0 Td +(A )Tj +/TT2 1 Tf +1.382 0 Td +(DoFixture)Tj +/TT0 1 Tf +( )Tj +6.116 0 Td +(enables )Tj +3.994 0 Td +(a )Tj +1.215 0 Td +(story-like )Tj +4.66 0 Td +(test )Tj +/C2_0 1 Tf +2.16 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +6.162 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.215 0 Td +(relying )Tj +3.66 0 Td +(on )Tj +1.827 0 Td +(the)Tj +-40.866 -1.44 Td +(Con)Tj +1.767 0 Td +(v)Tj +0.488 0 Td +(ention o)Tj +3.546 0 Td +(v)Tj +/C2_0 1 Tf +0.488 0 Td +<003D004A0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +4.823 0 Td +(ation principle.)Tj +-9.312 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT2 1 Tf +1.419 0 Td +(DoFixture)Tj +/TT0 1 Tf +5.764 0 Td +(class )Tj +2.419 0 Td +(\(the )Tj +1.975 0 Td +(glue )Tj +2.197 0 Td +(between )Tj +4.031 0 Td +(the )Tj +1.697 0 Td +(wiki )Tj +2.197 0 Td +(page )Tj +2.419 0 Td +(and )Tj +1.975 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.808 0 Td +(code\) )Tj +2.753 0 Td +(must )Tj +2.419 0 Td +(be )Tj +1.419 0 Td +(declared )Tj +4.086 0 Td +(in )Tj +-41.366 -1.44 Td +(the )Tj +1.637 0 Td +(table )Tj +/C2_0 1 Tf +2.415 0 Td +<005D>Tj +/TT0 1 Tf +(rst. )Tj +2.045 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.415 0 Td +(can )Tj +1.859 0 Td +(consider )Tj +3.971 0 Td +(the )Tj +1.637 0 Td +(ro)Tj +0.877 0 Td +(ws )Tj +1.47 0 Td +(in )Tj +1.137 0 Td +(a )Tj +0.803 0 Td +(wiki )Tj +2.137 0 Td +(table )Tj +2.415 0 Td +(\(see )Tj +1.97 0 Td +(Listing )Tj +3.082 0 Td +(81\) )Tj +1.693 0 Td +(as )Tj +1.192 0 Td +(method )Tj +3.582 0 Td +(executions. )Tj +5.157 0 Td +(All )Tj +-40.977 -1.44 Td +(methods )Tj +4.049 0 Td +(with )Tj +2.271 0 Td +(the )Tj +/TT2 1 Tf +1.715 0 Td +(boolean)Tj +/TT0 1 Tf +( )Tj +4.581 0 Td +(return )Tj +2.937 0 Td +(type )Tj +2.215 0 Td +(are )Tj +1.714 0 Td +(used )Tj +2.382 0 Td +(to )Tj +1.215 0 Td +(compare )Tj +4.159 0 Td +(the )Tj +1.715 0 Td +(results; )Tj +3.382 0 Td +(other )Tj +2.604 0 Td +(methods )Tj +4.049 0 Td +(are )Tj +1.714 0 Td +(just )Tj +-40.699 -1.44 Td +(executed.)Tj +/TT2 1 Tf +1.8 -2.12 Td +(|Import| )Tj +ET + +endstream +endobj +332 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 333 0 R>>endobj +333 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(140)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 630.8 Tm +(|com.abien.xray.xrayfitnesse|)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 609.6 Tm +(!|HitsFixture|)Tj +0 -2.12 TD +(|initialize counter|)Tj +T* +(|total hits are |0|)Tj +T* +(|today hits are |0|)Tj +T* +(|send|/invalid!-|-!localhost|URL|)Tj +T* +(|total hits are|1|)Tj +T* +(|today hits are|1|)Tj +T* +(|send|/roller/abien/entry/java_ee_6_jboss_6!-|-!localhost|URL|)Tj +T* +(|total hits are|2|)Tj +T* +(|today hits are|2|)Tj +T* +(|send|/entry/java_ee_6_jboss_6!-|-!localhost|URL|)Tj +T* +(|total hits are|3|)Tj +T* +(|today hits are|3|)Tj +T* +(|send|/entry/newpost!-|-!localhost|URL|)Tj +T* +(|total hits are|4|)Tj +0 -2.12 TD +(|today hits are|4|)Tj +0 -2.12 TD +(!path [PATH_TO_FIXTURE]/x-ray-fitnesse-1.0-SNAPSHOT-jar-with-)Tj +-1.8 -1.32 Td +(dependencies.jar)Tj +/C2_0 1 Tf +1.8 -2.24 Td +<00280041004B004C00410046003F00010015000E001700010020003D005D>Tj +/TT0 1 Tf +(ntion of DoF)Tj +11.989 0 Td +(ixture )Tj +2.649 0 Td +(T)Tj +0.456 0 Td +(est)Tj +-15.094 -2.24 Td +(In )Tj +1.213 0 Td +(the )Tj +/C2_0 1 Tf +1.713 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.935 0 Td +(three )Tj +2.546 0 Td +(lines )Tj +2.38 0 Td +(of )Tj +1.213 0 Td +(the )Tj +1.713 0 Td +(wiki )Tj +2.213 0 Td +(table )Tj +2.491 0 Td +(\(Listing )Tj +3.436 0 Td +(81\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +2.019 0 Td +(HitsFixture)Tj +/TT0 1 Tf +( )Tj +6.98 0 Td +(is )Tj +1.046 0 Td +(declared)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.352 0 Td +(and )Tj +1.991 0 Td +(the )Tj +1.713 0 Td +(last )Tj +-40.755 -1.44 Td +(line )Tj +2.034 0 Td +(points )Tj +3.035 0 Td +(to )Tj +1.256 0 Td +(the )Tj +1.756 0 Td +(actual )Tj +3.034 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.7 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +1.756 0 Td +(with )Tj +2.312 0 Td +(the )Tj +1.756 0 Td +(implementation. )Tj +7.406 0 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.478 0 Td +(!path)Tj +/TT0 1 Tf +( )Tj +3.422 0 Td +(directi)Tj +2.705 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.922 0 Td +(is )Tj +1.089 0 Td +(effecti)Tj +2.594 0 Td +(v)Tj +0.488 0 Td +(ely )Tj +1.7 0 Td +(a )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(CLASSPATH)Tj +/TT0 1 Tf +( )Tj +5.924 0 Td +(extension )Tj +4.636 0 Td +(of )Tj +1.357 0 Td +(the )Tj +1.82 0 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.579 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.727 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.579 0 Td +(path )Tj +2.413 0 Td +(has )Tj +1.968 0 Td +(to )Tj +1.357 0 Td +(include )Tj +3.747 0 Td +(the )Tj +/C2_0 1 Tf +1.857 0 Td +<005D>Tj +/TT0 1 Tf +(xture )Tj +3.246 0 Td +(class )Tj +2.579 0 Td +(with )Tj +2.413 0 Td +(all )Tj +-41.144 -1.44 Td +(required dependencies.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.501 0 Td +(|initialize )Tj +7.369 0 Td +(counter|)Tj +/TT0 1 Tf +( )Tj +5.246 0 Td +(ro)Tj +0.877 0 Td +(w )Tj +1.223 0 Td +(performs )Tj +4.224 0 Td +(a )Tj +0.945 0 Td +(single )Tj +/C2_0 1 Tf +2.947 0 Td +<005D>Tj +/TT0 1 Tf +(xture )Tj +3.169 0 Td +(initialization. )Tj +6.041 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.502 0 Td +(remaining )Tj +-37.866 -1.44 Td +(ro)Tj +0.877 0 Td +(ws )Tj +1.464 0 Td +(are )Tj +1.63 0 Td +(used )Tj +2.298 0 Td +(for )Tj +1.464 0 Td +(the )Tj +1.631 0 Td +(actual )Tj +2.909 0 Td +(test. )Tj +1.946 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.353 0 Td +(ro)Tj +0.877 0 Td +(w )Tj +/TT1 1 Tf +1.075 0 Td +(|send|/invalid!-|-!localhost|URL| )Tj +/TT0 1 Tf +20.422 0 Td +(sends )Tj +2.687 0 Td +(an )Tj +-41.144 -1.44 Td +(HTTP request to x-r)Tj +8.38 0 Td +(a)Tj +0.47 0 Td +(y and the follo)Tj +6.214 0 Td +(wing tw)Tj +3.434 0 Td +(o ro)Tj +1.711 0 Td +(ws are used to v)Tj +6.935 0 Td +(erify the result:)Tj +/TT1 1 Tf +-25.344 -2.12 Td +(|total hits are|1|)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 75 75.5999 Tm +(|today hits are|1|)Tj +ET +Q + +endstream +endobj +334 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 336 0 R>>endobj +335 0 obj<>endobj +336 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(141)Tj +0 Tc 0 Tw -18.332 57.06 Td +(T)Tj +0.511 0 Td +(he )Tj +1.721 0 Td +(class )Tj +/TT1 1 Tf +2.721 0 Td +(HitsFixture)Tj +/TT0 1 Tf +( )Tj +7.266 0 Td +(in )Tj +1.499 0 Td +(Listing )Tj +3.444 0 Td +(82 )Tj +1.777 0 Td +(extends )Tj +/TT1 1 Tf +3.944 0 Td +(fitlibrary.DoFixture)Tj +/TT0 1 Tf +(. )Tj +12.908 0 Td +(All )Tj +1.888 0 Td +(public )Tj +-39.476 -1.44 Td +(methods )Tj +4.056 0 Td +(are )Tj +1.721 0 Td +(directly )Tj +3.611 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.5 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.888 0 Td +(the )Tj +1.722 0 Td +(F)Tj +0.482 0 Td +(itnesse )Tj +3.278 0 Td +(runtime. )Tj +3.926 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.277 0 Td +(is, )Tj +1.333 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.666 0 Td +(an )Tj +1.444 0 Td +(intended )Tj +4.168 0 Td +(mismatc)Tj +3.593 0 Td +(h )Tj +-41.644 -1.44 Td +(between )Tj +4.059 0 Td +(the )Tj +1.724 0 Td +(actual )Tj +3.003 0 Td +(method )Tj +3.67 0 Td +(names )Tj +3.169 0 Td +(and )Tj +2.003 0 Td +(the )Tj +1.724 0 Td +(wiki )Tj +2.225 0 Td +(declar)Tj +2.655 0 Td +(ation. )Tj +2.837 0 Td +(F)Tj +0.455 0 Td +(or )Tj +1.279 0 Td +(example, )Tj +4.335 0 Td +(an )Tj +1.446 0 Td +(action )Tj +3.059 0 Td +(appears )Tj +3.725 0 Td +(in )Tj +-41.366 -1.44 Td +(the )Tj +1.643 0 Td +(wiki )Tj +2.143 0 Td +(as )Tj +1.198 0 Td +(\223toda)Tj +2.304 0 Td +(y )Tj +0.809 0 Td +(hits )Tj +1.81 0 Td +(are\224 )Tj +2.086 0 Td +(and )Tj +1.921 0 Td +(the )Tj +1.643 0 Td +(actual )Tj +2.921 0 Td +(name )Tj +2.698 0 Td +(of )Tj +1.143 0 Td +(the )Tj +1.643 0 Td +(corresponding )Tj +6.478 0 Td +(method )Tj +3.588 0 Td +(is )Tj +/TT1 1 Tf +0.976 0 Td +(totalHitsAre)Tj +-34.999 -1.44 Td +(\(String )Tj +4.873 0 Td +(hits\))Tj +/TT0 1 Tf +(. )Tj +3.555 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.406 0 Td +(camel-case )Tj +5.183 0 Td +(\()Tj +(http://en.wikipedia.org/wiki/Camel_case)Tj +(\) )Tj +18.19 0 Td +(naming )Tj +3.573 0 Td +(pattern )Tj +3.351 0 Td +(can )Tj +-40.644 -1.44 Td +(be )Tj +1.414 0 Td +(tr)Tj +0.599 0 Td +(ansformed )Tj +4.859 0 Td +(to )Tj +1.192 0 Td +(w)Tj +0.766 0 Td +(ords )Tj +2.192 0 Td +(separ)Tj +2.266 0 Td +(ated )Tj +2.192 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.858 0 Td +(spaces. )Tj +3.396 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.414 0 Td +(tr)Tj +0.599 0 Td +(ansformed )Tj +4.859 0 Td +(w)Tj +0.766 0 Td +(ords )Tj +2.192 0 Td +(can )Tj +1.914 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.414 0 Td +(be )Tj +1.414 0 Td +(spread )Tj +3.192 0 Td +(across)Tj +( )Tj +-39.533 -1.44 Td +(the cells. )Tj +4.039 0 Td +(T)Tj +0.511 0 Td +(he odd cells contain the parts of the name and the ev)Tj +22.832 0 Td +(en cells contain the par)Tj +10.048 0 Td +(ameters.)Tj +/TT1 1 Tf +-35.63 -2.12 Td +(import fitlibrary.DoFixture;)Tj +0 -2.12 TD +(//...)Tj +T* +(public class HitsFixture extends DoFixture{)Tj +T* +( public static final String INTEGRATION_SERVER_URI = "http://)Tj +-1.8 -1.32 Td +(localhost:5380/x-ray/resources/";)Tj +1.8 -4.24 Td +( private RESTClient client;)Tj +T* +( private XRay ray;)Tj +T* +( )Tj +T* +( private long initialTotalHits;)Tj +0 -2.12 TD +( private long initialTodayHits;)Tj +0 -2.12 TD +( )Tj +T* +( )Tj +T* +( public HitsFixture\(\) throws MalformedURLException {)Tj +T* +( URL url = new URL\(INTEGRATION_SERVER_URI+"hits"\);)Tj +T* +( this.client = new RESTClient\(url\);)Tj +T* +( this.ray = new XRay\(INTEGRATION_SERVER_URI\);)Tj +T* +( })Tj +0 -4.24 TD +( public void initializeCounter\(\){)Tj +0 -2.12 TD +( this.initialTotalHits = Long.parseLong)Tj +-1.8 -1.32 Td +(\(this.ray.getTotalHits\(\)\);)Tj +ET + +endstream +endobj +337 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 338 0 R>>endobj +338 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(142)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 630.8 Tm +( this.initialTodayHits = Long.parseLong)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 617.6 Tm +(\(this.ray.getTodayHits\(\)\);)Tj +1.8 -2.12 Td +( })Tj +0 -2.12 TD +( )Tj +T* +( )Tj +T* +( public boolean totalHitsAre\(String hits\){)Tj +T* +( final String totalHits = computeTotalHits)Tj +-1.8 -1.32 Td +(\(this.ray.getTotalHits\(\)\);)Tj +1.8 -2.12 Td +( return hits.equals\(totalHits\);)Tj +T* +( })Tj +T* +( )Tj +T* +( public boolean todayHitsAre\(String hits\){)Tj +T* +( final String todayHits = computeTodayHits)Tj +-1.8 -1.32 Td +(\(this.ray.getTodayHits\(\)\);)Tj +1.8 -2.12 Td +( return hits.equals\(todayHits\);)Tj +T* +( })Tj +0 -2.12 TD +( )Tj +0 -2.12 TD +( public void )Tj +/TT2 1 Tf +(sendURL\(String url\))Tj +/TT1 1 Tf +({)Tj +T* +( this.client.put\(url, mockHeaders\(\)\);)Tj +T* +( })Tj +0 -4.24 TD +( Map mockHeaders\(\){)Tj +0 -2.12 TD +( Map map = new HashMap\(\);)Tj +T* +( map.put\("referer", "hugo"\);)Tj +0 -2.12 TD +( map.put\("user-agent","netscape"\);)Tj +0 -2.12 TD +( return map;)Tj +0 -2.12 TD +( })Tj +ET + +endstream +endobj +339 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 340 0 R>>endobj +340 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(143)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 630.8 Tm +( private String computeTotalHits\(String hits\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 609.6 Tm +( return String.valueOf\(\(Long.parseLong\(hits\) - )Tj +-1.8 -1.32 Td +(this.initialTotalHits\)\);)Tj +1.8 -2.12 Td +( })Tj +0 -2.12 TD +(private String computeTodayHits\(String hits\) {)Tj +T* +( return String.valueOf\(\(Long.parseLong\(hits\) - )Tj +-1.8 -1.32 Td +(this.initialTodayHits\)\);)Tj +1.8 -2.12 Td +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -2.24 TD +(Listing 82: )Tj +4.688 0 Td +(A DoF)Tj +2.761 0 Td +(ixture Implementation)Tj +-7.449 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.61 0 Td +(odd-ev)Tj +2.989 0 Td +(en )Tj +1.61 0 Td +(cell )Tj +2.11 0 Td +(naming )Tj +3.777 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.443 0 Td +(used )Tj +2.555 0 Td +(for )Tj +1.721 0 Td +(the )Tj +/TT1 1 Tf +1.888 0 Td +(public )Tj +4.476 0 Td +(void )Tj +3.276 0 Td +(sendURL\(String )Tj +9.277 0 Td +(url\))Tj +/TT0 1 Tf +( )Tj +-39.8 -1.44 Td +(method. )Tj +3.824 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.397 0 Td +(method )Tj +3.62 0 Td +(appears )Tj +3.675 0 Td +(as )Tj +/TT1 1 Tf +1.23 0 Td +(send )Tj +3.064 0 Td +([method )Tj +4.864 0 Td +(parameter] )Tj +6.664 0 Td +(URL)Tj +/TT0 1 Tf +( )Tj +2.141 0 Td +(in )Tj +1.175 0 Td +(the )Tj +1.675 0 Td +(wiki )Tj +2.175 0 Td +(and )Tj +1.953 0 Td +(is )Tj +/C2_0 1 Tf +1.008 0 Td +<005E>Tj +/TT0 1 Tf +(uently )Tj +-38.976 -1.44 Td +(readable.)Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +(class )Tj +/TT1 1 Tf +(HitsFixture)Tj +/TT0 1 Tf +( )Tj +(uses )Tj +(the )Tj +(x-r)Tj +15.427 0 Td +(a)Tj +0.47 0 Td +(y )Tj +(probe )Tj +(and )Tj +(the )Tj +(public )Tj +(REST )Tj +12.472 0 Td +(API, )Tj +(or )Tj +(the )Tj +(x-r)Tj +5.991 0 Td +(a)Tj +0.47 0 Td +(y )Tj +(client )Tj +(and )Tj +-37.141 -1.44 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.952 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.508 0 Td +(dependencies, )Tj +6.677 0 Td +(to )Tj +1.286 0 Td +(communicate )Tj +6.342 0 Td +(with )Tj +/TT1 1 Tf +2.342 0 Td +(x-ray-services)Tj +/TT0 1 Tf +(. )Tj +9.039 0 Td +(V)Tj +/C2_0 1 Tf +0.612 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +(cations, )Tj +5.454 0 Td +(as )Tj +1.341 0 Td +(well )Tj +2.286 0 Td +(as )Tj +-41.311 -1.44 Td +(HTTP )Tj +2.737 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocations)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.153 0 Td +(are )Tj +1.623 0 Td +(executed )Tj +4.181 0 Td +(on )Tj +1.403 0 Td +(the )Tj +1.625 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.459 0 Td +(serv)Tj +1.71 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.476 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.403 0 Td +(could, )Tj +3.015 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.568 0 Td +(also )Tj +2.014 0 Td +(use )Tj +1.735 0 Td +(F)Tj +0.482 0 Td +(itnesse )Tj +3.181 0 Td +(to )Tj +-41.366 -1.44 Td +(test domain classes in an isolated, moc)Tj +16.711 0 Td +(ked-out en)Tj +4.601 0 Td +(vironment.)Tj +-19.512 -2.24 Td +(I integr)Tj +2.989 0 Td +(ated F)Tj +2.594 0 Td +(itnesse in Hudson as a free-style softw)Tj +16.322 0 Td +(are project and F)Tj +7.262 0 Td +(itnesse plug-in )Tj +-30.967 -1.44 Td +(\()Tj +0.334 0 Td +(h)Tj +0.612 0 Td +(t)Tj +0.334 0 Td +(t)Tj +0.334 0 Td +(p)Tj +0.612 0 Td +(:)Tj +0.334 0 Td +(/)Tj +0.334 0 Td +(/)Tj +0.334 0 Td +(w)Tj +0.834 0 Td +(i)Tj +0.334 0 Td +(k)Tj +0.556 0 Td +(i)Tj +0.334 0 Td +(.)Tj +0.334 0 Td +(h)Tj +0.612 0 Td +(u)Tj +0.612 0 Td +(d)Tj +0.612 0 Td +(s)Tj +0.445 0 Td +(o)Tj +0.612 0 Td +(n)Tj +0.612 0 Td +(-)Tj +0.389 0 Td +(c)Tj +0.556 0 Td +(i)Tj +0.334 0 Td +(.)Tj +0.334 0 Td +(o)Tj +0.612 0 Td +(r)Tj +0.389 0 Td +(g)Tj +0.556 0 Td +(/)Tj +0.334 0 Td +(d)Tj +0.612 0 Td +(i)Tj +0.334 0 Td +(s)Tj +0.445 0 Td +(p)Tj +0.612 0 Td +(l)Tj +0.334 0 Td +(a)Tj +0.526 0 Td +(y)Tj +0.556 0 Td +(/)Tj +0.334 0 Td +(H)Tj +0.834 0 Td +(U)Tj +0.834 0 Td +(D)Tj +0.834 0 Td +(S)Tj +0.556 0 Td +(O)Tj +0.889 0 Td +(N)Tj +0.834 0 Td +(/)Tj +0.334 0 Td +(F)Tj +0.538 0 Td +(i)Tj +0.334 0 Td +(t)Tj +0.334 0 Td +(n)Tj +0.612 0 Td +(e)Tj +0.556 0 Td +(s)Tj +0.445 0 Td +(s)Tj +0.445 0 Td +(e)Tj +0.556 0 Td +(+)Tj +0.662 0 Td +(P)Tj +0.612 0 Td +(l)Tj +0.334 0 Td +(u)Tj +0.612 0 Td +(g)Tj +0.556 0 Td +(i)Tj +0.334 0 Td +(n)Tj +0.612 0 Td +(\) )Tj +1.084 0 Td +(\()Tj +0.334 0 Td +(s)Tj +0.445 0 Td +(e)Tj +0.556 0 Td +(e )Tj +1.306 0 Td +(F)Tj +0.538 0 Td +(i)Tj +0.334 0 Td +(g)Tj +0.556 0 Td +(u)Tj +0.612 0 Td +(r)Tj +0.389 0 Td +(e )Tj +1.306 0 Td +(6)Tj +0.612 0 Td +(\))Tj +0.334 0 Td +(. )Tj +1.084 0 Td +(H)Tj +0.834 0 Td +(u)Tj +0.612 0 Td +(d)Tj +0.612 0 Td +(s)Tj +0.445 0 Td +(o)Tj +0.612 0 Td +(n )Tj +-41.644 -1.44 Td +(communicates with an external F)Tj +14.264 0 Td +(itnesse serv)Tj +4.878 0 Td +(er)Tj +0.759 0 Td +(, executes the tests, and aggregates the results)Tj +/TT2 1 Tf +(.)Tj +ET + +endstream +endobj +341 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 343 0 R>>endobj +342 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 630/Filter/FlateDecode/Width 677/Length 49401/Type/XObject/BitsPerComponent 8>>stream +HֽZǠb#` !0l. 1S8E\rN;jU +t"ϲ-;;$9`aI}G6WCߗ2Fþ̝T8R5t3&mfgߞoȝ&ۃ^_jVߋPmۛ72:E$n rd9?/Ƚ\g]gyLɯ>JO2-湲xyȐWʳH93`V~uɤ8dҝ4sc"ߑ`dHo |k&fqmIp$y,Uy4׻qI댹ϤYIWW=LU9_IpɤSչ1ΤV3~U&-l2)4TGTenG*Ϥ6>eRܼO}鷓|Yj9=ffLEklKWOX5k'Ozu֥VZ~Qy. guQv9Yk.EH$Qҭ|Tߋخvנ\ofhOXmm=97oܾG͛Vo9 ߻κrگs.}_ aM~6uq WbIv!% 8%ۨ'(@8m Nfiԥ-%P6 u6Ufwα y>Qy ^\9Fh,nL{e30ɔq IM!BSnj1VK}NgUȔ!ˣP(b!͔T[7 _Eu3  ba!%Qe*{4I|{~O>.ͬ  IvEKUi]-lq6GAAsɉ<]moƪbû!  h\sO|=s14,й7ŋx~\p煍q  b8!t'ף}pݾ +WpoיO +Ю@՝wn=O^ K}G3݃R]Aװƒ/ýK^Nt/LCCΝ;}Wiz*сj"ٳ"\\d0f# ړ57( +j!v\ST_YN=J.';Yx7~5e~443s~(Fi$w׽ip=GA,xӋUuK񯛧|F>r'^H/,~飻{E;Y~=uVlذchh>ϹmƍhooGooqi҄Q dga2ElB|TVƌPGl/GU5S%Inv\}n:ˡBq/-嚟;9nn&Ǹ;A-"1drW+&4cmnyE^ٰ"!4S +9ת߁=z;|]* +6rAļkPI;%4%=Օ8W{p뗯xCoN&-Wdl޼ǎCkk+֮]&\v <ZZZpQ+y%, \_G#B(Z)*TU\ɧ>Ycķ^ yQWi3) e< ,ARTq-W>FK}NgU(` +dϱ;"jDT؀x%Zg8M%S;IGwPA٭65a + ~n906Kujb6.hkkt˖-B{644`۶mchllĚ5k/פ#os.iC*cmSRidfKڄ@R)DAhR'[Z}T[>zd'`m +S%]5&l{q +z唵9գ93^ #9w ;ipO3T]Fm5ڛ;⏹EAڅNA+<)4>:&NhǵTC +v =ڽ g88&9䀃xcI[j2p"Y,Z&fbX @Fҙu+!`EP7mRe~4u?8~ٟ=|KD<|.pRHtuu̙3-˂i0 k׮E[[֭[rKwڅӧO3osWI|d97۶EE "_M}՚_OiF+ke$#a[z/ ftѳq_|P-9~jHQyZX`˙yTS紼rp=oM8~4V:ԙΖ0VڹDiUxFq8)‰1^>KB!_9ߝ?5w}KAuܹطoڔN#=r<_b[F+th({Q٩SQW~oWiH[՚;|^M3vFM+o:M=Kгi 7I{ Mkt7'-GjvPTNyN*3ʉ"rf&B奛7mǙn"*|^蛣 ܾtx},H\nz{{q?XLdٳG#s(h!6H.abּ_.BAg`&ڋ?&ᆰOS8;ܧV"Vիсm۶aǎ*5BMXe' +M7`YavB!>;[ZZڪB^E !B!B!B!B!B!B!B!B!B!B!B!B!B!B܄}we +y-srB!'`^ğBdž6PZ{V>:¶iP w S[ña91w4]˗/ŋ `,yo6qnL–(G7^Q!e O+#rjSdտvG=Dn61GE;5r07iĉ޽{ X$mbdGyۗ׾]ѱMnܿ:ߋ=7+wgV,»JA#ަʈh^k: sakE>5l_C|3K!$mj܄=\N=_Z۱sK% ~=_y<#ϮH˕e&O]: +bO\FG$ W*bl,2)wh(Fe*_0S+&̙j1=G~NggQ#M{sk@'%,g0ڋn2>eӛ'q}Zk Q|n/adG]V-P(P,K:*?Yv'VZ, ԙxB$WtJ +Δ&lxNk t5GQQ)T*բ\sJZ8304D<[s9s? Y4tRB!~NzvmGa &FN`hLۼ+ѽqήH@4E,G6UArRy]gϨn~G٩rB.|>\2&/Ukf_>tA$gIuF kg]͍I k6,l+Bs 𯛧YL}'syh-j^oŃ*}:"QUEsҨ1ޘkYm[DQ#A2EXQ{5G֭VUTժsR6}Ist7&qS_[R>=zHI!dyA~\<ӛ54t?|7nqɸr;O{ô ok:, IpR9XibD:xv"T4 MqP}A4G]NSVI7$~6qq>RO"'r4vZI+Yk2ʼn䵙Uޔ\!4<)&T#X]T 6 u6MUô_xq68 =p'IuGE/řts<laV_s{6O rK}S73GDˤ7f`dO&uTyϾںTUQwE{Y O׻peP]lj.J:VU ϤJ8WyZH'9bNk-2eyktko:hWZaI)\ E| S+!7J2+MóossX{k!-;@*ԞrJ="U]&=61ƾ >|Pgҿ3q( \yqΣ/mÉɑ.de 0-9^40:Nk?a, cmM2pR:eϪ_BO>L'J"lضy%"ՠ]& oل;WxœI~/ta7>+1*c} {[׻}<)~Q,y}eM5x +2*ΖrVڵʈ~ڵ^þf$,9187F0JDˤ ~1KI.|pF<:9ꢷ =uD:f)F623d{SE΍kIܾLa_t"H fR"5S&Uۭs=x~w΢S:pWOZ;')/3_)/$;"颼پ*QB$IfE:Lip"_({E,CIlC,#=ʤ \bȠ}z3v>1Dztʤ:{֪k6z*0`EtNm+ʨI;$Y xM""ZEIM861g_Gu#VEa, FN)xjҵW{ l7tc""ꚥfR"Z[I 3)ѣVfRGl&]nbX]/fRG(oߎ~b^ꝤMDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDl‰ܜك/nKVmij|wdqlbF_z]=úOY 8aB=,[ ݾ!ꂋ/̙38ubX]/NRvnē}&G0=O/KVm_ݼlQUT*;z#"T]19*ˬK-߿bX,IΝ*^=  wn{;p$>c6oUYd* ބ'3ZѪπiihգ洞ҦZI;ejVoἴ6lmiꝤM[6ΕΞO}WmWt.UυK{YR5G]d+񚲚!3 wrJHETD.vU5iTj I׬XHd 9biˠy_;P}C?#_+LbwylI+3)$20>MQU*[&僸֫zx1 4&,WR9\BP@XB>ջNBŠ̃6lۆQSNCuw)򺀰x^Ax: liVeZ E|+3r!jϖuHcE]5w9`&%"]&9#(Ln'0}M]ꙬI""#tmIky17G_fCQ8 :yA|Pҹ2&HVR@Nk:GQeyUDVrœ7,QlhFBLj #姐hخl󈈈je/nCO^?;Ń:}%wo}Nޞ'5I*2^4j.v*76,c~0?Wp%|!N$ fq9N&H^YPRF1 @fi4@pV5BݴMyJSWx/ٟs$΍oH|#|=s +K5Iմis+u +-kPzLeR6u.fiz&"0*~ G䳞J`U5~E<hY&TdoFOɌV:~u#t(ܳ~}~/><镙tnBocad2im?I]2+ +bI{^1WhlgknUjEHsKK1gI|FD&2:""IfQYǷC(/p|3}z:#p؏pԷ%]iTs_ύAJDҲ42:"",fTjo/\z7'H&' +-jjD4LH˜eē#5e]GDDmL*8$siYoVsZ\ 28_yn\n_|3 2Vg:KvukEUٲk(#""L*t5AE{ M)9c&4xC1/[,腚ŧK%BΫhl2,َܻWlhyIUf(AuDDDl3)=_2)b`&%z11RLJbϤllllllޘI^LMMMعs'3IMDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD8*وk'=K]mux|; Vղg7{b ѳ`0F~u%ښv i#&^rdŊX,ؿ?\ ҥKOcjS;?CcMJ +W˾?فC\SVdU<Dִ~:z{{QZZ*D?!9pT̞w񿿜}o{[~X*s}ՁIMKE] + + +P\\AX,\+W(,,đ#G1V<[eTN8SbrٴQlncPT= 5wY߷ZnTC"aQz;ߍ2ox8ԉ'NoqK+:Ս|uV'k39ׇj9 Xv ֬Y"b֭e9 $R8ɔ|3oF"Gw>i}-enނ^3c9q볱!,XLA2oc15wX5Q^ FcMbGsۍo׿{z9Ȃ/pwFk]pEݻ۶múudȡr=… 9yPjVDC܊PQk>XZ9hL1#=oEupjϴ|֧.1^g||Sän{M?\ 5q)fꟅw:sy7[~O_N92"\!o9 "Z8AIj)7ދ{gx̣r\hOq-вJ.g7nD__vڅM6p`Æ zkѷyfԠG֘`SEk4)3k2@2D2%dGfpUG>>։Cz)kFG']m~Ώ_͙G1l…h"z[!pa R UGQTq:o !tDŠm;IS/K"+SEn8)ChQ1%Hm8U.Z'E/ʽUC9g]mG9&`e8Z\yXŻ5͙Ƭ?UP{ڋ\K1{51Z?}8` +}h nM׆tgy: xZ%:)!80||Oo]('}k[X\\ +?#G(=t<۶ջ,uO=.^DbyRzC\D.!ad[Sj|]॓La}9,͹K4Ҟw4yTWkg{yTMlU|בz.C|(H1Q3'ڏzFZU;UX1pu اL]7V:z_\Ӝisj+$ Ä)*}u=k;r"εQ!aYp|md+n}՜Zss6rS|=ԝP7g'Sɾ1h;モZٮ׊ $ٴtRBy8$>S)}_r1[=CcXrW: ĉ=K}a޽x'T[X ق S t?o:-YC2[BBVm;жe|\(Z 7kUNLm ['ry3|r<t92>i8f0@TyZC1oH|QsMu!Ek-1sG#1vTͽn1f~"J/N}m{w=K}o֓ qe\+|/}8rҿ5˸=W^ZG,~u޻ۗ^xqo^8oG͛ʩlۆi0 v٣ʤ.--ƍz2Upe˳vVΧ"yp>??w>o#]-7p1{ ߿/cY^u={V.:;;;cСC8}j+DahKH: ]a:(tZnN)f9mC7L,k(pt 跇چ(1Σ9y!+il89_շʞz>خSD Ż{ +\E]Fx㋚kCg:DA\sh:dŜ#8BqHCō?} F>)MiH>-b8&2~JQ)ɻ݌uR=QTs䪁I !rg럼YWѭ/>zީ\3[ o\\\ݻwq))!ߥZ*7$NrGDh2$$KB*NP noUԒU7jHT!m-!v tBQӌ/lb4}a|2sؽwWr/OuB!{ GPruvqPf1~'CޭݛBjn%P$M8u86lۂ>f-B!rQ7#&¢@tŵB&VYG1~'nyU8NV \umTʇmMaRL !BM yx7g;WGU:e#)eta?S8QvfltzQtR B!BMB˶0[Ի1x бhEMWB!,qQMB!{ 0a;\džB!B!B!B!B!B!pl‰=v > +y-dB!''wNFKu*wYp=ިp-h+:w7etC.8uN<`0 Ɗ<4kO&nG;/>B^˱Ooހ ?~DծY +Ң@1*C +rTǩQu#Ca޽صk`0+Lg(OT)}{vluj챯oxCl~`rW9gcpljt]4Dj/3Ce#ҝJٜ]*/ +VdY V B!D!$y6-ݲ 7.=j߿~aO*/rR9G]~G9ieIuQ^(S|.Mj3I r]m 3&fD.)hƹ3NUQk;XwR=.B'Xk&nW>*_q4>toze +k#yܩeF:fZatF/-i@T\YV w$@r4+'b1  mض-,usNZ6gUZ9XeCV/tRB!wسc+s1|a!tjn~/LN3jZf +4CS:DQ? ^/3町9!n+Q(BLjT9a"ߗS-sY,tRւ*ߖX +|~BȽ8'3ظtJOwƍ壯<+'?eF9jYq`hff=:P!Լz+" uE8m'M?F4a -!Njzۣ[Xr" E.!8'*1?T{xpzv\ ώԕ~t؝3(k9Ўsqv:):*Jלf^ktFn^<k7E~AsY"_Y|8/r!N*4x +{ zr_,ڌ7.Ƹاj[[ r0I>=; G!6[P?E>w^ +%wks4rR$.fd(x'8"#E}>7RfPCΌ8guG,!N +W}4=j9Qh!gȓ 9싴,Ű ު8NbU[7[`"C8OJ+G!g>;Zp+_('S$?Ző;n׎gV>:o;NLYn@iеWZli9`4z 1~k~c +z<;g|b45Ԫ 5ؤo5wE{jځʉNŪG:'6&Wo!? ' wa6D!qNnلC<8a '.zx/`&6oVs0}.r|;8'-=Qgk0!48$|$̼͐ʝcB_\\:F9J:I!cDqZtJriE31%z#礒Ó;P^zx8)N NJsAfTZZb&+n! G@٦QavVh30`P'mRe~XQy'!/&a$~I|) ^ϣÃ6ԚZynlB6 myI"q"_w&s_tF~ʔHw̘3Kp2ggg\gRǕeŐ} aGrJ ̤DD+@L*]5K{:x>L/FᇻUlQyu` ;'Gs&5%%*cV}':ʏ:p=+]bճ8zˤRs A7,$4d %2HGz\1sXeU7L~QDD$ICs%/k:z&(5Dh̤|!4#υR+#*b_&Q6YbKW[uṲDvLUʤv2?kxCDDHO&B]8qh7׏iPsDhi̤Oi}2Vk(gq4Ĺk |&uF!7LJD+˃ˤs3"YjUDEVfRRdR""b&%z#UY}g>~v%34j*8 zZQc{إX`aWW2..… <Ϸ\#-C*wtoPcَ[ #3ܳiNV ⨦CoVDha圁Yuoqws\46BQ +ǥ4###سg[rn޽8vrKDDPo\ɪy4Տ_RsO~}ʥRq)_^PT{W*#"3iD(j*ea7e.)櫕 +UBvw_99Qs"4 +%!+2jBJKA1Wt {Zdw*Srg|[>wӷ豒 D GΝ;45kzY%֮]NV#""Z +0~CU.n7//S5᳋.ѡ~w2L:كk qE'VvBd\,˂4 b[KGPMT66֪sWzDm>n"*bԜ8{ʛߡ ֭UrjCDDn>TOb#u=|z![pгoU{WLjD*+Rl/AeJt(NdP,WPVJ1N$2hf:S3jPy(xebYz;ffvʤ~#܊觜6'AQ\lިQs٘0c8:p=*93)ʀdN$|6^S]n*7;4'ݢsWɣcYycxEQF٧Vk.ΪT*ȑ#:|pϲ{vm}l6G].=0Я[)OE~џz|4ٌ900Gjhhg=Cl>ћ?[~;[ɓnGߎ;V, pARQù>lqFI(7up59I[y?[qY쮥UV: zQ6Vy`+Tj$JZ-NL&m; 1*Ԭ滻~zX +s_㸭Q֧Gnlu֓vMMMKEժ˞-?@{s].F?WC.g[Ɏ͊ ^7g)s=3imZ13uYZML]M +*}yT[R1{cpfz}V]w}-U];n{|i /XZ˙CjVYMg[e!Eo;dRrI=W>!Gmg}yR#٧?|BEE-dǦ?XVSq'{O&,re7sjǀ[y?y_;6+fJR)+֘U:LX3+̖.Wv>C0cL2Yy^jהy.mf;'11k9SZ'f+错\Kb1ih ckZ `Yir~X+Q_g'>"w{{{gc-?lȸzM!쏤e>6T@$Gv]zLJDDkILzo0zy?>ۓ |cHu[7wᣫ6Ocg~E]ʙ)0-X 3,Tfݚ$Bh3[fҼ'Q q}fLIUv9pi''3j؝۰:J-ߣ6V+ok֬\sI! #ۭuTnF ~VX |v􈈨s4ˤ}='992~(_ny)9v]9͟fMQLS59Q>Zy3i%_84"auݭ ?j&[IR=.e8h!Od>un.fV<3ςS(s5w(+ϖM#", *2'ٓ2c~vGNzJ_q/?=o|oL:w{rceT2iM:LZcj4`L恔UEOmW@+aų2T8(D˕3i9n[g\ښhv(9jȹR5 RUc&Uur~3CxJkSmS:NLzw0z1s~XfLG1xvW@ȡ=;wNAw. +OЄ-8٫j+bz]l)4Ϥ{ +|'Ѥ̥OM۩1lTFr^>YRӛ_Gba^:`K]spxjz NS ƛ2føѸk@ ɿGl;zDDye3c121ܻ8SHKEqdW<:7΍“УS4QT >3y8FT2OSk ymlE3i)#_f}'\=PtW:OY􈈨4ˤ-xp+m=fc#Wq'׈,z\DzLӭg *eRzF+"ݼp{YȺy5)ezDDyZeRΕWe.ݺ /<׋^*-yV9}6ߧ[2Z,Ĥݏѡ2g^8#D=`%rcN=)ĮdWrm{p.J:+6i&m.)vVRh E{ƾҋfz̬8k{< ҠGn^'ћ<g;_uIwj[-- +L4x1NL/PGȨh4 ;i2߂[w 1vJo{tHFv(]9V/tLpktL(2МSl3IωHo]K#N%N*Y:>9iQN!,Maҡi*Kn]C._.R4ICG/=|^{rN:\Uw,U^OR{IUH'@Prק>csސwaP +:I2'<>G?}cgp/?ۏxohp']>X{^"4ݘ.K /~='u 2Q OM⤣kw>ZJ%7.[1+I[eI58 Ní&:lWZ +3'i}γHNZNv]>FI +tOPo{{~NIbȘw==緋dX8B +kWŚ!+_@ XG9Ǘ^Ş&wLkOhbʮ;Oc7.|N|· +QOt{WIM܉蛫Nzc+ t|-c`4 V{̄9N0'y9zs~?<0[.믊5mCnSS'{qfs՜gi'wұxN+c[i}ǝtCd\fޅ9ܦ0Nu\ꂴ/ڛƳւqP[\O& +?du&iFb[>`2Z1oVY.1FZhjͣ~+(pbq+믊5Je= ͈ iy.| nE-o7:j#=&ͷy`eURQϡ| 7)!uIImֵm&x\w +>梗4G#ؼa|qV ,uRl"dIi ؄RMa|I$EeGnp>u4o1snV05p{anLLj$jԡ+yXs<_s-M8@ 9)Op/|K/}tvMS9^ڵV /ABC;*tnI(Kf$/z`ѵ)Z"1ݪ?Ei;0:I8~74 aK/% sv XK)X CuN*6UNʸq[ڎ3.*x4r}kGa˰I ܘSGy)]_䤦sgөTՄQK},N)qqR 5Ȅ:TJzvL\04nMטyR_Nӎ7{ZQ' '圔qnܺ1pPv=c } +'@p0|2! ԔN +]q'E70ՠ2\@503\MMM|eH_dR`fZgu &WJV3rMgLgE&(?fsVM1Y9&iu+oLVeeWoϗfb"3ù\.gҿ=5s9^WVN+g>΄et1k5j6keL8,2)@13\}}؞sw\QeUg+^Xs^LN$t_]3q׻D#1Yw>H&(?fkllpVΗYIrPd/ S=޴L Ҳ[y#6ͻ k,ɤpnge$|y*=wչt&LRNe2bg6Ԇ>9%d0VlKZR}ޑL +P~ xU eA5|s^5=>bou&Q#'*LKk_0f 8\|F>L +P~ knvV-i΋j6OzRZ[L>=n>*+l߸}jϭ8#c%=,-oHks^E&(?fk *ȤpPbL +P~ wSdRcfVLIʏۿ_1E&(Of}XՂjAٿm@ _6Z{/~P-SSSC"jdR蓠kZĀtg\N_=%m} zvFNH_%43־U,JgG_R+^_m=?<gJWlfSLLeDm%j.L +{ު{zZAkM2d&})&LjcoݷgJs{mT 3\.y3/3K:.ѭ.Yծk;܊},>XeH<ܨ2(^]cK2kG.kτΤwAk>;*ފ.a[zǭ;;dge=kt,?(>#+w~|dRP-S__"u>"^wl5oXQw떶 +}l3k<5*io#m鐉=^!?8'wRzlؙ&ϝ6q{UI'w=}UkI:bD"5:ge[WWE=Ln9$o1snP{ԼDJ|_{Q5T 34668,&$w#-~!zI>]VW}94hOE=(:;M?aIxρ]&%LV{>1ͻ {<3=>(SDH<e,JyJ6JwwIeaaAyr!m=kR?k2ҲY|Rzaǯ{;fI9H=lOY +}SdR_8硣GWSPoعmۺi;s|ΧmIc6M}|u:si}2q]/8ֶ׾v:={3}~N/Ǻꮻͭ:N>GOEw~tc6gVov^}>>wȤ`prT+9ٗ176fklZʤcm"ϛΤB;{g{Om;]zR鍻v;L + 'l$.K]9ĮE&{RN"=<4L +'P{p? T6qV7LSUQQy'{JjujMƯM6|רB⫮]]o¸aSwUhzMYocųEyfrh4 +ahJ$dƂ P(hZ L,ۙ3א5?b^&+feY"?TpReN*4fnCYs@Bz[@[WưT2p0Р[΀3 jzޜԤ;=9zrg&M;fR3gi Bݾyv/pe;ϟ/MM]=Z\̛[[4dXY;&]Өy.aOOU:jU4*Z͞zZ֬2̬Rk缾rvβ +Оv}&w2ͲZAl&Mޘ6ke6f._ygs|qom?]eeo*&5P9eМ䷡O]V1՞Zͺ*/yoƤؚߧD CڣI=oˤ^t24G,Ƞߧwu+c1T?m%zm&35;4+aϝw^tEoꏟϼ7tvZJQI8VOIkMu{} Gc?+rt4YŢ + +|F^&ͨeIG-9βeb3ibAɵFhR`!#q wɛ܋yPbg3Oɣ3xRzm{{Ʊ57:svӥKtY9rD,ܹszbV39U&iv3f.w.)H(2qk`(8k)jZnoe[4yW5wܾ?K׍~K9`y% uP9mұcܱθƁukJ,j4a͓bNٟNkpV?x՛c#8?-J|f~%_X +~ygʅ3\οG~߻>qۯ_WWӺx;w7ڵkn4MS<*ȑ#:~;֙`gfa?UnYIn^*]Ôe>:1D{d]LqBM-M6hnnyNVWW7bͲV$[nu"a|Ϫb:7Pܘb)G?:C:pgǵ[~InOeO"_;v ax'022R4&Ei>(K}yY$zD:بO$f7"KD ++yfRL2ɾBOLj9:]q$ s2}=kk<:Vw3ۏ"pF]Zܩ;R MDDݝ:m9Sѿ}t *MP>8WOϡӽw.V=|҂7VWW'߉>Q#je9#3nP&P#S̤(>Q-޻1+Ȥ +N'tU'$GDvU42zd>8PG~̀Q#ϫ"p"Z]qewWW̺ae+l<2]zŝ:jmă4i9gşƵֈ,:z/.| G;P/?cAATUU6'jDmLcIC٤5ޥ\\zi";,3ϤNOSaؗKˤ"gyN!ʤFNZ>y&^ +DΔlfybkX}ϼ{Hakώ9}wTwEDD tW?ꗹtds/g>GvPA?UҥKBؾ};M5TuX*Ќ~nzUӠ>tj1\E5uvj~XWi[)|weRWQU{PT͸#jmoDDDϞ;oV^؆3.y,"[ܺx{fff +6Q#jB!NGoo46Ѝ7#7TڛqhN|5OȘ6 ;wDGGi}y.vKDDDjm^ܹ8;'Yjm١>ܛ:!xDQ9 tNB;dϧ>QCDDDDTIeך7OrkllH$L5 t)譋sWt!|d4evci||{Amm-6l`D޽{qĉ"pp儦E]ԫ혌O]5)s`ҵ: xǞ ׉RJ""""+F<0sxdߎoT?߯21bl9( .@u\UUʼ&UWWfZQgIa>F:#(!MwzYBz]&KxF]jz2}H~3g<;[g0ޅ2/qǭ7_uJU% >:@70v跩pIb_NL G2qYkDZ0t8Sfb0SB(6M I/ZWVCjB4MyX_>L{ٟs8c;Al˾ {~߹;GmӉK.:Z1vtvvZ.}r"W& G7a|2x}?ʤ ]3+)YCW,D.#UNÒϚkfqa`A+[iPߧ:j^֬{G0<Ԩʣ9<=>:O~y3リb?{ǟWmM6ŋRP|8lܸ[lQrM]*#a-*R93-ygL Ծ#I}RݼG.Qy +6b~Nإz;f(!b.t.X$tV앉-EdJeJ{"k 1[G6-S79(V9ăۗp!\m>ٔw@fvs +ȝǣ;g0;Eե7?ndTlSkAil۶ *Y>仭[YR&̘ͩ W(fA|aQY~4C3',+*2d!Y3jM}4BɜxN+ _X1zzͥ0"éLg5)_+hhAzu# 5ٙL̙5;hEy΍zF>3a:3@J*&"ê򉈈hMTfOS*c~~Gnݝ@0q~4_ n\| oNT&}t{)=|yq#SGGnwŐ\oo/;LIa *,|"sho4+2ht+Ϫl)ʳzx^vtm#mTOP7\Hɬt\߰;7͌j3@R푳g ҪWuwʘ2WN2޹x̋8v [qMIX,nlܸNp8;9'kdJ4/N*l +rfID"jf~&djƙV>.)Pw(ϝ^2i} FY&mԛX]&U{ƓOcF!֊C=ѯ7'U&;wy _brtτ/ToRyt@?O 7'/GFFvڊ[4/wrr!Is"ߤ& ^XZf L :3nxJb.0#bzԚHQkEBD-|B 6|lK}\Н3拪6#k:7AŶUgRDfd$aߨ̤z+3x'"GewK dDFp5BDDDko%iwn|`Ffѹׇpp4죓jm3|9>>^a4_sF6Τ"̗\>}\i.ɪLhIרI%+f,X#2~&dՙʤP@bv3耹U7҂@ Y\~5VA!1h<6鍈hɱ=xx+cj)L_݅OSivc׮]9䜬a]-G4^>[""":=8;>;W_ţ;gO mݺu Zaܛ=/-9""""f:9o%qv|й١}Ȑ5DDDDDpo>!twۏLj||MC:::0559ض]s9Y#kɱ=*w ,WC󆐚 {H3fmwlۂK{->{պStz}kG"DBDD_Ӂ*{޾?p|wDKг~m;%_L# fpY`\Baf XmFF 0к[5NvP5iSe~ؤ+p~xKlI<ǏyMkKW^,yhh ~g4URR QHO{dXAz%8<}d7̣hFHM +4`=ח}C/Wuqa?}8z`(2G|1' /;qD~ ek!χ+W0E6lHàFGG111bW^_ 4MY-$P3 +$ nt+N3"Y ܒ3D!I<$ Qfv +lGO'%J*ņ< +:"f$1V3<KԣF|=q]+isucRxzgobȥ0.`4H͇Yܤ߇oYx|a>C7n˗199z166qlٲ5b=2iAd(L[JUKjW C*$+"TDeZ䋰scO%Tń066t#8 ]G*퓵jQ;."pot:W;'mjxFYhrR> 8ۡ^]ճIA'>'*.]w +i~wI53E!֦XM˻K xZӝZwק?Ħ1Yp+I w/04'??¾om`k!ʗKKKضmR֭[Y mǤʠa@0U%6b2iF۪jTT'|,#I MJD(AI{jy%c0¡ D%Z:(A^LJLҧmҟU[)w!CPU`}H/gPl8Cnʷ|ʄ(x1.xѺTLG2ӂARǡ;ū-겞5&ҡ|^Zѩ΂PX"KxL0tU&IPʱMͅH,Pwt;ŵD21+w☚(7O˯3Ƥ+ɓ'1== ͛FfffؖI׍dHMkOdfX qʎA+J/0!k1o'P$I}W[_Mչj\ C("M"$wyd?(dSE@mg٫Fl>w>[Gm| xnw?B6Cab{z&Z$׺ӧob{dIyo>?>P:>pwοC/awp+x/(_Z)att67:Gchl;&-xJG<ۙXw{yB42PUQ=¤_[;D7 D[&fsbVRibN<:q0'͗yZzwSg:¤^۬uKf~EČ$R/Ux1QX[xyZZwzk~K>./Vỵ bN}oObعs'v8=8Y$K H sA 2:m"%{""<BC8pϱ!1EQlZbuW"y:K^jԅφݼ![]Fԭnzx'օ|q߇W=Eed~0Xtwp+wzaX^^ݻw=t dRmذty[a}(zx'֍N݋'Xk JK;&q.|?b(c~ڵ ΣD  ϲEU_.gS$z6oױ<n~65009~qqmnuwdeŝK$DrTܠ^"Hܔ:Rpv!wVIdK|@DHTS:r^P A }٤k~3<+f&qja/n?o<,!B!ݸs- 4=jMB!2n?+?y SۉB>ܖxGA399'O… p]k2FB!O7V)}sO⏗ajӘ{bNܺ7E̖qr Y\\1::C=8qDYu6B}g_hV l7Gߎ &)#43;2=~"^A󛕗Jb+iRGٳ0MS}PӐsw&&&T[ NRe`B\5=Ɋ;{D$εz]<8FC!ȩXr};+)ܺ.❗Wq<޿B|pnw̙37u]֯_4(T qC\R^ sX wyS%pk]o٥-ʈH֭FX]zyFA}.z|t^&_{jD7j-+w|OCn];iB/qݵ ! {} }s*n8޻'qz!gAqF>}[lQ1埍cll 6l͛UFI*2e+ՊWF1{[5=|' _,+8j> Z|DXQ68HJs^Y\D5Z Drނ|E4JqQ߽Yc$]@!eW/"u9\Ǯf6s3jmz y ɗNl{+Ү[v.߈纓;O|Baj~$Y:>;E壯p=y[Cj~;_.--rS鞍CmݺU՜4ˋpR+X[aX20W[r<aV\O2O0UriDlLa!Uy mF0.b5V4W5s -Tkhf");dHFݑU +Nғr2_Ԭ_%©{\u 'J6v".W!eZH䅣S\S?wsoESG։yu']yN!5tP+TUG߿Z8~|x#bL9K9cǎaffhrNѣ8$nb"I.V}!t!t[m\)# !A<\E-)3V%ʎQ(yQ)X[VBUzׯթ)0,zp̨ڹj.r,9MFÝy=ST8;rڻ'*5N֟^|B#ػk.P)}/oo_~Ԑ*/åg~[ș_:ilذ15'dfLC|L-S&o em+yؖP($FPDd$C}hN[j{ktR^vR#Y By +*|H`#H2p};!zSVsFzP^{՝c>B!d ,9׾.*'ky0y/4f^:8'鑣KT*Ct3:")Qa(٢`%-X[iW z+f7(HX.M~y|;=ͤG7߾es/bɣ7H

׹s紼'6.F^ѯ wU%E_MywkGzIR)mnnj{{{0=׬yrڽR!Q{q}IY7^5ˋƊS_=_1#VVV:ty<ḞbرcfnjjJH}U+? nZvKa=:?>ϟ{^½XzK9a<=/U W9׃lt]W333fnvvV'OfHnJ03SpTl,H_f]Ǖ־lɤÄ3?ט #k2iìݷ׸uR`:pAOt't}-..y͟cnnNǏשSlY3̓4Zb~j͚ekaX%{{2YvWRj`XIݤ޾u~'uu^J;21g:#.oӫ7KLϔ5}R*c1ݻz嗵dɞ̝>}eN2ydRZnow7G+9%Q%v]dLCTm~K/Loz^XT|f^yn&uJ_ =zwr2) J^Mudv,ǬS4فT39btE#%0Izy,,6k/ / tqkvv7윩{P&mYM}y`f9'؟I{QI /RXVɀ;>9nO,[ j* sחX^W:S ͏^I2飹~N& JdR3ʕ+D"&&&zulLd\.w`&mٰŸ\/LdF_&m+ 3%l 34-f>wL(w]ys04& 𹪸ȋ&UyYˌ w SHvM}rɨ{nQ=]!LbuZ[EsOU,ȩK 0:{ly;vl05czg@0C!T2Xf4w6ޝ勱4[oՊvI=[{AgO|;_ c͍u DnG_ +ɮ{j.!666u9-//fzLS}3 #C]ϓwC׻;s?xqqdJRazLY?׏w_VT#-Mp9PYY9gȹjx<U+cQ(P'a><"Ú{~N_i9|^IĭI'""S;0dmm*ɛ ܾ܋{ݪN_Wn:ߦ-ۍgϪ:jkkQSS3g9˅FU+)MCΣ˪,/aZr)M/ә @ZH*ZK;]cZx"'ϏV/uDDDLxUز}*I?~{=',;3=۱-Ԫ-UV̙3hjjR٪UQWWzYFwJCȊ,j|YkAiX1 LCL{ÖIa ,ʄOj؞/B{wlD6$3$#3{at&79nw,h8qEM>'Ε}'9_QȎ djEc[uĦɻ+^/ND4Ib ""g̿?1W_EòʣoRՍ_nr_U̗CCCXnU6ssk׮U5vLLlW~|^~&u9}}Q[ag3pKɤSz/vs#HL  +ZO͸wm@eҿ݃m{Qs\#*iée9̗]]]xQgBw9}NR o [\L2iunoK֨H + "")Ҁדhn4pt w=\>wFfK?oPtWwA˞ܢq5Y#kgR9 べdΉLS*?MT,L*{$d> /V?UIP&gRsˤ%{yGNCDDD+S(n{_^xd" bVֲ.\@<ƍa!d.a4aTi@ﮉ3ROԾLĒ..rsko(\qoIk+~|v,%V7pccczj!kd|}GoI}T64,3j1=6oތ6!d (hik=9 +oP,ݡ֞۶ܺui0=z" > +ЀA\t m;P(`ttiVڵ . Fwwʣ_ݲy#9#,vrj["tHF 300&b!d$>!Lt0tL`Y<e/-b|3ܩuHU[OU7!a݉PLx5`/؈vCOb{  aݻ4M>OLL`||SSSx.\"/5 {"]hÄ(aLUnc)şSKf65b]uQz3.ɻ  >Rn߾'Ox.^Iƒ +o+¿u?+7=3ĕJЀ-.S*c[V E֟_+Cw&cDϠ*"W;?֮AKw&{r}y  Cejj +nݒtyyY/^ԩSX\\ׯ3'dπeVl v>[ЯTSĜv y<[R;ck']빊!4rZ"K3h;DnبZVRQYHP9@jzrC +GB}(f,(#hvG{|k׮g'Ƅ, +C=xa[cEM#sOQ!`0se>=XOjWf --TEmGɓzb@wM[l/5((J?V\aL3_r!Y޸Z(ZQܙ|z:Sa;3];j`1w>x, 8q7abbBƱcYdOڑr]jMwjvМI O_߽'ۻ&;]ݼ\{}ƺWqzcPk>W-(L._~tz{t+ۮ3@RǨ  Carr(8s "C{ȑ}h4Ō2|j햽jvG=dw-'fLQqQV}f  8ݻ9"W!A CdBAěFxi={!DQ`QuKAćXbAAAAAAAAAAAAAAAAAAOsO!E#  7gW?W_xy~cϟ_?/D0-XXƄW`*߮(𵪨|ϜdCco~ݷ +ek5,ycr;w((((((>> {W0;ET< ,sr +pE +j0DB6OqU2z{'tΪ[BRs6ߺm,ނG>m+++tΝ;GAAAAAo`]DNG_ߛ§?f}$~ExsNNws'xNPse <Ǖ2Ea}Hm[u0?inW TUI˜J5UDs'+ڷh +F#7R_q>^]Fo.7AA'spe9T>^_?Ts%{=ˢX25@7mw}׎Zp\n]'ѣBgnF>ӆV4q1L{u,5!Uzj ԟT˭ h|ȈWz;zp+NmS'up .*5~Fٯ8ۆ8vݞvg?#QZKԳX +⠺UH ^lQXwV(&X !MC.uRЂUH}oJ>,3ݽavQJ#<<<|Nӝ/gR..../ʘ>,9{qxNƣ} -Sx#Nx| {ϗqvC5`W,IZ݄"K%nLx jⅤل2*TU(LtZ0TV+d0!Zy̚A5,2crRmx-#g<~lNi Q@p]rW?uup|u͹.Pè0\Bٖ3iKը^3 agMZ;23f/gR..../ʘ+/a߮:O|s wh/ԙݖGUū {["wLeE^ u/=DI,ԃ[vSXsk,2pbۇ42Mv]fIwzA09\ѲAxzބ3toNW1HVɱl_}?L:WԽߌg=K}TP,A8a?ne%o%RoV....UƤؼai;9[gq'>xs <^6n4["wB6 2;BCrhY$rgJ=&z_ +b02`ʤqVcҢLUiPUf],_פTI[+ݛdz֠?Z՘t~kx=ٹΤU,gI{$r\ԟgXowc\rqqqqͬ2& J4c̻sMm/;q'w?>w_}j0&]``5yNX@H7$|z=&2u$CIG=8ZB&X.B-sc6aqQ +u@I=85 ,h v\:^kR2I u)Ϥu`ҵmox0hݟ|Lg{S&Ţr2ʝEFHދ$ Y5KJƫ|*Q!+_....UƤ\y vm[1)7/㏗>F9ǛgOc.gl1Z&nDj +e&_KlL'ġcMpa5̘nC1IK;sfgd< ]PZ.5.ۺ0''O'.z~fkcҵ8gij3Xݟ?R^rlwI '@ʖ4zd H"8MA"‚d,Mr~5?FVK?h*4黎$H=o'!LQDk0Gf!,^o9\· ۏVlר*)vf: ۄ3)׺I_Yǒ^?Ř\̑Nڅw6~u\;G}TI,X:+I&W?_{6ozwZ&H4P$-laXX)FFLCȲ,O='#&#V?fs?_#nt{A0 IdN|6m:49wP6^P%W4}q&ZW1){b\zW _>~b6'{R/UȤPr +lmeX!򠉔C6E 5sȵ6p}v(Im}åTUNUU_*iZ0|McLN3Ս3)׺In]~qG׶㜳?AyƢG__ţ9I&ĄtcR"&51FRR !ÊI MIM$ć_W!JaʙTZ,^6 +^:1Q;K.E acĝfQ+Y¤5Τ\\\\\1){p熏ʀAi{z>O3..^Lj'Cp?AM.qP-o^ŰF0UbRBvҋClr&mkiq쌌g U( '9Ws,?pٜlΤgR...{iJ(^YǭK/`Y~39..8Ȳ 9eYgO$IX@"$ DGv@( L@l܀qՉ4ڙDInM +&}6k-,SճpI/-6)fB_Mc$ilRK)%CJIa:Ŭ +endstream +endobj +343 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(144)Tj +ET +q +452 570.8 -377 -350.75 re +W n +q +378.1170502 0 0 351.8666382 74.4414825 219.4918671 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 200.4 Tm +(F)Tj +0.482 0 Td +(igure 6: F)Tj +/C2_0 1 Tf +4.039 0 Td +<0041004C0046003D004B004B003D0001001F00470046005D>Tj +/TT0 1 Tf +(gur)Tj +6.88 0 Td +(ation in Hudson)Tj +/TT1 1 Tf +12 0 0 12 57 164 Tm +(Build )Tj +2.465 0 Td +(Y)Tj +0.482 0 Td +(our F)Tj +2.261 0 Td +(itnesse)Tj +/TT0 1 Tf +10 0 0 10 75 141.6 Tm +(F)Tj +0.482 0 Td +(itnesse )Tj +3.242 0 Td +(test )Tj +1.797 0 Td +(code )Tj +2.464 0 Td +(is )Tj +1.019 0 Td +(built )Tj +2.298 0 Td +(and )Tj +1.964 0 Td +(tested )Tj +2.853 0 Td +(as )Tj +1.241 0 Td +(a )Tj +0.852 0 Td +(standalone )Tj +5.021 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.408 0 Td +(module. )Tj +3.909 0 Td +(It )Tj +0.908 0 Td +(is )Tj +1.019 0 Td +(pac)Tj +1.538 0 Td +(kaged )Tj +2.908 0 Td +(as )Tj +1.241 0 Td +(a )Tj +0.852 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +-40.922 -1.44 Td +(project \(see Listing 83\) with the F)Tj +14.211 0 Td +(itnesse and )Tj +/TT2 1 Tf +(fitlibrary)Tj +/TT0 1 Tf +( dependencies.)Tj +/TT2 1 Tf +-12.411 -3.58 Td +(>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 345 0 R>>endobj +345 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(145)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 624.2 Tm +(maven.apache.org/xsd/maven-4.0.0.xsd">)Tj +1.8 -1.79 Td +( 4.0.0)Tj +0 -3.58 TD +( com.abien.xray)Tj +0 -1.79 TD +( x-ray-fitnesse)Tj +0 -1.79 TD +( 1.0-SNAPSHOT)Tj +0 -1.79 TD +( jar)Tj +0 -3.58 TD +( x-ray-fitnesse)Tj +0 -1.79 TD +( http://maven.apache.org)Tj +0 -1.79 TD +( )Tj +/TT2 1 Tf +0 -1.79 TD +( )Tj +0 -1.79 TD +( neuri)Tj +T* +( http://maven.neuri.com/)Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( true)Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +T* +( false)Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +/TT1 1 Tf +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +T* +( )Tj +0 -1.79 TD +( maven-assembly-plugin)Tj +0 -1.79 TD +( 2.2)Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( jar-with-dependencies)Tj +0 -1.79 TD +( )Tj +ET + +endstream +endobj +346 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 348 0 R>>endobj +347 0 obj<>endobj +348 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(146)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( )Tj +0 -1.79 TD +( )Tj +T* +( org.apache.maven.plugins)Tj +T* +( maven-compiler-plugin)Tj +T* +( 2.0.2)Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( 1.6)Tj +0 -1.79 TD +( 1.6)Tj +T* +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +T* +( )Tj +/TT2 1 Tf +( )Tj +0 -1.79 TD +( org.fitnesse)Tj +0 -1.79 TD +( fitnesse)Tj +0 -1.79 TD +( 20100103)Tj +0 -1.79 TD +( provided)Tj +T* +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( org.fitnesse)Tj +0 -1.79 TD +( fitlibrary)Tj +0 -1.79 TD +( 20080812)Tj +0 -1.79 TD +( compile)Tj +T* +( )Tj +/TT1 1 Tf +0 -1.79 TD +( )Tj +0 -1.79 TD +( com.abien.xray)Tj +0 -1.79 TD +( x-ray)Tj +0 -1.79 TD +( 1.0-SNAPSHOT)Tj +0 -1.79 TD +( compile)Tj +0 -1.79 TD +( )Tj +ET + +endstream +endobj +349 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 350 0 R>>endobj +350 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(147)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( com.abien.xray)Tj +0 -1.79 TD +( x-ray-client)Tj +T* +( 1.0-SNAPSHOT)Tj +T* +( compile)Tj +T* +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( junit)Tj +0 -1.79 TD +( junit)Tj +T* +( 4.8.2)Tj +0 -1.79 TD +( test)Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +0 -1.79 TD +( )Tj +T* +( UTF-8)Tj +1.8 -1.79 Td +( )Tj +0 -1.79 TD +()Tj +/TT0 1 Tf +-1.8 -1.88 Td +(Listing 83: Ma)Tj +6.084 0 Td +(v)Tj +0.488 0 Td +(en Build for F)Tj +5.818 0 Td +(itnesse)Tj +-10.59 -2.24 Td +(Neither )Tj +3.704 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.981 0 Td +(is )Tj +1.148 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.537 0 Td +(into )Tj +2.149 0 Td +(the )Tj +1.815 0 Td +(default )Tj +3.427 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.537 0 Td +(repository)Tj +4.187 0 Td +(. )Tj +0.685 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.537 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.537 0 Td +(repository )Tj +-37.921 -1.44 Td +(\()Tj +0.318 0 Td +(h)Tj +0.596 0 Td +(t)Tj +0.318 0 Td +(t)Tj +0.318 0 Td +(p)Tj +0.596 0 Td +(:)Tj +0.318 0 Td +(/)Tj +0.318 0 Td +(/)Tj +0.318 0 Td +(m)Tj +0.873 0 Td +(a)Tj +0.51 0 Td +(v)Tj +0.528 0 Td +(e)Tj +0.54 0 Td +(n)Tj +0.596 0 Td +(.)Tj +0.318 0 Td +(n)Tj +0.596 0 Td +(e)Tj +0.54 0 Td +(u)Tj +0.596 0 Td +(r)Tj +0.373 0 Td +(i)Tj +0.318 0 Td +(.)Tj +0.318 0 Td +(c)Tj +0.54 0 Td +(o)Tj +0.596 0 Td +(m)Tj +0.873 0 Td +(/)Tj +0.318 0 Td +(\) )Tj +1.076 0 Td +(c)Tj +0.54 0 Td +(o)Tj +0.596 0 Td +(n)Tj +0.596 0 Td +(t)Tj +0.318 0 Td +(a)Tj +0.54 0 Td +(i)Tj +0.318 0 Td +(n)Tj +0.596 0 Td +(s )Tj +1.187 0 Td +(b)Tj +0.596 0 Td +(o)Tj +0.596 0 Td +(t)Tj +0.318 0 Td +(h )Tj +1.354 0 Td +(l)Tj +0.318 0 Td +(i)Tj +0.318 0 Td +(b)Tj +0.596 0 Td +(r)Tj +0.361 0 Td +(a)Tj +0.54 0 Td +(r)Tj +0.373 0 Td +(i)Tj +0.318 0 Td +(e)Tj +0.54 0 Td +(s )Tj +1.187 0 Td +(a)Tj +0.54 0 Td +(n)Tj +0.596 0 Td +(d )Tj +1.354 0 Td +(n)Tj +0.596 0 Td +(e)Tj +0.54 0 Td +(e)Tj +0.54 0 Td +(d)Tj +0.596 0 Td +(s )Tj +1.187 0 Td +(t)Tj +0.318 0 Td +(o )Tj +1.354 0 Td +(b)Tj +0.596 0 Td +(e )Tj +1.298 0 Td +(i)Tj +0.318 0 Td +(n)Tj +0.596 0 Td +(c)Tj +0.54 0 Td +(l)Tj +0.318 0 Td +(u)Tj +0.596 0 Td +(d)Tj +0.596 0 Td +(e)Tj +0.54 0 Td +(d )Tj +1.354 0 Td +(i)Tj +0.318 0 Td +(n )Tj +1.354 0 Td +(t)Tj +0.318 0 Td +(h)Tj +0.596 0 Td +(e)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 478.9998 282.2 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 267.8 Tm +()Tj +/TT0 1 Tf +( )Tj +8.813 0 Td +(section. )Tj +3.673 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.468 0 Td +(F)Tj +0.482 0 Td +(itnesse )Tj +3.302 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.468 0 Td +(build )Tj +2.636 0 Td +(is )Tj +1.079 0 Td +(executed )Tj +4.302 0 Td +(only )Tj +2.302 0 Td +(on )Tj +1.524 0 Td +(demand )Tj +3.913 0 Td +(in )Tj +1.246 0 Td +(case )Tj +2.301 0 Td +(the )Tj +/C2_0 1 Tf +-40.866 -1.44 Td +<005D>Tj +/TT0 1 Tf +(xture )Tj +3.1 0 Td +(class )Tj +2.433 0 Td +(\(see )Tj +2.044 0 Td +(Listing )Tj +3.156 0 Td +(82\) )Tj +1.767 0 Td +(c)Tj +0.482 0 Td +(hanges. )Tj +3.656 0 Td +(Implementation )Tj +7.157 0 Td +(of )Tj +1.211 0 Td +(new )Tj +2.211 0 Td +(use )Tj +1.822 0 Td +(cases, )Tj +2.933 0 Td +(or )Tj +1.266 0 Td +(signature )Tj +4.267 0 Td +(c)Tj +0.482 0 Td +(hanges )Tj +3.378 0 Td +(of)Tj +( )Tj +-41.366 -1.44 Td +(the )Tj +1.668 0 Td +(existing )Tj +3.613 0 Td +(methods, )Tj +4.28 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.28 0 Td +(require )Tj +3.39 0 Td +(a )Tj +0.834 0 Td +(build )Tj +2.558 0 Td +(execution )Tj +4.558 0 Td +(and )Tj +1.946 0 Td +(redeplo)Tj +3.267 0 Td +(yment )Tj +3.001 0 Td +(of )Tj +1.168 0 Td +(the )Tj +1.668 0 Td +(resulting )Tj +4.002 0 Td +(J)Tj +0.26 0 Td +(AR )Tj +/C2_0 1 Tf +1.612 0 Td +<005D>Tj +/TT0 1 Tf +(le )Tj +-40.866 -1.44 Td +(to the F)Tj +3.206 0 Td +(itnesse serv)Tj +4.878 0 Td +(er)Tj +0.759 0 Td +(. )Tj +-7.043 -2.24 Td +(Changes )Tj +4.293 0 Td +(in )Tj +1.459 0 Td +(the )Tj +1.959 0 Td +(internal )Tj +3.904 0 Td +(business )Tj +4.238 0 Td +(logic )Tj +2.737 0 Td +(implementation )Tj +7.405 0 Td +(do )Tj +1.737 0 Td +(not )Tj +2.015 0 Td +(affect )Tj +2.959 0 Td +(the )Tj +/C2_0 1 Tf +1.959 0 Td +<005D>Tj +/TT0 1 Tf +(xture )Tj +3.348 0 Td +(code. )Tj +/TT1 1 Tf +-39.81 -1.44 Td +(x-ray-fitnesse)Tj +/TT0 1 Tf +( )Tj +9.014 0 Td +(could )Tj +3.059 0 Td +(be )Tj +1.669 0 Td +(built )Tj +2.559 0 Td +(easily )Tj +3.058 0 Td +(on )Tj +1.725 0 Td +(a )Tj +1.113 0 Td +(CI )Tj +1.558 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.446 0 Td +(as )Tj +1.502 0 Td +(well. )Tj +2.633 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.725 0 Td +(could )Tj +3.059 0 Td +(insert )Tj +2.947 0 Td +(a )Tj +1.113 0 Td +(new )Tj +/TT1 1 Tf +-40.366 -1.44 Td +(x-ray-fitnesse-setup )Tj +/TT0 1 Tf +12.686 0 Td +(build )Tj +2.586 0 Td +(job)Tj +/TT1 1 Tf +( )Tj +/TT0 1 Tf +2.074 0 Td +(before )Tj +/TT1 1 Tf +3.085 0 Td +(x-ray-fitnesse )Tj +/TT0 1 Tf +9.085 0 Td +(\(F)Tj +0.76 0 Td +(igure )Tj +2.529 0 Td +(4\) )Tj +1.196 0 Td +(to )Tj +1.196 0 Td +(build )Tj +2.586 0 Td +(the )Tj +/C2_0 1 Tf +1.696 0 Td +<005D>Tj +/TT0 1 Tf +(xture)Tj +( )Tj +-39.477 -1.44 Td +(on )Tj +1.42 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.641 0 Td +(commit. )Tj +3.864 0 Td +(In )Tj +1.142 0 Td +(the )Tj +1.642 0 Td +(case )Tj +2.197 0 Td +(of )Tj +1.142 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.058 0 Td +(the )Tj +/C2_0 1 Tf +1.642 0 Td +<005D>Tj +/TT0 1 Tf +(xture )Tj +3.031 0 Td +(c)Tj +0.482 0 Td +(hanges )Tj +3.309 0 Td +(too )Tj +1.698 0 Td +(infrequently )Tj +5.477 0 Td +(to )Tj +1.142 0 Td +(become )Tj +3.753 0 Td +(appropriate )Tj +-37.254 -1.44 Td +(for CI, so it is not built on CI for build performance reasons.)Tj +/TT3 1 Tf +12 0 0 12 57 108.2001 Tm +(Continuous Quality F)Tj +9.292 0 Td +(eedbac)Tj +3.094 0 Td +(k with Sonar)Tj +/TT0 1 Tf +10 0 0 10 75 85.8 Tm +(In the last part of the build code, quality metrics are performed with S\ onar )Tj +ET + +endstream +endobj +351 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 352 0 R>>endobj +352 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(148)Tj +0 Tc 0 Tw -20.132 57.06 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.sonarsour)Tj +4.434 0 Td +(ce.org)Tj +(\), )Tj +3.65 0 Td +(a )Tj +0.926 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.482 0 Td +(plug-in )Tj +3.483 0 Td +(that )Tj +2.039 0 Td +(performs )Tj +4.205 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.204 0 Td +(static )Tj +2.65 0 Td +(analysis )Tj +3.817 0 Td +(c)Tj +0.482 0 Td +(hec)Tj +1.538 0 Td +(ks )Tj +1.315 0 Td +(with)Tj +( )Tj +-40.31 -1.44 Td +(PMD)Tj +2.178 0 Td +(, )Tj +0.677 0 Td +(F)Tj +0.482 0 Td +(indBugs, )Tj +4.123 0 Td +(Chec)Tj +2.205 0 Td +(kstyle, )Tj +3.122 0 Td +(and )Tj +2.011 0 Td +(its )Tj +1.344 0 Td +(o)Tj +0.544 0 Td +(wn )Tj +1.733 0 Td +(analysis )Tj +3.789 0 Td +(tools. )Tj +2.66 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.455 0 Td +(Sonar )Tj +2.844 0 Td +(plug-in )Tj +3.456 0 Td +(is )Tj +1.066 0 Td +(launc)Tj +2.372 0 Td +(hed )Tj +2.011 0 Td +(with )Tj +2.289 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(mvn sonar:sonar)Tj +/TT0 1 Tf +( command, and the results are presented in a nice looking dashboard.)Tj +1.8 -2.24 Td +(Sonar )Tj +2.893 0 Td +(\(see )Tj +2.115 0 Td +(F)Tj +0.482 0 Td +(igure )Tj +2.615 0 Td +(2\) )Tj +1.282 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(es )Tj +1.337 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.56 0 Td +(feedbac)Tj +3.372 0 Td +(k )Tj +0.948 0 Td +(about )Tj +2.894 0 Td +(the )Tj +1.782 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(all )Tj +1.504 0 Td +(code )Tj +2.56 0 Td +(quality)Tj +2.854 0 Td +(. )Tj +0.726 0 Td +(In )Tj +1.282 0 Td +(the )Tj +1.782 0 Td +(real )Tj +2.059 0 Td +(w)Tj +0.766 0 Td +(orld, )Tj +-40.199 -1.44 Td +(absolute )Tj +3.961 0 Td +(numbers )Tj +4.071 0 Td +(are )Tj +1.681 0 Td +(less )Tj +1.904 0 Td +(interesting )Tj +4.794 0 Td +(than )Tj +2.238 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(all )Tj +1.404 0 Td +(trends )Tj +2.96 0 Td +(and )Tj +1.96 0 Td +(some )Tj +2.626 0 Td +(indicators, )Tj +4.85 0 Td +(for )Tj +1.515 0 Td +(example, )Tj +4.293 0 Td +(cop)Tj +1.594 0 Td +(y )Tj +-41.7 -1.44 Td +(and )Tj +2.036 0 Td +(paste )Tj +2.647 0 Td +(detection. )Tj +4.667 0 Td +(An )Tj +1.647 0 Td +(objecti)Tj +2.928 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.924 0 Td +(indicator )Tj +4.259 0 Td +(of )Tj +1.258 0 Td +(code )Tj +2.536 0 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.924 0 Td +(is )Tj +1.091 0 Td +(the )Tj +1.758 0 Td +(relationship )Tj +5.482 0 Td +(between )Tj +4.092 0 Td +(code )Tj +-40.088 -1.44 Td +(co)Tj +1.044 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.839 0 Td +(and )Tj +1.951 0 Td +(c)Tj +0.476 0 Td +(yclomatic )Tj +4.562 0 Td +(complexity)Tj +4.687 0 Td +(. )Tj +0.617 0 Td +(Sonar )Tj +2.784 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.395 0 Td +(comes )Tj +3.117 0 Td +(with )Tj +2.229 0 Td +(a )Tj +0.839 0 Td +(dedicated )Tj +4.563 0 Td +(\223T)Tj +0.9 0 Td +(op )Tj +1.451 0 Td +(Risks\224 )Tj +2.95 0 Td +(dashboard)Tj +( )Tj +-37.698 -1.44 Td +(with )Tj +2.17 0 Td +(appealing )Tj +4.504 0 Td +(visualization )Tj +5.727 0 Td +(\(see )Tj +1.947 0 Td +(the )Tj +1.614 0 Td +(\223Don't )Tj +3.096 0 Td +(T)Tj +0.456 0 Td +(est )Tj +1.447 0 Td +(Ev)Tj +0.988 0 Td +(erything\224 )Tj +4.225 0 Td +(section\). )Tj +3.893 0 Td +(It )Tj +0.836 0 Td +(is )Tj +0.947 0 Td +(essential )Tj +3.948 0 Td +(to )Tj +1.114 0 Td +(run )Tj +1.725 0 Td +(Sonar )Tj +2.725 0 Td +(in)Tj +( )Tj +-41.366 -1.44 Td +(the )Tj +1.687 0 Td +(main )Tj +2.52 0 Td +(build )Tj +2.577 0 Td +(on )Tj +1.465 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.686 0 Td +(commit. )Tj +3.909 0 Td +(Only )Tj +2.52 0 Td +(then )Tj +2.243 0 Td +(will )Tj +1.965 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.465 0 Td +(get )Tj +1.631 0 Td +(instantaneous )Tj +6.245 0 Td +(feedbac)Tj +3.372 0 Td +(k )Tj +0.853 0 Td +(about )Tj +2.799 0 Td +(the )Tj +1.687 0 Td +(code )Tj +-40.088 -1.44 Td +(quality)Tj +2.854 0 Td +(. )Tj +0.482 0 Td +(T)Tj +0.511 0 Td +(he less code quality is measured, the less interesting it becomes to the\ dev)Tj +31.834 0 Td +(eloper)Tj +2.649 0 Td +(. )Tj +-36.53 -2.24 Td +(After )Tj +2.665 0 Td +(the )Tj +1.943 0 Td +(Sonar )Tj +3.054 0 Td +(execution, )Tj +5.111 0 Td +(the )Tj +1.943 0 Td +(successful )Tj +4.944 0 Td +(build )Tj +2.833 0 Td +(is )Tj +1.276 0 Td +(tagged )Tj +3.443 0 Td +(and )Tj +2.221 0 Td +(could )Tj +3.055 0 Td +(be )Tj +1.665 0 Td +(deplo)Tj +2.434 0 Td +(y)Tj +0.482 0 Td +(ed )Tj +1.665 0 Td +(into )Tj +-40.532 -1.44 Td +(production. )Tj +5.239 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.533 0 Td +(step )Tj +2.033 0 Td +(could )Tj +2.756 0 Td +(also )Tj +2.033 0 Td +(be )Tj +1.366 0 Td +(triggered )Tj +4.088 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.81 0 Td +(a )Tj +0.81 0 Td +(\223post-commit\224 )Tj +6.588 0 Td +(hook, )Tj +2.756 0 Td +(but )Tj +1.7 0 Td +(it )Tj +0.866 0 Td +(isn\222)Tj +1.464 0 Td +(t. )Tj +0.866 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.81 0 Td +(does )Tj +2.311 0 Td +(not )Tj +-40.81 -1.44 Td +(run )Tj +1.974 0 Td +(in )Tj +1.363 0 Td +(a )Tj +1.029 0 Td +(cluster)Tj +2.76 0 Td +(, )Tj +0.807 0 Td +(so )Tj +1.474 0 Td +(I )Tj +0.807 0 Td +(could )Tj +2.975 0 Td +(not )Tj +1.919 0 Td +(implement )Tj +5.141 0 Td +(a )Tj +1.029 0 Td +(rolling-update )Tj +6.587 0 Td +(deplo)Tj +2.434 0 Td +(yment. )Tj +3.474 0 Td +(On )Tj +1.918 0 Td +(a )Tj +1.029 0 Td +(single )Tj +3.03 0 Td +(node, )Tj +-39.754 -1.44 Td +(redeplo)Tj +3.267 0 Td +(yment )Tj +3.102 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.381 0 Td +(be )Tj +1.491 0 Td +(noticeable )Tj +4.937 0 Td +(to )Tj +1.269 0 Td +(the )Tj +1.769 0 Td +(blog )Tj +2.325 0 Td +(visitor)Tj +2.538 0 Td +(, )Tj +0.713 0 Td +(because )Tj +3.936 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.935 0 Td +(w)Tj +0.766 0 Td +(ouldn\222)Tj +2.743 0 Td +(t )Tj +0.713 0 Td +(be )Tj +1.491 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.325 0 Td +(for )Tj +-41.033 -1.44 Td +(about )Tj +2.77 0 Td +(5 )Tj +0.88 0 Td +(seconds. )Tj +3.974 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.38 0 Td +(blog )Tj +2.214 0 Td +(\()Tj +(blog.adam-bien.com)Tj +(\) )Tj +9.827 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.27 0 Td +(still )Tj +1.825 0 Td +(be )Tj +1.38 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable, )Tj +3.492 0 Td +(but )Tj +1.714 0 Td +(the )Tj +1.658 0 Td +(statistics )Tj +3.881 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +-40.254 -1.44 Td +(not. )Tj +2.064 0 Td +(Furthermore, )Tj +5.952 0 Td +(some )Tj +2.674 0 Td +(statistics, )Tj +4.231 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.952 0 Td +(as )Tj +1.285 0 Td +(daily )Tj +2.508 0 Td +(hits, )Tj +2.175 0 Td +(are )Tj +1.729 0 Td +(not )Tj +1.786 0 Td +(persisted, )Tj +4.453 0 Td +(so )Tj +1.341 0 Td +(they )Tj +2.23 0 Td +(get )Tj +1.674 0 Td +(lost )Tj +1.897 0 Td +(on )Tj +1.508 0 Td +(ev)Tj +0.988 0 Td +(ery)Tj +( )Tj +-40.867 -1.44 Td +(redeplo)Tj +3.267 0 Td +(yment. )Tj +3.209 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.561 0 Td +(is )Tj +1.005 0 Td +(the )Tj +1.672 0 Td +(main )Tj +2.505 0 Td +(reason )Tj +3.172 0 Td +(w)Tj +0.76 0 Td +(h)Tj +0.519 0 Td +(y )Tj +0.838 0 Td +(new )Tj +2.172 0 Td +(updates )Tj +3.673 0 Td +(are )Tj +1.671 0 Td +(deli)Tj +1.594 0 Td +(v)Tj +0.488 0 Td +(ered )Tj +2.227 0 Td +(around )Tj +3.395 0 Td +(midnight )Tj +4.173 0 Td +(and )Tj +1.95 0 Td +(they )Tj +-40.366 -1.44 Td +(are triggered b)Tj +6.205 0 Td +(y Hudson automatically)Tj +10.19 0 Td +(. )Tj +-14.595 -2.24 Td +(Executing )Tj +4.478 0 Td +(all )Tj +1.366 0 Td +(parts )Tj +2.366 0 Td +(of )Tj +1.144 0 Td +(a )Tj +0.81 0 Td +(full )Tj +1.7 0 Td +(build )Tj +2.534 0 Td +(in )Tj +1.144 0 Td +(one )Tj +1.922 0 Td +(step )Tj +2.033 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.256 0 Td +(take )Tj +2.088 0 Td +(too )Tj +1.7 0 Td +(long )Tj +2.2 0 Td +(and )Tj +1.922 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.256 0 Td +(not )Tj +1.7 0 Td +(be )Tj +1.366 0 Td +(accepted )Tj +-38.31 -1.44 Td +(b)Tj +0.538 0 Td +(y )Tj +0.974 0 Td +(dev)Tj +1.544 0 Td +(elopers. )Tj +3.864 0 Td +(Instant )Tj +3.309 0 Td +(feedbac)Tj +3.372 0 Td +(k )Tj +0.974 0 Td +(is )Tj +1.141 0 Td +(absolutely )Tj +4.865 0 Td +(necessary )Tj +4.641 0 Td +(for )Tj +1.641 0 Td +(producti)Tj +3.595 0 Td +(vity)Tj +1.464 0 Td +(. )Tj +0.752 0 Td +(Unit )Tj +2.364 0 Td +(tests )Tj +2.308 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.974 0 Td +(to )Tj +1.308 0 Td +(be )Tj +-41.144 -1.44 Td +(executed )Tj +4.309 0 Td +(in )Tj +1.253 0 Td +(seconds, )Tj +4.143 0 Td +(not )Tj +1.809 0 Td +(minutes. )Tj +4.013 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.642 0 Td +(requires )Tj +3.864 0 Td +(a )Tj +0.919 0 Td +(clean )Tj +2.753 0 Td +(separ)Tj +2.266 0 Td +(ation )Tj +2.587 0 Td +(between )Tj +4.087 0 Td +(true )Tj +2.086 0 Td +(unit )Tj +2.087 0 Td +(tests )Tj +2.253 0 Td +(and )Tj +-40.588 -1.44 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.594 0 Td +(tests. )Tj +2.464 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.482 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +2.316 0 Td +(build )Tj +2.65 0 Td +(c)Tj +0.476 0 Td +(ycle )Tj +2.204 0 Td +(has )Tj +1.871 0 Td +(to )Tj +1.26 0 Td +(be )Tj +1.482 0 Td +(separ)Tj +2.266 0 Td +(ated )Tj +2.26 0 Td +(into )Tj +2.094 0 Td +(manageable )Tj +5.649 0 Td +(parts, )Tj +2.76 0 Td +(so )Tj +1.371 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.538 0 Td +(get )Tj +-40.922 -1.44 Td +(feedbac)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 90.72 288.8001 Tm +(k about the execution status of eac)Tj +14.878 0 Td +(h job.)Tj +/TT2 1 Tf +12 0 0 12 57 252.4001 Tm +(Git/Mer)Tj +3.544 0 Td +(curial in the Clouds)Tj +/TT0 1 Tf +10 0 0 10 75 230.0001 Tm +(A )Tj +1.491 0 Td +(d)Tj +0.649 0 Td +(i)Tj +0.371 0 Td +(s)Tj +0.482 0 Td +(t)Tj +0.371 0 Td +(r)Tj +0.426 0 Td +(i)Tj +0.371 0 Td +(b)Tj +0.649 0 Td +(u)Tj +0.649 0 Td +(t)Tj +0.371 0 Td +(e)Tj +0.593 0 Td +(d )Tj +1.38 0 Td +(v)Tj +0.581 0 Td +(e)Tj +0.593 0 Td +(r)Tj +0.426 0 Td +(s)Tj +0.482 0 Td +(i)Tj +0.371 0 Td +(o)Tj +0.649 0 Td +(n )Tj +1.38 0 Td +(c)Tj +0.593 0 Td +(o)Tj +0.649 0 Td +(n)Tj +0.649 0 Td +(t)Tj +0.371 0 Td +(r)Tj +0.426 0 Td +(o)Tj +0.649 0 Td +(l )Tj +1.102 0 Td +(s)Tj +0.482 0 Td +(y)Tj +0.593 0 Td +(s)Tj +0.482 0 Td +(t)Tj +0.371 0 Td +(e)Tj +0.593 0 Td +(m )Tj +1.657 0 Td +(\()Tj +0.371 0 Td +(D)Tj +0.834 0 Td +(V)Tj +0.76 0 Td +(C)Tj +0.76 0 Td +(S)Tj +0.593 0 Td +(\) )Tj +1.102 0 Td +(\()Tj +0.371 0 Td +(h)Tj +0.649 0 Td +(t)Tj +0.371 0 Td +(t)Tj +0.371 0 Td +(p)Tj +0.649 0 Td +(:)Tj +0.371 0 Td +(/)Tj +0.371 0 Td +(/)Tj +0.371 0 Td +(e)Tj +0.593 0 Td +(n)Tj +0.649 0 Td +(.)Tj +0.371 0 Td +(w)Tj +0.871 0 Td +(i)Tj +0.371 0 Td +(k)Tj +0.593 0 Td +(i)Tj +0.371 0 Td +(p)Tj +0.649 0 Td +(e)Tj +0.593 0 Td +(d)Tj +0.649 0 Td +(i)Tj +0.371 0 Td +(a)Tj +0.593 0 Td +(.)Tj +0.371 0 Td +(o)Tj +0.649 0 Td +(r)Tj +0.426 0 Td +(g)Tj +0.593 0 Td +(/)Tj +0.371 0 Td +(w)Tj +0.871 0 Td +(i)Tj +0.371 0 Td +(k)Tj +0.593 0 Td +(i)Tj +0.371 0 Td +(/)Tj +-41.922 -1.44 Td +(Distributed_revision_control)Tj +(\), suc)Tj +14.488 0 Td +(h as Mer)Tj +3.711 0 Td +(curial \()Tj +(http://mer)Tj +7.157 0 Td +(curial.selenic.com/)Tj +(\) or Git )Tj +-25.356 -1.44 Td +(\()Tj +(http://git-scm.com/)Tj +(\), )Tj +9.501 0 Td +(initiates )Tj +3.944 0 Td +(the )Tj +1.943 0 Td +(CI )Tj +1.554 0 Td +(process )Tj +3.832 0 Td +(with )Tj +2.499 0 Td +(the )Tj +1.943 0 Td +(push )Tj +2.666 0 Td +(command. )Tj +5.147 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.665 0 Td +(push )Tj +2.666 0 Td +(command )Tj +-37.866 -1.44 Td +(sync)Tj +1.927 0 Td +(hronizes all recent c)Tj +8.707 0 Td +(hanges with a remote \(sometimes \223master\224\) repository)Tj +23.079 0 Td +(. )Tj +-31.913 -2.24 Td +(A )Tj +1 0 Td +(CI )Tj +1.278 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.166 0 Td +(listens )Tj +3.001 0 Td +(to )Tj +1.167 0 Td +(the )Tj +1.667 0 Td +(c)Tj +0.482 0 Td +(hanges )Tj +3.334 0 Td +(and )Tj +1.945 0 Td +(performs )Tj +4.111 0 Td +(a )Tj +0.833 0 Td +(build )Tj +2.557 0 Td +(c)Tj +0.476 0 Td +(ycle )Tj +2.111 0 Td +(initiated )Tj +3.835 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.833 0 Td +(a )Tj +0.833 0 Td +(\223push.)Tj +2.724 0 Td +(\224 )Tj +0.74 0 Td +(A )Tj +1 0 Td +(push )Tj +2.39 0 Td +(is)Tj +( )Tj +-41.533 -1.44 Td +(usually )Tj +3.587 0 Td +(performed )Tj +4.975 0 Td +(after )Tj +2.419 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.308 0 Td +(tests )Tj +2.364 0 Td +(and )Tj +2.142 0 Td +(commits )Tj +4.197 0 Td +(to )Tj +1.364 0 Td +(a )Tj +1.03 0 Td +(local )Tj +2.642 0 Td +(repository)Tj +4.187 0 Td +(. )Tj +0.734 0 Td +(T)Tj +0.511 0 Td +(his )Tj +1.753 0 Td +(is )Tj +1.197 0 Td +(a )Tj +1.03 0 Td +(substantial )Tj +-37.642 -1.44 Td +(difference )Tj +4.576 0 Td +(from )Tj +2.297 0 Td +(SVN, )Tj +2.52 0 Td +(CVS, )Tj +2.409 0 Td +(and )Tj +1.909 0 Td +(other )Tj +2.52 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.075 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.297 0 Td +(code )Tj +2.409 0 Td +(repository )Tj +4.576 0 Td +(tools )Tj +2.354 0 Td +(\()Tj +(http://en.wikipedia.org/)Tj +-31.917 -1.44 Td +(wiki/Revision_control)Tj +(\). )Tj +10.452 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.708 0 Td +(SVN, )Tj +2.819 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.929 0 Td +(commit )Tj +3.874 0 Td +(initiates )Tj +3.931 0 Td +(a )Tj +1.096 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.374 0 Td +(build; )Tj +3.098 0 Td +(the )Tj +1.93 0 Td +(gr)Tj +0.821 0 Td +(anularity )Tj +4.375 0 Td +(is )Tj +-41.533 -1.44 Td +(substantially )Tj +/C2_0 1 Tf +5.749 0 Td +<005D>Tj +/TT0 1 Tf +(ner)Tj +1.871 0 Td +(. )Tj +0.691 0 Td +(Natur)Tj +2.433 0 Td +(ally)Tj +1.464 0 Td +(, )Tj +0.691 0 Td +(the )Tj +1.747 0 Td +(quality )Tj +3.359 0 Td +(of )Tj +1.247 0 Td +(push )Tj +2.47 0 Td +(content )Tj +3.637 0 Td +(is )Tj +1.08 0 Td +(usually )Tj +3.47 0 Td +(higher )Tj +3.136 0 Td +(than )Tj +2.303 0 Td +(the )Tj +1.747 0 Td +(quality )Tj +3.359 0 Td +(of )Tj +1.247 0 Td +(a )Tj +-41.7 -1.44 Td +(single commit. )Tj +6.576 0 Td +(Also, more \223meat\224 is included in a push compared to a commit. )Tj +ET + +endstream +endobj +353 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 354 0 R>>endobj +354 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(149)Tj +0 Tc 0 Tw -18.332 57.06 Td +(T)Tj +0.511 0 Td +(his )Tj +1.587 0 Td +(makes )Tj +3.086 0 Td +(a )Tj +0.864 0 Td +(D)Tj +0.741 0 Td +(VCS )Tj +2.198 0 Td +(system )Tj +3.253 0 Td +(interesting )Tj +4.81 0 Td +(for )Tj +1.531 0 Td +(pushing )Tj +3.755 0 Td +(c)Tj +0.482 0 Td +(hanges )Tj +3.365 0 Td +(to )Tj +1.198 0 Td +(a )Tj +0.864 0 Td +(remote )Tj +3.364 0 Td +(location, )Tj +4.144 0 Td +(initiating )Tj +4.144 0 Td +(a )Tj +-41.7 -1.44 Td +(remote )Tj +3.316 0 Td +(build, )Tj +2.818 0 Td +(and )Tj +1.928 0 Td +(deplo)Tj +2.434 0 Td +(ying )Tj +2.15 0 Td +(the )Tj +1.65 0 Td +(application. )Tj +5.393 0 Td +(A )Tj +0.983 0 Td +(push )Tj +2.373 0 Td +(is )Tj +0.983 0 Td +(not )Tj +1.706 0 Td +(limited )Tj +3.317 0 Td +(to )Tj +1.15 0 Td +(a )Tj +0.816 0 Td +(single )Tj +2.817 0 Td +(location. )Tj +4.004 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.428 0 Td +(could )Tj +-39.754 -1.44 Td +(push )Tj +2.464 0 Td +(to )Tj +1.241 0 Td +(multiple )Tj +3.964 0 Td +(serv)Tj +1.71 0 Td +(ers )Tj +1.629 0 Td +(simultaneously)Tj +6.355 0 Td +(, )Tj +0.685 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.963 0 Td +(makes )Tj +3.129 0 Td +(D)Tj +0.741 0 Td +(VCS )Tj +2.241 0 Td +(systems )Tj +3.685 0 Td +(particularly )Tj +5.297 0 Td +(interesting )Tj +4.853 0 Td +(for)Tj +( )Tj +-41.033 -1.44 Td +(cloud )Tj +2.875 0 Td +(deplo)Tj +2.434 0 Td +(yment. )Tj +3.374 0 Td +(Instead )Tj +3.486 0 Td +(of )Tj +1.263 0 Td +(pac)Tj +1.538 0 Td +(kaging )Tj +3.263 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.874 0 Td +(application )Tj +5.265 0 Td +(locally )Tj +3.319 0 Td +(and )Tj +2.041 0 Td +(cop)Tj +1.594 0 Td +(ying )Tj +2.263 0 Td +(the )Tj +1.763 0 Td +(result )Tj +2.763 0 Td +(to )Tj +1.263 0 Td +(the )Tj +-40.866 -1.44 Td +(\223cloud,)Tj +3.113 0 Td +(\224 )Tj +0.763 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.431 0 Td +(could )Tj +2.765 0 Td +(just )Tj +1.82 0 Td +(push )Tj +2.376 0 Td +(the )Tj +1.653 0 Td +(code )Tj +2.431 0 Td +(and )Tj +1.931 0 Td +(initiate )Tj +3.265 0 Td +(a )Tj +0.819 0 Td +(remote )Tj +3.319 0 Td +(build. )Tj +2.821 0 Td +(In )Tj +1.153 0 Td +(a )Tj +0.819 0 Td +(multistage )Tj +4.709 0 Td +(en)Tj +1.044 0 Td +(vironment, )Tj +4.987 0 Td +(a )Tj +-41.7 -1.44 Td +(successful )Tj +5.004 0 Td +(local )Tj +2.781 0 Td +(build )Tj +2.893 0 Td +(could )Tj +3.115 0 Td +(initiate )Tj +3.615 0 Td +(a )Tj +1.169 0 Td +(cloud )Tj +3.115 0 Td +(push )Tj +2.726 0 Td +(and, )Tj +2.559 0 Td +(thus, )Tj +2.726 0 Td +(a )Tj +1.169 0 Td +(decentr)Tj +3.211 0 Td +(alized )Tj +3.281 0 Td +(application )Tj +-37.364 -1.44 Td +(deplo)Tj +2.434 0 Td +(yment.)Tj +/TT1 1 Tf +12 0 0 12 57 506.8 Tm +(...In the Real )Tj +5.798 0 Td +(W)Tj +0.963 0 Td +(orld)Tj +/TT0 1 Tf +10 0 0 10 75 484.4 Tm +(I )Tj +0.723 0 Td +(did )Tj +1.835 0 Td +(not )Tj +1.835 0 Td +(use )Tj +1.89 0 Td +(the )Tj +1.779 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.501 0 Td +(deplo)Tj +2.434 0 Td +(y )Tj +0.945 0 Td +(phase )Tj +2.946 0 Td +(\(mvn )Tj +2.612 0 Td +(deplo)Tj +2.434 0 Td +(y\) )Tj +1.223 0 Td +(in )Tj +1.279 0 Td +(the )Tj +1.779 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.945 0 Td +(case. )Tj +2.52 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.557 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.391 0 Td +(usually)Tj +( )Tj +-39.143 -1.44 Td +(upload )Tj +3.342 0 Td +(the )Tj +1.674 0 Td +(result )Tj +2.674 0 Td +(of )Tj +1.174 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.785 0 Td +(build )Tj +2.564 0 Td +(into )Tj +2.008 0 Td +(a )Tj +0.84 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.118 0 Td +(location )Tj +3.842 0 Td +(and )Tj +1.952 0 Td +(make )Tj +2.673 0 Td +(it )Tj +0.896 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailable )Tj +3.23 0 Td +(to )Tj +1.174 0 Td +(other )Tj +2.563 0 Td +(project. )Tj +3.545 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(\223centr)Tj +2.599 0 Td +(al )Tj +1.272 0 Td +(location\224 )Tj +4.44 0 Td +(is )Tj +1.161 0 Td +(a )Tj +0.994 0 Td +(repository )Tj +4.773 0 Td +(manager)Tj +3.648 0 Td +(, )Tj +0.772 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.05 0 Td +(as )Tj +1.346 0 Td +(Ar)Tj +0.988 0 Td +(c)Tj +0.482 0 Td +(hi)Tj +0.816 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.994 0 Td +(\()Tj +(http://ar)Tj +3.601 0 Td +(c)Tj +0.482 0 Td +(hi)Tj +0.816 0 Td +(v)Tj +0.476 0 Td +(a.apac)Tj +2.816 0 Td +(he.org/)Tj +(\), )Tj +4.051 0 Td +(Nexus)Tj +( )Tj +-39.477 -1.44 Td +(\()Tj +(http://nexus.sonatype.org/)Tj +(\), )Tj +12.334 0 Td +(or )Tj +1.291 0 Td +(Artifactory )Tj +4.94 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.jfrog.com/)Tj +(\), )Tj +5.663 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.995 0 Td +(acts )Tj +2.106 0 Td +(as )Tj +1.328 0 Td +(a )Tj +0.939 0 Td +(proxy )Tj +2.884 0 Td +(to )Tj +1.273 0 Td +(the )Tj +-40.866 -1.44 Td +(public )Tj +3.068 0 Td +(Ma)Tj +1.359 0 Td +(v)Tj +0.488 0 Td +(en )Tj +1.4 0 Td +(repository)Tj +4.187 0 Td +(. )Tj +0.585 0 Td +(A )Tj +1.011 0 Td +(repository )Tj +4.623 0 Td +(manager )Tj +4.066 0 Td +(is )Tj +1.011 0 Td +(used )Tj +2.345 0 Td +(in )Tj +1.178 0 Td +(bigger )Tj +3.011 0 Td +(companies )Tj +5.012 0 Td +(as )Tj +1.233 0 Td +(a )Tj +0.844 0 Td +(communication )Tj +-35.42 -1.44 Td +(hub )Tj +2.028 0 Td +(between )Tj +4.028 0 Td +(projects. )Tj +3.991 0 Td +(W)Tj +0.982 0 Td +(ithout )Tj +2.862 0 Td +(a )Tj +0.86 0 Td +(repository )Tj +4.639 0 Td +(manager)Tj +3.648 0 Td +(, )Tj +0.638 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.472 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.306 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.86 0 Td +(to )Tj +1.194 0 Td +(c)Tj +0.482 0 Td +(hec)Tj +1.538 0 Td +(k )Tj +0.86 0 Td +(out )Tj +1.75 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.36 0 Td +(code )Tj +-40.088 -1.44 Td +(for the w)Tj +3.817 0 Td +(hole project and build ev)Tj +10.827 0 Td +(erything from scr)Tj +7.267 0 Td +(atc)Tj +1.26 0 Td +(h.)Tj +-21.371 -2.24 Td +(Also)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.595 0 Td +(there )Tj +2.622 0 Td +(is )Tj +1.122 0 Td +(lot )Tj +1.567 0 Td +(more )Tj +2.677 0 Td +(to )Tj +1.289 0 Td +(automate )Tj +4.456 0 Td +(than )Tj +2.345 0 Td +(w)Tj +0.76 0 Td +(hat )Tj +1.789 0 Td +(is )Tj +1.122 0 Td +(described )Tj +4.623 0 Td +(here. )Tj +2.585 0 Td +(W)Tj +0.963 0 Td +(e )Tj +0.955 0 Td +(just )Tj +1.956 0 Td +(started )Tj +3.289 0 Td +(with )Tj +2.345 0 Td +(the )Tj +-40.866 -1.44 Td +(implementation )Tj +7.1 0 Td +(of )Tj +1.154 0 Td +(the )Tj +1.654 0 Td +(DevOps )Tj +3.876 0 Td +(idea. )Tj +2.34 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.432 0 Td +(could )Tj +2.766 0 Td +(create )Tj +2.931 0 Td +(and )Tj +1.932 0 Td +(deplo)Tj +2.434 0 Td +(y )Tj +0.82 0 Td +(not )Tj +1.71 0 Td +(only )Tj +2.21 0 Td +(the )Tj +1.654 0 Td +(application )Tj +5.156 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +-41.367 -1.44 Td +(with )Tj +2.316 0 Td +(the )Tj +1.76 0 Td +(installed )Tj +4.039 0 Td +(application, )Tj +5.54 0 Td +(but )Tj +1.816 0 Td +(also )Tj +2.149 0 Td +(the )Tj +1.76 0 Td +(oper)Tj +1.933 0 Td +(ating )Tj +2.538 0 Td +(systems, )Tj +3.982 0 Td +(virtual )Tj +3.149 0 Td +(mac)Tj +1.815 0 Td +(hines)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.955 0 Td +(and )Tj +2.038 0 Td +(the )Tj +1.76 0 Td +(w)Tj +0.76 0 Td +(hole )Tj +-40.31 -1.44 Td +(infr)Tj +1.433 0 Td +(astructure)Tj +/TT2 1 Tf +(,)Tj +/C2_0 1 Tf +<0001003E0047004A0001003D00500039004500480044003D00090001005D>Tj +/TT0 1 Tf +(rew)Tj +12.568 0 Td +(alls and other resour)Tj +8.769 0 Td +(ces. )Tj +1.871 0 Td +(T)Tj +0.456 0 Td +(ools suc)Tj +3.484 0 Td +(h as Puppet )Tj +-28.581 -1.44 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.puppetlabs.com/)Tj +(\) )Tj +8.301 0 Td +(or )Tj +1.464 0 Td +(Chef )Tj +2.576 0 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.opscode.com/c)Tj +6.818 0 Td +(hef/)Tj +(\) )Tj +2.465 0 Td +(allo)Tj +1.6 0 Td +(w )Tj +1.353 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.687 0 Td +(to )Tj +1.409 0 Td +(keep )Tj +2.631 0 Td +(the )Tj +-40.866 -1.44 Td +(serv)Tj +1.71 0 Td +(er )Tj +/C2_0 1 Tf +1.173 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.508 0 Td +(sync)Tj +1.927 0 Td +(hronized )Tj +4.175 0 Td +(with )Tj +2.23 0 Td +(a )Tj +0.84 0 Td +(centr)Tj +2.155 0 Td +(al )Tj +1.118 0 Td +(master)Tj +2.759 0 Td +(. )Tj +0.618 0 Td +(In )Tj +1.174 0 Td +(the )Tj +1.674 0 Td +(real )Tj +1.951 0 Td +(w)Tj +0.766 0 Td +(orld)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.313 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.452 0 Td +(should )Tj +3.231 0 Td +(be )Tj +1.396 0 Td +(able )Tj +2.174 0 Td +(to )Tj +-41.366 -1.44 Td +(build the w)Tj +4.874 0 Td +(hole system from bare metal to running application without manual interv\ )Tj +31.778 0 Td +(ention.)Tj +ET + +endstream +endobj +355 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 356 0 R>>endobj +356 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(150)Tj +ET + +endstream +endobj +357 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 359 0 R>>endobj +358 0 obj<>endobj +359 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(151)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +(J)Tj +0.321 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE Lo)Tj +3.1 0 Td +(v)Tj +0.488 0 Td +(es Stress and Laughs )Tj +9.077 0 Td +(About JUnit)Tj +64 0 0 64 443.416 539.8 Tm +(7)Tj +/TT0 1 Tf +10 0 0 10 75 461.4 Tm +(Unit )Tj +2.237 0 Td +(tests )Tj +2.181 0 Td +(are )Tj +1.68 0 Td +(absolutely )Tj +4.738 0 Td +(necessary )Tj +4.514 0 Td +(to )Tj +1.181 0 Td +(v)Tj +0.476 0 Td +(alidate )Tj +3.237 0 Td +(the )Tj +1.681 0 Td +(functionality )Tj +5.739 0 Td +(of )Tj +1.181 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.792 0 Td +(business )Tj +3.96 0 Td +(logic. )Tj +2.7 0 Td +(At )Tj +1.292 0 Td +(the )Tj +-40.866 -1.44 Td +(same )Tj +2.604 0 Td +(time, )Tj +2.549 0 Td +(the )Tj +1.716 0 Td +(necessary )Tj +4.549 0 Td +(surrounding )Tj +5.551 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.605 0 Td +(makes )Tj +3.104 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.827 0 Td +(life )Tj +1.716 0 Td +(harder )Tj +3.16 0 Td +(and )Tj +1.994 0 Td +(slo)Tj +1.211 0 Td +(ws )Tj +1.549 0 Td +(do)Tj +1.1 0 Td +(wn )Tj +1.716 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(execution )Tj +4.614 0 Td +(time, )Tj +2.557 0 Td +(so )Tj +1.335 0 Td +(it )Tj +0.946 0 Td +(is )Tj +1.057 0 Td +(a )Tj +0.89 0 Td +(good )Tj +2.558 0 Td +(idea )Tj +2.224 0 Td +(to )Tj +1.224 0 Td +(moc)Tj +1.871 0 Td +(k )Tj +0.89 0 Td +(out )Tj +1.78 0 Td +(the )Tj +1.724 0 Td +(incon)Tj +2.434 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.058 0 Td +(infr)Tj +1.433 0 Td +(astructure. )Tj +4.891 0 Td +(In )Tj +1.224 0 Td +(production, )Tj +-37.197 -1.44 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, y)Tj +1.038 0 Td +(our code will be executed against the real infr)Tj +19.718 0 Td +(astructure. )Tj +-22.581 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.439 0 Td +(correct )Tj +3.383 0 Td +(inter)Tj +1.933 0 Td +(action )Tj +3.051 0 Td +(among )Tj +3.328 0 Td +(all )Tj +1.439 0 Td +(components )Tj +5.663 0 Td +(is )Tj +1.05 0 Td +(v)Tj +0.476 0 Td +(alidated )Tj +3.829 0 Td +(during )Tj +3.162 0 Td +(local )Tj +2.495 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.551 0 Td +(tests )Tj +2.217 0 Td +(\(for )Tj +-40.755 -1.44 Td +(example, )Tj +4.528 0 Td +(with )Tj +2.436 0 Td +(Arquillian\) )Tj +5.141 0 Td +(and )Tj +2.195 0 Td +(remote )Tj +3.583 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.751 0 Td +(tests. )Tj +2.695 0 Td +(Remote )Tj +3.861 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.751 0 Td +(tests )Tj +2.417 0 Td +(are )Tj +1.916 0 Td +(usually )Tj +-39.143 -1.44 Td +(performed )Tj +4.867 0 Td +(in )Tj +1.256 0 Td +(an )Tj +1.478 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.59 0 Td +(en)Tj +1.044 0 Td +(vironment. )Tj +5.09 0 Td +(Unit )Tj +2.312 0 Td +(tests )Tj +2.256 0 Td +(fr)Tj +0.599 0 Td +(amew)Tj +2.599 0 Td +(orks)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.45 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.978 0 Td +(as )Tj +1.311 0 Td +(JUnit )Tj +2.59 0 Td +(\()Tj +(http://junit.org)Tj +(\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-35.279 -1.44 Td +(are )Tj +1.777 0 Td +(often )Tj +2.612 0 Td +(\223misused\224 )Tj +4.833 0 Td +(in )Tj +1.278 0 Td +(a )Tj +0.944 0 Td +(good )Tj +2.612 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.944 0 Td +(for )Tj +1.611 0 Td +(the )Tj +1.778 0 Td +(implementation )Tj +7.224 0 Td +(of )Tj +1.278 0 Td +(a )Tj +0.944 0 Td +(test )Tj +1.889 0 Td +(dri)Tj +1.149 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.685 0 Td +(A )Tj +1.111 0 Td +(unit )Tj +2.112 0 Td +(test )Tj +1.889 0 Td +(usually)Tj +( )Tj +-39.143 -1.44 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(okes the real \(REST\) service and v)Tj +14.369 0 Td +(alidates the result against the expected assumptions.)Tj +-13.873 -2.24 Td +(Although )Tj +4.316 0 Td +(applications )Tj +5.594 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.258 0 Td +(run )Tj +1.814 0 Td +(concurrently )Tj +5.815 0 Td +(in )Tj +1.203 0 Td +(production, )Tj +5.372 0 Td +(unit )Tj +2.037 0 Td +(tests )Tj +2.203 0 Td +(and )Tj +1.981 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.537 0 Td +(tests )Tj +-40.366 -1.44 Td +(are )Tj +1.699 0 Td +(executed )Tj +4.256 0 Td +(in )Tj +1.2 0 Td +(a )Tj +0.866 0 Td +(single )Tj +2.867 0 Td +(thread )Tj +3.089 0 Td +(sequentially)Tj +5.077 0 Td +(. )Tj +0.644 0 Td +(Contention, )Tj +5.425 0 Td +(tr)Tj +0.599 0 Td +(ansaction )Tj +4.479 0 Td +(isolation, )Tj +4.313 0 Td +(cac)Tj +1.482 0 Td +(hing )Tj +2.256 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(, )Tj +-41.922 -1.44 Td +(memory )Tj +4.016 0 Td +(consumption, )Tj +6.353 0 Td +(consistenc)Tj +4.478 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.739 0 Td +(performance)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.156 0 Td +(and )Tj +2.073 0 Td +(robustness )Tj +4.963 0 Td +(aspects)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.823 0 Td +(in )Tj +1.295 0 Td +(particular)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.823 0 Td +(can )Tj +2.017 0 Td +(be )Tj +-41.144 -1.44 Td +(viably )Tj +2.918 0 Td +(tested )Tj +2.807 0 Td +(only )Tj +2.196 0 Td +(under )Tj +2.807 0 Td +(massi)Tj +2.371 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.806 0 Td +(concurrenc)Tj +4.866 0 Td +(y)Tj +0.408 0 Td +(. )Tj +0.51 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.362 0 Td +(earlier )Tj +3.028 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.418 0 Td +(test )Tj +1.751 0 Td +(the )Tj +1.64 0 Td +(concurrenc)Tj +4.866 0 Td +(y)Tj +0.408 0 Td +(, )Tj +0.584 0 Td +(the )Tj +1.64 0 Td +(easier )Tj +2.806 0 Td +(it )Tj +0.862 0 Td +(is )Tj +/C2_0 1 Tf +-41.533 -1.44 Td +<004C00470001005D>Tj +/TT0 1 Tf +(x the bugs.)Tj +/TT1 1 Tf +12 0 0 12 57 221.8001 Tm +(Stress \(T)Tj +3.567 0 Td +(est\) Kills Slo)Tj +5.267 0 Td +(wly)Tj +/TT0 1 Tf +10 0 0 10 75 199.4001 Tm +(Stress )Tj +2.764 0 Td +(tests )Tj +2.209 0 Td +(are )Tj +1.708 0 Td +(fun. )Tj +2.006 0 Td +(And )Tj +2.154 0 Td +(there )Tj +2.542 0 Td +(is )Tj +1.042 0 Td +(only )Tj +2.265 0 Td +(one )Tj +1.987 0 Td +(mission: )Tj +3.932 0 Td +(\223Kill )Tj +2.264 0 Td +(My )Tj +1.764 0 Td +(Serv)Tj +1.821 0 Td +(er)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +(\224 )Tj +1.828 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.431 0 Td +(more )Tj +2.597 0 Td +(load )Tj +2.265 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.487 0 Td +(are )Tj +-40.867 -1.44 Td +(able to gener)Tj +5.601 0 Td +(ate to \223kill the serv)Tj +8.046 0 Td +(er)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +(\224 the better)Tj +5.788 0 Td +(. )Tj +-17.635 -2.24 Td +(Stress )Tj +2.835 0 Td +(tests )Tj +2.28 0 Td +(are )Tj +1.779 0 Td +(great )Tj +2.557 0 Td +(for )Tj +1.613 0 Td +(learning )Tj +3.947 0 Td +(about )Tj +2.892 0 Td +(the )Tj +1.78 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.113 0 Td +(of )Tj +1.28 0 Td +(an )Tj +1.502 0 Td +(application )Tj +5.282 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.279 0 Td +(under )Tj +2.947 0 Td +(hea)Tj +1.526 0 Td +(vy )Tj +-41.2 -1.44 Td +(load. )Tj +2.484 0 Td +(Memory )Tj +3.927 0 Td +(consumption, )Tj +6.208 0 Td +(the )Tj +1.65 0 Td +(typical )Tj +3.206 0 Td +(number )Tj +3.65 0 Td +(of )Tj +1.15 0 Td +(w)Tj +0.766 0 Td +(orker )Tj +2.538 0 Td +(threads, )Tj +3.706 0 Td +(the )Tj +1.65 0 Td +(usual )Tj +2.595 0 Td +(depth )Tj +2.762 0 Td +(of )Tj +1.15 0 Td +(the )Tj +1.65 0 Td +(request )Tj +-39.088 -1.44 Td +(queue, )Tj +3.251 0 Td +(the )Tj +1.639 0 Td +(number )Tj +3.639 0 Td +(of )Tj +1.139 0 Td +(rolled )Tj +2.806 0 Td +(bac)Tj +1.538 0 Td +(k )Tj +0.805 0 Td +(tr)Tj +0.599 0 Td +(ansactions, )Tj +5.085 0 Td +(the )Tj +1.639 0 Td +(number )Tj +3.639 0 Td +(of )Tj +1.139 0 Td +(requests )Tj +3.806 0 Td +(per )Tj +1.694 0 Td +(second)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.612 0 Td +(or )Tj +1.194 0 Td +(the )Tj +1.639 0 Td +(number )Tj +-38.866 -1.44 Td +(and )Tj +2.272 0 Td +(length )Tj +3.328 0 Td +(of )Tj +1.494 0 Td +(major )Tj +3.16 0 Td +(garbage )Tj +4.049 0 Td +(collections )Tj +5.329 0 Td +(are )Tj +1.993 0 Td +(only )Tj +2.55 0 Td +(a )Tj +1.16 0 Td +(few )Tj +2.216 0 Td +(examples )Tj +4.716 0 Td +(of )Tj +1.494 0 Td +(interesting )Tj +5.106 0 Td +(runtime )Tj +-38.866 -1.44 Td +(par)Tj +1.377 0 Td +(ameters. )Tj +0.423 -2.24 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.623 0 Td +(should )Tj +3.402 0 Td +(test )Tj +1.956 0 Td +(under )Tj +3.012 0 Td +(hea)Tj +1.526 0 Td +(vy )Tj +1.511 0 Td +(load )Tj +2.401 0 Td +(not )Tj +1.901 0 Td +(only )Tj +2.401 0 Td +(the )Tj +1.845 0 Td +(application )Tj +5.347 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +1.344 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(, )Tj +0.789 0 Td +(but )Tj +1.901 0 Td +(also )Tj +2.234 0 Td +(the )Tj +ET + +endstream +endobj +360 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 361 0 R>>endobj +361 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(152)Tj +0 Tc 0 Tw -20.132 57.06 Td +(implementation )Tj +7.205 0 Td +(of )Tj +1.259 0 Td +(y)Tj +0.482 0 Td +(our )Tj +1.87 0 Td +(application. )Tj +5.539 0 Td +(Memory )Tj +4.036 0 Td +(leaks, )Tj +2.87 0 Td +(contention )Tj +5.039 0 Td +(points, )Tj +3.316 0 Td +(bottlenec)Tj +3.984 0 Td +(ks, )Tj +1.592 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.092 0 Td +(of )Tj +-41.366 -1.44 Td +(custom )Tj +3.698 0 Td +(cac)Tj +1.482 0 Td +(hes, )Tj +2.309 0 Td +(memory )Tj +4.141 0 Td +(consumption)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.45 0 Td +(and )Tj +2.198 0 Td +(the )Tj +1.92 0 Td +(frequenc)Tj +3.755 0 Td +(y )Tj +1.086 0 Td +(of )Tj +1.42 0 Td +(optimistic )Tj +4.81 0 Td +(loc)Tj +1.316 0 Td +(k )Tj +1.086 0 Td +(exceptions )Tj +5.199 0 Td +(are )Tj +-40.867 -1.44 Td +(important to identify as early as possible.)Tj +1.8 -2.24 Td +(In )Tj +1.141 0 Td +(the )Tj +/C2_0 1 Tf +1.641 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.863 0 Td +(iter)Tj +1.377 0 Td +(ation)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.725 0 Td +(it )Tj +0.863 0 Td +(is )Tj +0.974 0 Td +(usually )Tj +/C2_0 1 Tf +3.364 0 Td +<003C0041003E005D>Tj +/TT0 1 Tf +(cult )Tj +3.587 0 Td +(to )Tj +1.141 0 Td +(pass )Tj +2.141 0 Td +(the )Tj +1.641 0 Td +(test. )Tj +1.938 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.419 0 Td +(will )Tj +1.919 0 Td +(be )Tj +1.363 0 Td +(confronted )Tj +4.976 0 Td +(with )Tj +2.197 0 Td +(all )Tj +1.363 0 Td +(kinds )Tj +-39.921 -1.44 Td +(of )Tj +1.183 0 Td +(small )Tj +/C2_0 1 Tf +2.627 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.517 0 Td +(and )Tj +1.961 0 Td +(implementation )Tj +7.129 0 Td +(c)Tj +0.482 0 Td +(hallenges. )Tj +4.684 0 Td +(It )Tj +0.905 0 Td +(is )Tj +1.016 0 Td +(v)Tj +0.488 0 Td +(ery )Tj +1.682 0 Td +(typical )Tj +3.239 0 Td +(to )Tj +/C2_0 1 Tf +1.183 0 Td +<005D>Tj +/TT0 1 Tf +(nd )Tj +2.017 0 Td +(application, )Tj +5.463 0 Td +(JVM)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-40.116 -1.44 Td +(and )Tj +1.938 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.382 0 Td +(oper)Tj +1.933 0 Td +(ating )Tj +2.438 0 Td +(system )Tj +3.215 0 Td +(bugs )Tj +2.327 0 Td +(during )Tj +3.105 0 Td +(stress )Tj +2.604 0 Td +(tests. )Tj +2.364 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.382 0 Td +(earlier )Tj +3.048 0 Td +(in )Tj +1.16 0 Td +(the )Tj +1.66 0 Td +(softw)Tj +2.261 0 Td +(are )Tj +1.659 0 Td +(lifec)Tj +1.81 0 Td +(ycle )Tj +2.104 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.882 0 Td +(bugs)Tj +( )Tj +-40.199 -1.44 Td +(appear)Tj +/C2_0 1 Tf +2.871 0 Td +<00090001004C0040003D0001003D0039004B0041003D004A00010041004C00010041004B0001004C00470001005D>Tj +/TT0 1 Tf +(x them. )Tj +-1.071 -2.24 Td +(Unfortunately)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +6.609 0 Td +(in )Tj +1.246 0 Td +(most )Tj +2.468 0 Td +(projects, )Tj +4.08 0 Td +(load )Tj +2.302 0 Td +(and )Tj +2.024 0 Td +(stress )Tj +2.69 0 Td +(tests )Tj +2.246 0 Td +(are )Tj +1.745 0 Td +(still )Tj +1.913 0 Td +(considered )Tj +5.136 0 Td +(a )Tj +0.912 0 Td +(\223necessary )Tj +5.023 0 Td +(evil\224 )Tj +-40.2 -1.44 Td +(and )Tj +1.946 0 Td +(they )Tj +2.168 0 Td +(are )Tj +1.667 0 Td +(postponed )Tj +4.837 0 Td +(to )Tj +1.168 0 Td +(the )Tj +1.668 0 Td +(latest )Tj +2.557 0 Td +(possible )Tj +3.836 0 Td +(stage. )Tj +2.779 0 Td +(Most )Tj +2.446 0 Td +(of )Tj +1.168 0 Td +(the )Tj +1.668 0 Td +(stress )Tj +2.612 0 Td +(tests )Tj +2.168 0 Td +(happen )Tj +3.558 0 Td +(shortly )Tj +3.224 0 Td +(before )Tj +-39.477 -1.44 Td +(going )Tj +2.739 0 Td +(li)Tj +0.538 0 Td +(v)Tj +0.488 0 Td +(e, )Tj +1.127 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.905 0 Td +(makes )Tj +3.071 0 Td +(them )Tj +2.516 0 Td +(useless. )Tj +3.628 0 Td +(Stress )Tj +2.738 0 Td +(testing )Tj +3.128 0 Td +(that )Tj +1.961 0 Td +(is )Tj +1.016 0 Td +(done )Tj +2.517 0 Td +(so )Tj +1.294 0 Td +(late )Tj +1.905 0 Td +(is )Tj +1.016 0 Td +(performed )Tj +4.794 0 Td +(under )Tj +2.85 0 Td +(time )Tj +-40.311 -1.44 Td +(constr)Tj +2.6 0 Td +(aints )Tj +2.453 0 Td +(and )Tj +2.064 0 Td +(there )Tj +2.619 0 Td +(is )Tj +1.119 0 Td +(pressure )Tj +4.008 0 Td +(to )Tj +1.286 0 Td +("pass)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +(" )Tj +3.202 0 Td +(because )Tj +3.953 0 Td +(there )Tj +2.619 0 Td +(is )Tj +1.119 0 Td +(no )Tj +1.564 0 Td +(time )Tj +2.341 0 Td +(left )Tj +1.786 0 Td +(to )Tj +/C2_0 1 Tf +1.286 0 Td +<005D>Tj +/TT0 1 Tf +(x )Tj +1.508 0 Td +(possible )Tj +3.954 0 Td +(errors. )Tj +-39.478 -1.44 Td +(Under )Tj +3.071 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.904 0 Td +(cir)Tj +1.099 0 Td +(cumstances)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.599 0 Td +(the )Tj +1.682 0 Td +(success )Tj +3.571 0 Td +(of )Tj +1.182 0 Td +(the )Tj +1.682 0 Td +(load )Tj +2.238 0 Td +(test )Tj +1.793 0 Td +(is )Tj +1.015 0 Td +(more )Tj +2.57 0 Td +(important )Tj +4.516 0 Td +(than )Tj +2.238 0 Td +(correctly )Tj +4.126 0 Td +(w)Tj +0.766 0 Td +(orking )Tj +-39.477 -1.44 Td +(softw)Tj +2.261 0 Td +(are or meeting the expected scalability requirements.)Tj +/TT2 1 Tf +12 0 0 12 57 404.4 Tm +(F)Tj +0.482 0 Td +(inding Bugs with Stress )Tj +10.263 0 Td +(T)Tj +0.456 0 Td +(ests)Tj +/TT0 1 Tf +10 0 0 10 75 382 Tm +(Ov)Tj +1.321 0 Td +(er )Tj +1.203 0 Td +(time, )Tj +2.537 0 Td +(a )Tj +0.87 0 Td +(regularly )Tj +4.148 0 Td +(performed )Tj +4.815 0 Td +(stress )Tj +2.648 0 Td +(test )Tj +1.815 0 Td +(is )Tj +1.037 0 Td +(a )Tj +0.87 0 Td +(good )Tj +2.538 0 Td +(indicator )Tj +4.205 0 Td +(of )Tj +1.204 0 Td +(performance )Tj +5.815 0 Td +(degr)Tj +1.877 0 Td +(adation. )Tj +-38.698 -1.44 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +1.675 0 Td +(newly )Tj +2.954 0 Td +(implemented )Tj +6.01 0 Td +(feature )Tj +3.287 0 Td +(can )Tj +1.898 0 Td +(introduce )Tj +4.455 0 Td +(potential )Tj +4.122 0 Td +(performance )Tj +5.787 0 Td +(or )Tj +1.231 0 Td +(stability )Tj +3.677 0 Td +(problems. )Tj +4.547 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(more )Tj +2.685 0 Td +(often )Tj +2.631 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.575 0 Td +(stress )Tj +2.741 0 Td +(test, )Tj +2.186 0 Td +(the )Tj +1.797 0 Td +(better)Tj +2.371 0 Td +(. )Tj +0.704 0 Td +(An )Tj +1.686 0 Td +(automated )Tj +5.02 0 Td +(execution )Tj +4.687 0 Td +(of )Tj +1.297 0 Td +(stress )Tj +2.741 0 Td +(tests )Tj +2.297 0 Td +(at )Tj +1.241 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.796 0 Td +(commit )Tj +-38.922 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.282 0 Td +(be )Tj +1.392 0 Td +(the )Tj +1.67 0 Td +(best )Tj +2.059 0 Td +(possible )Tj +3.838 0 Td +(scenario. )Tj +4.226 0 Td +(Ho)Tj +1.322 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.614 0 Td +(a )Tj +0.836 0 Td +(stress )Tj +2.614 0 Td +(test )Tj +1.781 0 Td +(takes )Tj +2.503 0 Td +(too )Tj +1.726 0 Td +(long )Tj +2.226 0 Td +(and )Tj +1.948 0 Td +(requires )Tj +3.781 0 Td +(too )Tj +1.726 0 Td +(man)Tj +1.871 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(resour)Tj +2.655 0 Td +(ces )Tj +1.697 0 Td +(to )Tj +1.142 0 Td +(be )Tj +1.364 0 Td +(executed )Tj +4.198 0 Td +(on )Tj +1.42 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.641 0 Td +(commit, )Tj +3.864 0 Td +(so )Tj +1.253 0 Td +(it )Tj +0.864 0 Td +(is )Tj +0.975 0 Td +(not )Tj +1.698 0 Td +(really )Tj +2.697 0 Td +(pr)Tj +0.877 0 Td +(acticable. )Tj +4.439 0 Td +(An )Tj +1.531 0 Td +(automated )Tj +4.865 0 Td +(stress )Tj +2.586 0 Td +(test)Tj +( )Tj +-40.755 -1.44 Td +(execution )Tj +4.545 0 Td +(during )Tj +3.1 0 Td +(a )Tj +0.821 0 Td +(nightly )Tj +3.267 0 Td +(job )Tj +1.711 0 Td +(is )Tj +0.988 0 Td +(a )Tj +0.821 0 Td +(good )Tj +2.489 0 Td +(compromise. )Tj +5.933 0 Td +(During )Tj +3.322 0 Td +(the )Tj +/C2_0 1 Tf +1.655 0 Td +<005D>Tj +/TT0 1 Tf +(rst )Tj +1.877 0 Td +(iter)Tj +1.377 0 Td +(ations, )Tj +3.156 0 Td +(the )Tj +1.655 0 Td +(primary )Tj +3.654 0 Td +(goal )Tj +-40.366 -1.44 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.612 0 Td +(be )Tj +1.722 0 Td +(to )Tj +1.5 0 Td +(\223survi)Tj +2.482 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.166 0 Td +(the )Tj +2 0 Td +(night.)Tj +2.391 0 Td +(\224 )Tj +1.11 0 Td +(Later )Tj +2.777 0 Td +(the )Tj +2 0 Td +(goal )Tj +2.5 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.612 0 Td +(be )Tj +1.722 0 Td +(to )Tj +1.5 0 Td +(incrementally )Tj +6.556 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.166 0 Td +(the )Tj +-40.866 -1.44 Td +(performance )Tj +5.806 0 Td +(and )Tj +1.973 0 Td +(resour)Tj +2.655 0 Td +(ce )Tj +1.361 0 Td +(usage. )Tj +3.084 0 Td +(In )Tj +1.195 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.917 0 Td +(case, )Tj +2.528 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.473 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.307 0 Td +(get )Tj +1.639 0 Td +(the )Tj +1.695 0 Td +(results )Tj +3.084 0 Td +(the )Tj +1.695 0 Td +(next )Tj +2.195 0 Td +(morning, )Tj +4.251 0 Td +(and )Tj +-40.588 -1.44 Td +(y)Tj +0.482 0 Td +(ou could use them as input for planning or ev)Tj +19.609 0 Td +(en refactoring. )Tj +-18.291 -2.24 Td +(F)Tj +0.455 0 Td +(or )Tj +1.326 0 Td +(stress )Tj +2.715 0 Td +(testing)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.466 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.937 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.326 0 Td +(installed )Tj +4.05 0 Td +(in )Tj +1.271 0 Td +(a )Tj +0.937 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.66 0 Td +(v3.1 )Tj +2.327 0 Td +(domain )Tj +3.716 0 Td +(and )Tj +2.049 0 Td +(accessed )Tj +4.271 0 Td +(directly )Tj +3.66 0 Td +(b)Tj +0.538 0 Td +(y)Tj +( )Tj +-41.7 -1.44 Td +(Roller )Tj +2.904 0 Td +(as )Tj +1.237 0 Td +(well )Tj +2.182 0 Td +(as )Tj +1.237 0 Td +(the )Tj +1.682 0 Td +(load )Tj +2.238 0 Td +(dri)Tj +1.149 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.181 0 Td +(\(JMeter\). )Tj +3.96 0 Td +(No )Tj +1.682 0 Td +(performance )Tj +5.793 0 Td +(tunings )Tj +3.461 0 Td +(were )Tj +ET +BT +/TT0 1 Tf +10 0 0 10 373.5525 230.0001 Tm +(done; )Tj +2.794 0 Td +(the )Tj +1.682 0 Td +(stress )Tj +2.626 0 Td +(test )Tj +1.793 0 Td +(w)Tj +0.76 0 Td +(as )Tj +/C2_0 1 Tf +-41.311 -1.44 Td +<0048003D004A003E0047004A0045003D003C00010047004600010039004600010047004D004C000A0047003E000A004C0040003D000A003A004700500001003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +17.439 0 Td +(ation.)Tj +-15.639 -2.24 Td +(JMeter )Tj +3.19 0 Td +(is )Tj +1.079 0 Td +(an )Tj +1.468 0 Td +(easy)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(to)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(use )Tj +5.246 0 Td +(load )Tj +2.302 0 Td +(gener)Tj +2.377 0 Td +(ator )Tj +2.079 0 Td +(with )Tj +2.302 0 Td +(a )Tj +0.912 0 Td +(usable )Tj +3.191 0 Td +(UI)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.718 0 Td +(as )Tj +1.301 0 Td +(the )Tj +1.746 0 Td +(original )Tj +3.691 0 Td +(description )Tj +5.192 0 Td +(states: )Tj +-39.588 -1.44 Td +(\223)Tj +/TT3 1 Tf +(Apac)Tj +2.667 0 Td +(he )Tj +1.383 0 Td +(JMeter )Tj +3.124 0 Td +(is )Tj +0.958 0 Td +(open )Tj +2.514 0 Td +(sour)Tj +1.822 0 Td +(ce )Tj +1.327 0 Td +(softw)Tj +2.279 0 Td +(are, )Tj +1.938 0 Td +(a )Tj +0.827 0 Td +(100% )Tj +2.996 0 Td +(pure )Tj +2.291 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.827 0 Td +(desktop )Tj +3.716 0 Td +(application )Tj +5.106 0 Td +(designed )Tj +4.161 0 Td +(to )Tj +1.179 0 Td +(load )Tj +-40.329 -1.44 Td +(test )Tj +1.97 0 Td +(functional )Tj +4.769 0 Td +(beha)Tj +2.1 0 Td +(vior )Tj +2.119 0 Td +(and )Tj +2.119 0 Td +(measure )Tj +4.1 0 Td +(performance. )Tj +6.23 0 Td +(It )Tj +1.063 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.378 0 Td +(originally )Tj +4.398 0 Td +(designed )Tj +4.323 0 Td +(for )Tj +1.656 0 Td +(testing )Tj +3.23 0 Td +(W)Tj +0.907 0 Td +(eb)Tj +( )Tj +-41.126 -1.44 Td +(Applications but has since expanded to other test functions)Tj +/TT0 1 Tf +(\224 \()Tj +(http://jakarta.apac)Tj +34.047 0 Td +(he.org/jmeter/)Tj +(\). )Tj +-32.247 -2.24 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.513 0 Td +(JMeter)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.429 0 Td +(it )Tj +0.957 0 Td +(is )Tj +1.068 0 Td +(especially )Tj +4.68 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.069 0 Td +(to )Tj +1.235 0 Td +(create )Tj +3.012 0 Td +(and )Tj +2.013 0 Td +(run )Tj +1.846 0 Td +(HTTP )Tj +2.847 0 Td +(load )Tj +2.291 0 Td +(tests. )Tj +2.513 0 Td +(JMeter )Tj +3.179 0 Td +(can )Tj +1.957 0 Td +(also )Tj +-40.477 -1.44 Td +(aggregate )Tj +4.458 0 Td +(load )Tj +2.237 0 Td +(test )Tj +1.792 0 Td +(data )Tj +2.181 0 Td +(from )Tj +2.347 0 Td +(distributed )Tj +4.905 0 Td +(agents )Tj +3.07 0 Td +(in )Tj +1.181 0 Td +(real )Tj +1.958 0 Td +(time. )Tj +2.44 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.403 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.81 0 Td +(API )Tj +1.848 0 Td +(is )Tj +1.014 0 Td +(exposed )Tj +3.904 0 Td +(as )Tj +1.236 0 Td +(RESTful )Tj +-38.921 -1.44 Td +(HTTP )Tj +2.849 0 Td +(services. )Tj +4.07 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.903 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.292 0 Td +(accessed )Tj +4.237 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.903 0 Td +(sev)Tj +1.377 0 Td +(en )Tj +1.459 0 Td +(threads )Tj +3.515 0 Td +(without )Tj +3.683 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.903 0 Td +(\223think )Tj +3.015 0 Td +(time.)Tj +2.112 0 Td +(\224 )Tj +0.773 0 Td +(T)Tj +0.464 0 Td +(w)Tj +0.766 0 Td +(o )Tj +0.959 0 Td +(threads )Tj +3.515 0 Td +(are )Tj +-40.867 -1.44 Td +(dedicated )Tj +4.899 0 Td +(for )Tj +1.842 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +1.231 0 Td +(post )Tj +2.454 0 Td +(from )Tj +2.675 0 Td +(the )Tj +2.009 0 Td +(blog )Tj +2.565 0 Td +(\()Tj +/TT4 1 Tf +(/roller/abien)Tj +/TT0 1 Tf +( )Tj +8.754 0 Td +(and )Tj +/TT4 1 Tf +2.287 0 Td +(/roller/abien/entry/)Tj +ET + +endstream +endobj +362 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 364 0 R>>endobj +363 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 319/Filter/FlateDecode/Width 1231/Length 72896/Type/XObject/BitsPerComponent 8>>stream +HOHTGM)&aF&E*![@'hw!v\(-[Q"(0?IeHbp!\MQ{s6TT\| j̠&VU5A?ڨ 9V]]-W^ijjzU5A?7v!ccc#W9zOQU+2009sF^~{TJܸJTU}JI$YSSSں}'VJmm466Κs8A??R6o,*ͅa;v؂ϝXI>|sƻwiپ} -RYYi~{OQU+BӧOybqQUCUUܹ:::DUM &7nU5A? ڨ0}U&͛1U5٫Vhe?yA?*Q};{3ZPCDDnl}>kQU-b!"ٹ}9<[ +U5؝~wD$f|sl}п+PHTocwF예|sl}п+PHTocwF]]g|K.Ɇ ~ "*ܾ~yw +mh?VRRKK-Hoon>?~,޽ۻÇK~y3eppPjjjl>NK4]-ۗ=ϳA@!QUmf%TjARkjX"bZZ2K)ۻBe=Ǐ%LY&x<.r-sͧiF^"rr>yv/w +mh?L&%J-h˖-:wX"b]BЬy>($j|߷;%Jܼ3a,rٱ᰽K(lڴI֯_/?2YnLLLHEE+..3>>.drd2RSS#{yOFھNFFFr5ݳtg/n_qDU6vgڸq\pART' +-L*DĮ,7᰽go߾͗/_>{<l||\ߑddxxXzzzdϞ=RTTdtZѨ]J]]\xQ&''s5X̮dhhhHD^n_g?<DU6vgjllT*SSS`,Vg͜Ϸp8l +rs---2::* 9nDN>-qd29wd2sDQٺuIggݻW&''qТޏܾ~yw +mh fT*%N%cww| +.P(7WYY)k׮Ykdڵvi`` 455LFt:-hTѣG6WWW'RRR2k^~7"ssr>y>($j|߷;m۶IwwTVV.KDU9bCj8~UDai˭ k+XafB] ǽ%A a?D4k(SB0!VF>д`\n{= :Ϲ\׹a>G,={@?477Ckk+BPP@CCX<`0 VkL&Vq [W^˗-% 磐S%1v_H$=8;oߎ```]ޟ~'A-cbb޿yyy#  6xqh)Yp8*L#H$wsl?(//{ѣG]ޟ\Ɇ ̙3S zHIIXaa˟WAAA,$$qh)Ypr|H~Q1!H$wsL/H$066---z+Q*jT*1SSSAAA -y6ߒ *&f/D"X]s~gzAff&;wazzgFDD'O`hh //rss͛7 H&''c,&&rrrݻwpM:ۃz>(**???b + + +@c>׏;>|%%%T*E|``ڬs~ܯ_yf|ׯj遑x%Zxl   ~wط0yuD"s=8; ۡ k4 VpN8|0$''CUUL&#J׬.]$i&gϞAJJ +\xǡԩj5466BNN߿*++׷lׯ_Xyy9dddB^fÇRؾ}0og ~t:i3r1cϞs~AAoa8fg$vG!!xMշK"He{9qwbU`hh[[[hxee%ƥRS^FvH${ׯ_A.j@vmrrZS*8OV;|/!+..n9wܱgeeggcٳVBCC-ֹ{.L&ظq~AA;<㘝b6C8aH$ie{9qwܾ}FFF @coPO> x{{[ĵZ-RS^FDc9 --M +۶msx-3011:NT*g}~{e6A@g^{0BZ1600V9r,\~AA;<㘝b6CşdNɷ>6D"X]s~GzL&/_@oo/;AAoa8fg֒%K])ͅi6IHڅHd~v4LՅgZv1gUXX]agN``OYD"-llO=8NxŬRSS?\zUc,>>^)JxPPS^F1BauۺZR7nܰ?>>>{E l˗XӪ1$̟WaLToBii)DEEa#GTjkk>ؽ{7Cmm-b˗= 466B\\cW2ZtƏ?>u^ؿ?#iii  KIIq>Ġ0:: +7ot?}AA;⠾}qhoo)R͛7ghh 扉qzAAA +fACCV+H$svo&H!V]ǡo2 v8^j8qVǧ}:MT^  a qzRRR4 &- ԐJCr4rERAAþ'00p9**K`҂@r4\c,6 { B[[L&gffB__Ccc#lݺׯ_Css3\v  l6;ՅZǸjD׹Ϟ=111x;w@^^zH${eW9qs   8f=L+44WT}TiH&Uݓ+@* C;_-^E"x{{ E״??zJJJ^D"buٕzqg\!  p'v;6D"X]vs~W}   _`籗b=\THw %H$VY}ǡ/$D"c\CȲ8o DԨ3kG{;=:IdX*3Kghu1&%("~ >@$FQ/4F ++NO]5&nsOߢOs!1 C뺜ČF4.w_YVyvoȎ.}Y`j& +UU )RJ)RJaHu]k1)ҲF-Vd8Futi.Vi2jWU5xJ)RJ)!u]ŌFZG`NNĚrY~B/[皦x_UՐ)RJ);jTu3iE?`ՖiظVdRqm +z:DBHCe+\4oR|guӦM(..륔RJ)OaR] "f4:_=z+LmYatttړ,s05MVbY={6RRR0zhJ)RJ)!u] bF#-h0ފ@\MlnmCQ&mj-5B#4M[R|g5##RJ)OaR] "f4͆bh _"4=w$y6o :~?Eir>b^gC|,s05MVbYu\WD!B!u] bF#l6^cwİ8Lr,%xȂRZ+W`޼yGvvχ۷oԩS7~?Eir=uTաoJ;wN=gΜ=ΝW… 6mZ@A!//O'̴tV,s05MVbYu\!B!]0Dh$ Q0?0ޑ)#ڍQ#zl6Kyq{~2ݹs&Myk׮xEQE\CCHܻw{n1K$''\{999x zR GEll,4Mñc,!=/LXR|grnw+"B!ta Ð.g1n*̙"!q(R_`drqc6r.q ,gSSSq-s=h n+pt:cl۶MfVK^p8PTT7oaOAcc3uZZ|>3#@eџi+TUՌ5krss߻՜no b:#yyyݻwGD!B aHu]3{75s0,Y yԦN'|>_gGHwFeџi+TUՌ?UUUB9;Bٕ׷ 2DRSS+W`޽{.^|)tG߇B!DB] "&#lρ= d7}Ff/::M~(bhؿ(砉'R-b'OkÁoZ>x|eeem|MM JKK͵x{>B!'aHu]3Ѻ;?[oyRðd/F ""M9gΜ&~?E WPP'OY&Lh6׹hllٳgqEdggZbbb|YWWݻw˹\#rlٲǏ盫J N>/#{#4M[jƋ|yy9޾}+V1UUU(,,4EEE7S>}泽{w)) G/P__/{ȇg%%%رcr`ۛc8?x0ijgp%ϟ?oΝ;TTTX۷O]t.]3g k֬WdNѧsrr#\>|2׭sٲeغu7oD^^\LJׯsZ~}߇B!Ί'Dhݙ?48ðh w2Vn aPӧywڅaaar ͆ik6ULqC> //= +qcD<}/#yNDQQhL04!=/{%QwS$mtz^k:>E۷Gtt4=wؑFEE08Iu7+izt:3ۗn7V̙1cTUEbb"كK}! + ѿ?>{QRRB4Ɵ>}޽;q5Bvv:~ESߎ9"z}].N:Dց寯ҥKH8q[ntrDiii駟PVVrAee%6nH|iOx< ?}t~SNp öm@)[UUC:y$=>5B0 0 0`0HD2CZF2l)U~6M|~;i/ ÄG|'])Hi2R~bb"nܸJwݰZ!/^wJ[ĖH{ո|2z@ @ߞӧcȐ!5j޽{lxRU4YJJ +g2Ȟ;w.޼yΝ;-&L9999˅͛7KgϞ3eӇj{HHH04̟?>O(..6V(<^z>Pb1..322УGz8qO<;էP0 0 0LkFltwM^: d`ŀ!660LF|'])Hi2RxX,x=͛ *sp\|T[[+}"pHtZڹGAvbbɁ7\.ZѣGSٳg>|DODĻsUTTZx<>:w χ:>ĢEduuڕ{\0 0 0LkFltwLc+~7 <ڵk-1 8Iu7+iz۰apuXV8p ޾}l.\Zvp8t:Q]]-\ߞTU(_ܮڵk`cǎQ=(|E͟?~ߐ_r`ۥݫW/i̘1zKMM6gΜ;w؊ +Z+EEEjʱÇիW>?~'ᐱNE l;|>Ӛ·e:tPBQٯbժU!{y%رPZZsΡgFmm w\M9Gn߾'(s=̙3 (//'_߾}q-X,aǃ"iGEE͛DDDu~ {̔sO>ϩ>>aaaZ+`d"h1z9Z/¨1bC|'])Hi͊odB||<=''';֭zBQo]pرLLL tIѤIJJePs\.vDDDo(;uԬB0 0 0`0Hltw4&<10/wfb&T_Zzk `sY:4YUBQfuɒ%p8CII ^xL^krn6aa$FwqGcL$ / 7YhῳZz{ `sY:4YUBQfuȑ(((QXXfzYfa- aai1 fqwh-/5`JE*{F.g嶻-Xu-!"6ME^H7Dbј"^ ٜ~O%?3Xo_GMCv3++B>3t_'&o'BĔTCBBB_!B!1eRf3鞍 bÏsm:cMC _7B>3t_'&o'BĔT5kѯ_?J)RJ)ZeTJDh,եitٜN{}a͝vGD"hkkq @7#t˺?dB򟪁@^#G,ųxYB.]%KD3`м܌={w~br +n޼ڵk~KK + O$_n/OJݗs)BRJ)RD-2*Zhlܲ%cƦc/9K$ eAGGRRRP]][ӧӧعsÇGnn.Z[[~v#''xuthjj2uG$A(B]] + + +0eܹs'IKK˗/mv|>[߀;t_ϥ&o !bSJ)RJ,˨2k=PZQ:ÏIc0a2&펹QZZ[n!##-Zmmm͍:tP̙3w~?yx&UU(_ZZ&DGG sUZ0 0 0zIQ z4aAeQ{WHQ | ׯo4q xmmm8~8s999(((gP[[xXV444ÇX,GGG_F]]222ȵ}v<}5557om۶ ߿uX|9/X4.ֈD30 0 0%iF=aQE}M/^!EQo6w`Μ9=/_ Ӊ$իWq9rֆ;v`ڴiFcc#N:3g}W\Ç 6]r=Grr2***pY :t4^SS\Ǐ,X%K30 0 0藄4MAhL~Q%aˢ>&UU(@lllӧgrlŊ46uT].<(كw"$$Dv|3f̠V\$&I*//֭[f;wӵkp%aaoD/"iGgJV~QvG'~0 겨ϽIUU+( +SRRw`…z3223yd9Cc\.l69ot:elXve7n@uuT?eZ"cÁ.wCee%>~Bzwgaaƿi#͟+1*cNe>য়0r򋲻{a;Acc#^z3g **ꛟχa~DD]7JxE!^G{{;ʺ&&&oŋXff&urfy)c-bK<繬V+ZZZdp8P\\smzz:^|7gaaƿi?gJ0DBaThD~1#F?? e7&&aԘ1]e̙;wx{| <F#pI۷Md?QE}M/^!EQ?;;شiƎKc!!!IHHZ#22OL~&v8N[,n/檪Gqhh(W.Պݻiii7n֭[ɑsϚ5aao^/I4/3y%fB1a-ю#0/u w˜}LJJB{{;bbbt:466bĈϝ;'NwEff&t'477CVVVWF]]ϟcǎaٲer~ڵ9Fw܉Gʹ v,KV\͛Իvb6l t Cgܲe >|@{޽{gQE}M/^!EQw]*ۍGΝCBBΝ;x ޽{GߟrfntX{~Ʉϣj݋/3jw)))T[>}%KИ_~& gaaaK4z3y%fB=v +&Bkm+lzA`Y)_nnݺ߿Gnn. Dc:}PPiiikDz17oV|Æ Css3勍=PWWeR95k֠RѣG0_ ++׊>400OF:0M/1ܹsc8 <:}PPͧJ߼yC=`ժUs555?~|CEBBrrrv!@}0͸xx< k׮hkkCaa!r/vs̜9T__/z=y|Q +e3ˢ>&UU(aao^/I4D j[ki$cNP1xЭH\Pu/~ӉX?‚ T",a*b_ n:9{ltr=^{kw=˵ֹ'ץ)""C'+G?>><Xk}d۵Xg26's2ʢ?| tiƍ>be˖͛7PWW-_\s֬Y>GrJr\}@7^JKK .:4pXM&7B>#3dfUdv?%%_Nwܡ9ٳiڴi|-QRR(--pny<2L|]\\LZ_[[+))[n%KЧO(22r!222zzz(**{y^X,|}Q_)ݻwlٲac֬Y ,gϞ'%992˗/\!\.eff pBeYGRQ+ݴiB!TUBYJ&3N"u)))BΝ9gYY}nݺEߧ{j}^z1ٳvxd2uqq1577k}mmm;`0Г'OrtRmm_#9w^/Y,vv^^ѽ{ȵn޼IqFm眻(==Z Q^^NTUU7GYe}IEQ8^OȨ +!,%h}W:gߜ9s`0wdybД)Sō.Q0c ;uT>}߸H$:gEDDPbb"diӦq;k,ψQD@eYGRQ !B!PBn3dfUd X9P4 + + +5z<2LApFe=\Q!B!ᤪ6wzը=t2x9sf5Lygd]SEP+B!BN +!-h~d]SEP+B!BN +!-h~d]SEP+B!BN +!-h~d]SEP+B!BN +!-h~d]SEP+B!BN +!-h$~߶Js[B.z깢(}B!BIUUY!m+YsEQ8>J8H !×d6'\ޣ`0h5B!UUUVmyF(JSsgV~'DAe=\QQVVF/FvA-%&&REE5GQQeff|l6[ٳgSkk+uuuQOO-]t+ ۿe=Hׯ_Ϲ;hM@!SUUVmyFH$TwPϞOi/xHȺ+#޽KǏګW=Fn:;Gcc#ݻWkϟ?.\Ol6[rƻoذ^x56z*))t:rq\ww7֮]PZZJn;5 m B)@R!m@;SC;50M27::޼yCǎ hXzjjj"CEDD)3X!벞z( +s8|09N} ݸqCW[[KgϞ=kԩS!p8f-`nh4O&omiGQcccпCii)Zp B!_UUeܖgdʔ)}vڳg_z;SC;RY/f#Ks_$Xin[TTD===|v^, EGGӥK~s=҂`,uYO=#rssϔׯSSS `{=Bx"rttvvR{{;oo!BWUUY!mIKKg|ugjhgV*Bodi.] =6ԒBVMlɲ Hgi. +b]blEHх M5.Zei2esY؋[ۻMa{yss3&ůC<;Bee%/_w!%%j,..zjK/'_t)={-زe jkk ,Zȩl6Sp>}Zsg={ϟ4_Voςˮr[d2]`tvv"## ϟOuc鈈d°ahNC[[݋hNR#PUU'NmHHoݺR9xx!f=-,)S;Ym6Aχ`ZYb{ґ=UWWS>Z-***`y...ݻwGhh_qړɯGʍ=zh4%''jի]Zw͚53gܹsx0v 0a_vNlgf6طo%8 ˱;oK[SRnʕ9=Ho6qclܸOkP;r2'e2Rϑ'O8s Ο?aNJՕHݿ.]j7[~Mtww"Q-0 .̿-݄ H`ׇZVIO2zٷQ\\KAɓ'fKҿr 0WrJmmXP]]-0L}{yQPh¬YsNQQQ9DnA6m]ei )Yqc#9_~hii{~vٳgӧOs_b1sLC1dggzk׮lf31c |FLH$.f;]9r9wd2Q ϟ?5 hooGll0WARYPTT$Xb+s>!!mmmtuuu.СC0 .̿-mcbb(˗ 9wZ V+eܽ{7 + h4,Jo;]7::HNN&yÆ hnngVxba~ff&F8\ɉ+a9`߽Eff2G_d=B qB~C,xyyʏei )Yqc捣1A.KJJBEE.55MMM8߼y4c:1}pp03fXŀ̙3zٌpz>x >>>n3̝;ץpppw`+\.L&j7tP|jĉI7|߿o5I*JTW\\۷o[ͩ&]dd$ÇGXXx!f@Çؾ}`w\p!!!X~=:::`0܊]̿-mc;w=z4.]G?{>j5ZhNlewx,^鷣hرchkkD"]wɒ%ԩSiٳga4?,'L7f֞>}j5ޛk[Bzԧ87'0* +͓`;kJdc֕kaJV1f8ڵkHMM .$9))xϿz +AAAD|#nh"5 +ͨBmm{Gzٌpz0`QPP ЀޤC`[Ws\Nݭ2̩]YY%900(--RDu3gΤ۷HNN&D"Ayy9~F| vc=[MMM~:BCC;TtuuիP*0 n.ߖ죣#tttǏx螫jhZќVK~;zFٻj,,>|͛/ؘ5?CK]-(Bhu܃8r=5:&iTɪ,s-#ҴՠKO %/M$T?YM綇=mK~^k׬<{ɓ'Zaa!~ݺu֭[s9sbeئΟ?(!B#֚UJq|Cv5;s oy)-]3 %9͵nr~^z-l41`zx >e+\JCB}锘 vw:ژxYcֿg70q|i%Kѣ]r_m0bes5!B֬Rf֝pRM}yKlAIN@s~b;aⲕx.!DX`tϞ=&"=!B_ZJ).=ZwJ򨦾奴t|l[} s)%5!j!B!Ѡ֚UJqѺ Xoy)t|/fM6]0qJ0L\ϥ\?< B!FZkV)eGh'U9TV 8~Bzal%K)~y@V;!B!֬Rfp26̥:OFzxV⹔뇚aB!hPk*lhsJD˗Ha… %''~tlb$&.[RJjB.ݾ};mܸ =DNw;1eȐ!M+WZڿ?ȑ#ε']7:t8H{+V\9t.Hps֚UJql6ZigJr9c0{GQQ=y?N}频v;k8p ?fT}ѱcBכ7o`lb$&.[ɝRJjB.]`?F !!wڼ]K DӦMjڲe M>_~Իwoθ8,ڼy3H!J;>hY tfMJ~;%'~Gc~C-̥:eIOs97o=~ + + +:\ɡFwݹs|gϦ7oŋ(իҥKtm1c'~r݁n`~ ׮]aÆZz-߳}\z5=-ZDw ȑ#aÆ@ׯv[q~~>]r1kjjs9;;0|:#e+9TJCͽBE&>8 !!wڼ]GL .Zr\ch=ɴk.*))Ṍt^®JNZJ).=?7EJIwݔ;'Ǹi}LKk5%%=zIEE9s˩W^\'ys&>|8ÇO>ԯ_?jmmDg:;ot):p{Q^vfJKKgFF͝;ǹvNvs|4k,u'OL'Nzz>}׸20yG `c l%o5 +!jfffR\\\$ cinwE 1PŴm60111/1˶}&%%Qee%ϥH!"wD.hY MJoǤЬh\Ɵilٺu+UUUf;޽{GNM4^zY{:;?ez)ر}1eeeg˗N{:;ex<v;_oii!͔fϛ7oRuu5^Ϟ=qݻiΜ9T__O^cSN7n𱹷y.QCCC>)$&.[ɥRJjB. 9wڼ_;~ 4T㺆MȡZQVSi-qgI.5 {fՑM)Nv2iƄΞ\[tPiJ& FLZ[*g}Z)Ѯ#[^~4) RH`gWWWHR4T*r4 y2/w#p8b ,--(--Ѐdnx 5 ݻw1zh֥KDGG͛'U L&;88y'nnn\z9`׬  \~형VⲙD"SX?F"L iTT7T#""8ЫW/_ +VN6%553QE1;wmڪh+p֬YXlȑh?nooC\HHRRRضև̎_k}ARRV^&1צh"EXX֯_;w"11T.ui֢Æ Щ5T*r4@Һx;b&1=S4(޹wy`Fumә~F1Ǒڷo_fd29zלtաkPضmgee!>>82ɪ*aϟH$8<6jk"DӨ(oVjD\\r9Q{i&_ +B"D6@w1}'Nx;LNNNPN9>,++x'??/^@}}=ߙIvKЭ[7p,;|p,Z&L`'yǏ7nbرZ'O OOVuKhLٳ'̙[b?>Ɏ>uRwέ>hQSa{i + QWWt?t_kjj5rrr|rǗhJKK ST;k␘A DCqk׮ϗYfiYYYٳgӄP{(sL[!!!hhh@II yOg/^RW=φ +|IhllEX`jkklٲIwYZ7ThjjK,_hS/TXf Ǔ׮]ʕ+Q\\,S[k!”o|C0T#""Z|2khvv3gr[nn.VZ%ZqnGB)"tnwӇq }||8fF*r{9~dwtXOlݺx-%}?ֶٓmI1)ِlIqsll,'y;[79s}!??7o}LHH_BcivQTTJjj*֭[JTTT`&_:yaff֊TO-捌D\\rUg?RRRl l/سgݻ}n=woLKùs:|0J%S=cH0ANR *QNǀ~ 9g'_E}t{{{\9uؐH$:۴Tk!B/룩QQQP-h5ΐ򑽹^Ŋ +dffr[ׯ_ǹ?{NN~˗/!g?y?Ç1{ ؅{ʼn'cs9$8gϞy0tPߐCpqn}6f̘f QΤ=}za~mG6$[blcCtvvӧOyҥK97#M7:ٻw9T~93aS*"..vvvd4ƶujjj-p̙Fh|#)) ѣGM?|eПzAԶ:q5Uҁ2L2W\/^͛7ExAW% +w/N<}B~꿧Ÿu-^Y4uBT*r?%(W[1> ^!B)@~YM8`GDDVq!ջvcǎ޺u !!!c/Ç(--Ÿqvj+))gPTTѦyf}9f=fϚ540߿N#sttuX#Pϐߍ111ΝB`̛7o"##… C>(// 'O,)**2=44f̘yӧO%(_9k߁"d*(Oksh1R_4f餓N0!/kԌ o+YԩS4|f)n fپ};L&Zs%UoZ[uC}}=555\a;5N:Cxxۃ3k5kH=twss<>͛7KS AAA\XBCX@@ї/_oHJJWk׮e{xݻwhfOpp0s͛Gi&,Dσ\?}t>> ê:|+ٳg3r6VO:{ȏ?٧Fs/\]]Uq=i^^#~+*((p#?|`q/KqFc17[p'H-u>k6DGGSBB񒕕ёT}Q${v qtIJīژ{݉'ӳ}:_|qh|5~B>|teffJ2x$?鎎Y=ҤOkѓ'O(66Vts l/HMMai5\![n#b΋}֬Yz %䖖u!ڵ?~l~ 4b +ggg ɴ2/QPH 6lMI'pB^ւc5F.--z*􊅅,,.Ys"1~c/󻺺x^ee%Ç-Z=X:ϸ>KZ3N&L ???`#i߫GoZ|4&zO|УBٳg|OZݴiw.zk׮O> +ˋm\`^pϟl4޽{G;R[ zxxScƹX˗)==911:;;iϞ=16vuy&.[nѕ+W>˓رc풯OOiʔ)ffg!SSS$߸qRRRghhf]uu5M4oN&Its l/_^jI^䢢"]58_yի9w ++cA{T?b(}SPN:$\Em Q*YuRUŭյk=z s})d&;d024tI';4޶Z3sLںu+͙3ksT١ÜQFѣWFF*GRKK }6JkBBB8'I.]cgϞN>^p6#$}QQǂ+mc%l]Ll) +:餓NfW322xxgz^mV.V` +0VZy}jxZԤ'''3kAa(CC't3MmVO6rss)22RIEL#GčTRRk9:bɓ'iܸqwrgnܸ,;{EGGX@;vt7nܠ[n/p۽{4ךNNN-...|NXX>N,aެYR-[L!q&pGx۶mw ^x1uvvX;e7--Ν;z{{iÆ Mͯ_3g_:@M[SIJZc skm#Kw0?]G'te~CIknn&(ϧ&3DEEK^☘=nѣ%HLL@MxĘt~B>psk.^wn:*,,$D߿gϞ" `[Spl:餓N:LbqJJJuJX RǏC}eeeKn>V<+%KH[ؘoTUUAqq1סܾ}깍7R y1,\PbA:(~0bccA(bm>G+֜V>wuuu:5D?ꂄYtt4=@S=hFAWWW;v,5 +#1`8Gkyy瞡.i>biiifU:1/-_x~vggg8655u [lνo`94$; xf1755Q>;!~1c֭[Gk9ByH?UXXHkgeeў޼yc 7n܀tֺ>2y\. aᄂ2Ry}]-B=3GnJ~5s?ډt6dD""i<( +!44X`.UIAHD+k~|O777]:pϘoPoo/ǧOR_PPTVVR |@JJ +}ÇT_Z8uxxx] ATRo;w㵮w;v==عs'ŊxدkO[n}]]]atx<9Ύ`EFF\]qdI3*(..ׯSiiXySQQAz#W N `NNN߿C`` o޼ W^,0/_{3|7S{S0!r9 (h^,JMk<3:{HkC% |kg϶:Ű~zv7nݱd0 ȑ#ɉ|"--4EmQcs7&V]rʸM |C8z(i0}tc-Ⱦ5A]\\`ժUW7p 98Wۺϟ?JݻhVς> P^^iNcc#RR{NolÆ \\\{555\?4j:ASSD"}~~~p]( +hnn%KOWk۷oX^r%9s=**j1S0rx6mO ;.d2oKR:% |kg`ggg={6޽j P~X렞۶m#-QS֒^Wg-R=j0.`ƍVE\\\tLkOOO~0t4im5^^^Zsww___ӧ)kw^8w:t̙c-JE8eɋ6O\{„ j7a``.laޔyND|>ߚ`fƳm" 44j'Nܹs<R Y6ш# 00rssICrʔ)88x \t rrr ""ªޔ K.5Z3g΄LUk`A P`;w Xs}-I$OQTD\Nml{AƵƟwq&jwdu/\Ϟ='O@]]6lEBO>7{`y/d4XJ&ͳuJ$ xl["`m5-[@~~>ٓ`ڴihm9PoooXf iv!jim_`}oԩ !!!:cp,αN;c=ERr9q-cO^4}܀qx/ޛ.I?U 'N7TkAee%=z%C1W\\LfI(J20X RLF`Tj<[D">o```03Lٶd. +TDEEArr2;v Ξ= .\F5& jZfjhmO`=) im2wXST*Q.Sk4[ƞh 981I\`37Tk@kk+̘1s + EEE\uu5$$$@EE?>dggCSS\|qϟOBmm-$%%vZx@aa!XOIIߙpEoPWW=~zjrioPVVbX322۷o  PLF^Tj<[gxx85 + Lٶt>S$@XXw-ZDw*ŤjڠFjYAJE͖'/>npl,xW.06*I m2Kc?ĵ֢M5uZ;բmhY;TLp܊^H,UEWvwǙq.D E*DUPkc#D(Rg9]MbCm}s,Y~ѯ9mmm[zm1LVn|>'ٳgit!zmݺٳgbŊ-[sÇ?_~9sp{Νtucp8ƽS$;vz +O  b'OZ:~8߼y3 144DUUUN֨ t:'7`r<=w=OR2ݚ΍%%%dSsa.̕ڹߴ۞ܢ ^KDj!DqvLQJRJn-i鬡Ҳb7:? ̙3)o^!vO?~?~L/_&L&jsM>ψ=ihh^'˕P\VVӁhtty^~M/ǾD… 444D{5^^xANb={Fׯ7lFl(UV=2:6'''5`Ng y9|.DZǓT?!B!RۺFdZ:k{z_z{{L&S~Gp֮]c齷Zv3buf놆1~r\q?}hÆ 4::u1N>MG .P}}}wD"p8FFFhѢE|Yư \P.]Joϧoߒb`0HN3^.O>Bp|IB!fJ)VJm]e2-5TZV<%Kʕ+t ͍گ9EEE4k,ֿPv;GFFtj7o3al|@===3O.+F{;2QUUE`?NQ+cǎ}߼yC6m˗/p[ŋQb~Z~}ԵNO>Bp|IB!fJ)VJm]e2-5TZV<%KΜ9C͋گ9MMMk۷og`0H#K>xfuCC~?\OΝwј{Dpunn.ݿZ[[e +Bt-skꢫW56609ʕ+wAڿ5O>Bp|IB!fJ)VJm]e2-5TZV… )???f3f{fZ[l̙3h1f3 RYYYsL&*,,10l65k!ڼqaX(77750y9|.DǓT?!B!RۺFdZ:k8au^QWWG׮]q0lItFx=<B!*X)%PFdZ:ky?iܹs'}\Ffy yYBp|< 6J)VJ5|>輬D +!8>X!B!b5BsB!BI+䶮|>O>BpT+B!BN*X)%uAx\B!tR)J)k鄽t>m\AԸӿ|WM_1y9|.>W B!0TJRJnmwVs!O!B!RRr[hWWt qLt^' !8~!B!L'RۺFNK6.E_m9:/Ǔυ !B!pTJRJtjf&6׺+6 C/_'N$/D" +K.QYY'g2&ieT)_RRrkT2c ڳgyޘ&Zn}[ݶ _cwsOyI#᠜:3ss9wy{%% +.gJx=ւJ}pp0TUU'O 22R:ۡjjj 00P|arԦ)))O9߼ q:Bj|Gcyc___cmA"D"ƅDDD@bb,YD㱎NIBx? +/e))SݻrFشiPUz乡lmmZZZLLL۷o`aaA2=J__]۷ 5X,WWW^A(R{k4H5u5sFc*Ѻ0OVVٺ4pv=,8j~L`t016`31Ls^u\;9vq_1r?>UH$H$ѸsssHHHD)ƌXNΤX۱ c ?+3=== +cǎYf_lg5j\ez///LBkk+?NmdE򠩩 6oꪄU^xE_2gu +Ԟ 0vm:uFs 6y6dz˗/=XPPMNNTTTgϠugmsǏ?BVVN֨kp1 eeerӧ߿)d;'444H뺎wѢE @j={6TUUA~~>z +HgΜl}mnnRo.}-8V 7pɼ}ɓ'O}}=H$xKJJȮwaќpw~looOewww _r}ԩS}!o4LJ Δ7vwwӠ+Ky] e  +=5550V]ƶׯ_)i2`h'hs<6m}֭8Y.y6NJCaWW#]Sc3f̐8@}G|1u[[[0339\[ZZ +TްaKmB+WիWz߿/_Nq ,\0[u}q8ocM3mAأO:99D"s:hnnٳgs`~{cgg555pB9̙3޿[l뛙 ˖-Լ HD9#Ѹ#Gƍ!11r#F jc`gR,!$"/υlY\0hjjϖ T'N߾}OOO1ؘCNNJ= +3322`hh(UUUˊ^xEwq:Bj|Ǎ3`3g=***b?../^Pel+V }yy9[NϺZ# Ο?ϟ?Bxܿ:$. A |tt4|0-N8bڡ(_ge{w^P}XJKK!**8A}nnZ)RҾ&22Ξ=K:g?f?7 --M{ {J1BvE*,Z +*++iBBB8YP߿(|&L … peq\oUr\0[u</^wwwx5̚5x|=XչR %n1p=Mb>;eH$`cc#h͚5 +Ϭ&1Xru(S5_zz:SǏ3~e&72{vJZW*"^FR&M{쁉'zc`gR,XM_1 &[Ν;_bdd]]]kQO>~Z[[/]ۡG+^}ٙt44Rv G:|*`;w7N='O{{{x=lw3JMgkˆWe1 !!*++aP]]MgExo޼I1 ++KWt)ҵ݅R=Mb>gc+QzUgVް;88P=22>}JeUPW+@}cҥK +mkd9s۷ue9; C W HUO?Q|/ͥJJ0+[0- +|ݴ(m!JEF.j%mF{F^Rm܏s>^޻;3wߜ9;x:zGnχ,fKfi?mۖ6mڀ7{#gJjf7<<|:u*TWWSOyd1 Ѵ7d2Ǽ MFs ` Ǘh;w8e͎y&9r:?AA\\_&ccc)BII %J:ӏ-zy4į^b}}1??kqx,X@ZbرReۆ2 0)a =H  7Jg޺wNľtU +zANש} ##EEEζ} .[•+WHC}+WiX; C{>@|"KK L/ci,3f0.c|q4^,]1lϟÒ%K`ĉi>åg 3g΄O&o߾8ZbM6ٳpIx"C\\;!!!qu޼yP]]-544@jj*}j{ѣG!ͅzhחyްa4/^ G j'ݓƉzXk~#| (ryU>}tq,_= IIIc8c͎ \M?Dy>m=ӧOC~v QQQVsq[.xu;Ӈ[h_-^bĉ;={*k{l6)*a Hb= + +tVD]=XCǸ7~~~V}111T߼y3?~\;wY%a0<^@$(ܞ9yY0';J[ 7X2cƌeZ8Ƌw_BttUۜ9sٳT߿Cnɓ'S}ذaaO>'=z/w5NhH;.]e #`KA Us*i+W.Sr޽;gggÁ ɱ-222ƪ Rcc#xyysjj*]lC-eO* jf5kÇݏy,?~@qq1=ܹV\v/݁'Ǐ]YHLL۷o*~n*8rL0ꙙo>,l+//9-J:ӏzzy4įj1 77K1ײ7p\+!=03}Q9,7ߐzȍ홵CLL C}}=QVJN{;w(PǸ7S'NPQQAp,5r gّ1sybEFly&DFFR;`8+ſ8B.rƫؙ>ܒGWHj +n___?|-۞뒒jTrm%޼yCw:^=H УGEnlϬ_7իWC]]ԧAIש}/;;Wsâ`d2=yfq19XnuKtIG$}+XWL^^q=~>u[Tm, t:[VzMtjAS2g51Ll/]^FҮ]FXX $$6K4yKqѲe:\MB|_׸{)Yԧ=QQQn]zKMs={l6̵hP>47'A~%ʒ`BH)))(//GEEh#h4ny"##U, t߾j^(פyJjJ;_ h +P\&&kUvލW^iϕ+WCϟ?ڤiӦs`0c6:u} Gn4|ݻw(**™3gk,[̡=77oƱcp-3:q lذAa9|k3vv=R;PS^|'OX>o޼zXeE|_u:5V;Klڴ 7ov.]Jz/jghjB9W5\{Q&p s1߅^G'cDS(|||T9}4~=bޢP-\̱ŋHIIǙ1cףߒT_(117oi!!!_`׹4Ym61, t:[VzMt% + ѱcGZ@ءLYML&KW{Zno͛76lX]*=syeK`0di @c8|pvш-[(z*&LAAAx9?;w)@@@@qrrrpΝjcf+ ׯ=(A)IjqjǎrH?F߾}z}Q;|X,mlxSjϞ=9p~fQ K}sW}=5ʼn'jJMb6F82'k:9.!aؿSJ>}\ vI=Jzb Fu={;bߟ^i233QYY)멏N{ՊѣG{$&&Zm]_ hP\&&= ^z˗/С뽽q ;w1118غu+.cۂ  %%%7?h"0c߀=x._L5Ell`/Ř + 8 c3K|{RPZc9SRe>!==mɰeprriTղڋ!FǏ|H /¢aI?r+++s%$$@YYnɒ%HjnnDC)=鈈9:t(׬YEEE&dƆFt9-}FG>|???ygggz/>՟_m c_F& x)w^yyy$ݣ̟?:;;;&ǺׯpmYPW^YTՔ;t]C{{{?wޕsSҥK +iiir;>>[) cp/^ 63g=?>>>z~>}(n݂OR^-"/.hL|re0oaz1?i+"T2}W;JNX% =)Z:u*RRR`ǎ0g8rHK+jqW~zk/rKž={ trsSyRm`ICEj/,?! GyCQ l1Æ |Ty۷o!::~'$$@[[ճϞ=777z_~ T?ĉ \7oޔ^Օl@L'yӦM֮]KQ(***ˣqCzxxP9g󫭟ayj"ِN +c鰰04;7NqAT#Րj5@z!jKJJ6L_|___]VViii07@iʧ$%?l ̯SPPŢnc'M+Vٳp5gYj9U AkMFƍe݉' 77G/,ՆXXtDOmJmcBqq1ѣޞ*jq7wNBjK""^XY2)`eF$Ey?B D>|~1cS+Maccc݈# :TDO;;;a}Y?Ø? 4^z" .nsCAAZ8}4=~caJcϧ` 2&OLmOIOuuuaƍ]?0ٵkQB>sz̔½SˋDB9%ɡ@?` VXc`ȑ`2FVV>|ɓ= {JP̛()76>_u:%V憚MS~uZѣGaܹ޾};QXZZ:pԈ5{z~J ʫ%rsSyRm`It:Q)cfɬ̈ *3dsl/u1 c_F&X!)))w399޽{Gq4$$(nb|Φ1J >A}}=Khhh MLnHhjjgɑfϞ o޼wTVVҚܹ;w5X޿?ľ}@}e>~_~իݻwCUU}+W@TTVW“'O`ʔ)R/Fb,DyφLߨ ?lٲ^/1b\~nܸ65?|Quj6K 5z!?~\xS/񁢢"(,,3gc,W^Å  0+Rm`)H_EaFdFʌHX%B_CȾa D/={i֏= M666Zpww[[nz\+>4(2xzz]"0axyy RC wXSRo?(({Dim/999\)GjsGӑH5h̶C`baE0mzhGGGpssڂb5Ӏpvv3쥘%j68j\3~d>;;;HDQ k4KςM}a~qRhKj0+'$&㒴1۪8;.3(rm2]NK%)iwWekyyޟ#ސ.>%Lk9q޾} GG_9|h4HRBR!H,n޽Cuu5n.3gΠ +.]˧(k׮!??ݻsrrBQQ c,(--˗QRR9s8?FNNW m!<|* +jͳ:|{\:ѱxxxk׮~;9[:_njСC;v찺ܬ***|Ks8;;}r6rv;-.%ӶmD@@@L̗d2+} x=M`FTcS(P*7ё߼yf2݈aܸq о ???Zj ǹso*c(FKJJBYY^ǗýS|уݿ ,`ﮮEXXe0 Zh;Nt,HHH`3^xQFYyT|Ogmm-/_yS,N=z4l!!!1ۣk׮\rmsc@\zg#',rfˬK H8uW7w%mݻwQPPijjZ۷oqEv?մ?eg$Xy%/ƩS~S[ҷo_\t ޽ׯh"?yyyhhh`Z$qmM["((߾}'wEEEqX;>>>Fĕ+WrJf(f'|ƌ|w~L F4̟?K#(JLyy9$ =zh6~v#""<ȿ566qqqֳ?~mׯ_̙3u{ֿO>Xp^Ǘߒ۷ӧOϟ?WF&dffX{C{\:qߟE"g#cQ;t_d qI?.\#:bjfcIlt5-|&M兄UTTs/qӦM+c׮]]@@L̗ڧ@TWWޞ}?~111\HZi₏?6qF>|˧3=z3fh4,IKKeRɕC"wҹYfÇ+4440ݱe␝gwuu͛74}Ϟ=pppU*ކ?|-ӦMccxtɈGmm;@ I~Vhh)1ڎÙҥ gfS@Sܘ[:_޽{cŊX~=ΝUVٳgptt˳or;tlbhSq-A$݋ĖYO$؉ݍIusfBt(K.KTo[rvlقϟ?3=vvvli&MB^^WÇ̄36l؀zt0d>I謴ȑ#̟?L͉fTT + +jxyyA$ŋ&P_N1Л7oѣYիW9#QSSôR@CL̗d2+}jٽ{7t({1e|ݺuөcNRVV?l030a]@*P(T*o'Hx݄sk!;;[Ϟ3bȑNJKbJweRs! 'ŋl2={VGO ?=.v8"nnnm͚5PTo缵[:_7tPf[`6oތ0ۼ1cۦb9-HJJұMEJrݽfˬK {HmϺk%jꫮaE`EB %'0@ A J{k%YTD$ XAMy.ET3ήZ{~pgۜyf a=Uxǣcb!Z J|W^Wi-wNNtuuAՂF|hll磝@f3chyyy  -='))ItgHNN\^g``n()),Y߿*lYApB/_ӦMaaa^uDz{{!==a382g5KWcǏlBRVVF/++|E=W?`D?CDD0Ln- l6zAA[ZZ`ݺu} }lʕ+VX!oݺUCiiiPTT$˥K֭[3dddKOyUX{xkf3ÇȁpP.qIطo(j5vƁ|dzg!$$FT'7B6l}}}Ÿ+8}4z5+?(T{a̔Ʌn}x.uuuFq]Tuhp:|r >**sg0m6f{k5ж>Gv /^T?h4ŋɧ?Կf섥Kʢ> ̙3!''Z[[Sׯ_A) g0D/]xijR .@LL cӧPUUE1`3g1b1~L&nl6|zPs={|Bx-6H:u +:$ߟ?+oñcm'Nɓe|VBmU?~'^:$7`b23|qf`WT.DENX3Gr!%mGjj*ܸq|gxxuR{^߽{tp8 == uN f[L֯_v,X߿s%-[[-oFj۷=}|/XZr%Ν /^6sU^B0 +"]WBIIǞhc>}8:o}:\p޼yuuuX;w롩$""B?vͨä}w}wιO>EPP˵ s}syyyعs'~ƍVǎ(--Z5 RUU]?1 y1wWP27WD`p]4ŨLݭ=] LYLr9_t: tjwpp`˗/c֬Y"111App0~aÆMiiijLTT>fk117oDbb"ko߾ExxGJA6޿'''+Ψ! ˲o>lڴ)?cǎ,uֱ0RmG,v4Sb_xհرcM8=cmPVVZ-١K.\rrrx'Oψ#p̙6zI}}=B SGa)f ='!!!^LYLr9_t: tjԩS0a֬YZ~>="""P\\O>!//O7&&;gС(**BMM csΝCAAsQ^^&]&_{ܸqFl(JV7fxܻw}X&ڵ+~{"??ߤ~o(zٞӧaepݶm^B꒐Ϙk;)1{~\\\\]\tdɸx"-ZJe|?l!Xd 7V7WS-~ |޽… MWGB`gg?Щ?.+JC;zNBBB@qⳘrftPHHHRXXVm***jw"99Aee%X7dߘڲR[[O>e˖yQ{޼y0c 6)syܹsE|}}Y? | ftΆRFio~~ϟGlllOtNiРAf4sL~\t~o(z6l _ ΁\G… V՟Mwl ,X۷o۷̆=ڎ{J^?%%۷oǁcǎf2}eL&CRRT*Q۳g"55߷l!EEEpwwg{c5`˖-f=gI(>y͋b4`ccF3)>\.gNx.33ZWTT 22KJJx'|}}Y˗/1i$M6aԨQ, Cmm-nܸXqڴigggѣ]]]-SyT*hssszj=z4/_nǼyg51Tѹŋq!/Ѷ4 %ZEܬ=',L&c={r݊+PXXhIp̘1\k.l߾ߛk;)1{S9fCV{ +ի_~e1۳Z5::Zo?i̟8dee tjxz_~k׮&EG B`g/:Y)))HOO7*}bd"ue!L +-ɔK{իWxSg8x rrrZٳgjIHHXD;PNx.33ZSd풒̞=[`O9<u4~|c:G5)WӇ>>֞JAm?ߟك͛7[qVvvv MuׯG~~>7'׶wSb޽;[#G-nÆ 0x`1W.\|}|(--~ 8p|xϕ +pǜBo=3t̉9CU9u]}AGDDu.ԾsgϞ 㞇]P;S7n4> Tw/_s?C + + +|Nee%?~;xxV)q߻ц1s`Ĉ}>U;1+>} +zSs /_a$KfXtCŋ3ޅ)))T_`~***D_X__O>'77a܌ k}:?bxEs40|pشifEAy=V +yͤRVzvIo!a$t;v޽{aȐ!tF~QQQd1cAq>sLCFx̙Ck׮Q~}~Unw~z;AYM Pcaaa38O0Jdd$vh8p u\}S~GP|?vN9~N?d ehpZKR>ydf꛴Z.sw9 +} IH(R9={6fEf< f\Rzv"!}<s/_Baa!͛74hhhYf) +'UDZJyUnN {7n\Xwa2g5aaaþ}`ݽ^$I$Q)_իl6Cvv6h4NSdBDZbKJNR7Đ-*Zxpu hjjZgKK FaH$$$8!!!T}(..vێvtT߽{7ܹsHMM ̙3ǣ=a@YM Pdaaa|G$({aOƏ7oNQdBkr3Db9*Zx/_ x̛7SSSÇP]] Ϟ=V=%%Z[[޽{PQQχqAss3ܸq˕wՎvtT :X,^ρ]!??30Ar0 0 0 $I$Q)t:/Y!b58mzC DEkh# =nh4A寄9U;#44BBBa~3*22bPϲM/ 0 0 0HDEr/zQZ(Y!b"-1%g')v!az?aΝ`2 ++&Kaaaw$I"Ha=h-,_ E6+YL&7ߥ7ĐX2 /FfOj*'NS)6A\v5ס=__$<<ܥ-44Zwg`` DGG4u?`\6lt:h4ݽ^;?/=?cǎ{3^aҤI7CHHj߀C zj3$I$Q)|m2)b"̈́%ƹ$EzC 0 /}t|?0h 0`hM/x %%C<]|]ƨQܹs pB;bOk׮;wHxdl6Ljooj|F_=j+ UUUp!?{\YY .]Xrϰoy5;aMnl˖->wg7 pa8r*;wt\?~{i$ЊT&D1,1gΜwK?X}Z>{Ykmp/*{ :>D?Zp +)>bppp`j^l\b:^h4&mkizW*ZOO)))pႉ><<;CT544@R }t_8|Rsp,#z233Q^^nrHP(6ńj#=!8 =͇sssuV֦ɓy&L={>Z~#76m06؈SZZXׯlb{@wB*ӓ2t֕ppa"KȖp)>KVeg[ӱrJҥKkא˗/Çx멨F1i9wAcc# + + +`oooq]eeex rrr/&&EEElmO6g[رC tV^mޟ3g^z!C@Tӧ6;ƨQO899 }Rϑƚ3AAA_AZZp\=/!=ɇU*~q }v߻wc#ݻwYAu̙3ecggj_=ǎMlT RM/^lo]1wIZ[[t:v;GIX5)A9P\,%Zm

|(ϟ+k4˗@혘9,'22lL0hgϞ!,, j555FٞbҥjnnW;N{"V+ +8q޽ױ`1lق[n}|Ǭ#5guvvfqݝŕw <(]iC5q\=/=b{ؓ|xhmmG5ٍ7/_YYYloqyiX b߻d۔|`?)?ܹSh4Fm| >>>ĺup9,Ɖީ8uꔑ^zVZ%S%X߯_?ܾ}hiia`kkkb7w\TWWŨjSböm۬#g!22ށ8!~:͞=H}sr8Gl{ZRP}qqq(++^xcƌ+fDGG#%%#򆷷7B! 2exx)BCC~7\]YYLT*RMZ۴i:9= }?Ncw/eWV2$Ꮰ_<͠LYJZ-? Yp!ˏTTT@aaahll4ٱcΝ;gboSinnz"""/ ,ZϞ=3ѷw=2Y_OCa1qDV̚5 /_9/}޽{k|494bK1 ǏgRRR*vwXGLL >~RiV}z\}OGN݇ +GGG/-- EEEVo/666l@pp08iYH4iÇ#++KtLBdbŊ8s su/hZ?`gg){ w t6$:ݽgPG>56gbB팽p)>K ciPZmGR'NdI+..Mm???|nnnfvP5_z l޼&QQQfm{b~MM f̘!Ν;»71n89 6Li:zX_OOO,^Xܺu8|4 y8+g=m۶Ye/g}ac5B;:Tի>}07TR,:hjjB>},Ѥ*RyPOON^tGXf]kUL2Yq֯^fP\,%Zz~A޽+**hw")) 6663f |nhoS-//Ν;Y%(Lj!װc5jee%Ҍپ};[QVVpyڻRDEEI@Gݻ'OoT:t7ndw:Csp,Ӟ@vvy]_z(ɬ-ar=q@l޽쌆xyy D̛7O a#44ՊGv:u +JղOz|:z +wEZZڠG.. VY}V _egg{NǾ{xy bÇ;xT*nܸ}ܾ}%%%|5槼܆=Ӈkڵ>>>HIIׯ{>.((y&v;`ڴiC$ߏ&l6{/矐gf|3bnnrzBpaFk׮ؼyeeeȑ#}BBΞ= +X,(444w}N> IiJKKyuU'ϙ3˟[ɓ'hoom$>:55^ާ޽{$0;L<߿ hD +`c.f$0wA*vːĒw0=[,ʘ4iO} ~dLeeK.. VY}=W3l{ҘHR/ֻ$=e yb`iӠ}i _:u CV/}rr2BCC {ߘY;VCO}f6}ᯏfqT*>W(rG宨X_ +D=.٩u,˾O=cnFNwO ww^|v⺭[i0$;wʕ+XfdÇ%?rqeddr +8L8[,?\A VY}ϾxaL:u,BAAA|P=rE~bg4› y Gڼ٘#V|oƬF= +ۍ/˹sx޵Z-׻\.t:>v:0L|7o **yLKKCvv6 + y,lv;>˗Xq.]]]0z>ϟ66.. s1;FuYYYl.,'V{AAAE hK!v]7X$ I)Xr$2BR ʗhZ-;2\.t:;NL&VTbÆ {4 ^^DGG#, v۷oVP(FẬ,l6\A VY}=W   bE~bg4ؽytqo:n)RRѨP(vh4JZ]. :v;f3 ,,7n܈gz4 ^͛7XhQH\J\ .H===0Lɇׯ_f;ACeVjr{ϕ   >(rmsuc,L$2"<<|H>n7FtjyٕrxӦMhooGaa!f̘Nաa> Cݍ7n4<|n݂ܹs%b8N6M {Vjr{ϕ Ctt:Z`$$$ kn6}]/1<KYϫP(F17pS^;}WT|̾ĿለQ E h㙿vc9v/uRl;0a¨Idd䠞g{ɓGdT*)F3lAeVjr{ϕqI}v+ Hgg'^x<}%%%cҸbʔ)BWW.]OzJ\%҂˗/n#77|\^~=(v9,{g٩SPZZ +$~~sc2}{֬YhmmE]]<8m[[&N8b" D HTm.-f-B`NISTcfFP(|:YVFaQQXfYdcbːMbVqˌΝ;.g<˹O=k +^TY2׍_<$i k >n}{jBLYr6^w%ƍj]ؤ\=q6]1j5d20aaСͶ ;7Bbb".\YpU=:Fck)iPT~t1q4RqDw)fzM+TБR8pr]VVRRR=]yy9ƌƍL;{a}fGG_ݻvߣG{ƍ1/_nH1gMP0ٰ͒/׍Q.p \.guWrׯ)jccÞhZw.۷G=zgϞL&c6n܈۷0(,,ħOpAѵjo߾a޼yytSa-[x9lmmڵkӧOǛ7oзo_鉺:}ߦF 8qb;̨s!R>i>IIIkYY|M#ɓ'ƍX|9T*;Kujkk1|pՂMolܹGGG0-J֭[#c_X$-c]~=VZ%>٠(իWY>urrBHH>~(؟?> rFApp0뷲˗/1~x(6Z LkkkjjjxA͞=_~}I%%%k\?>ڵk3g;v͛}x5>4ٙiŋSsH#H8i#hurXݻ7={cҥPT-)y{{ӽ{w4[GgCjZ?hʆaظ/1q=LY%tWC _ƞQ]]#F 6mÇٻ=z l#&&I,_\x~еkWkSո>޾} V ~s9tXibyVV~ֶѸ3fիWpuu5' ͛7ͲϑpwwGPPcǎmY}#R>18B^vmSLiunXҥKR [R `yZ苍eZ}ի "11{GĔ4'o'$$Ljx }ƴ[Syhs~j +^'JL\$6 mip8)>K5\b͚55jʄ~555{N8ޅA!e2 F+V3VKN4Itmj)))fZǴiΝ;qY=11=j*|غu O 4_M1cg4ѣL޽#c9anϟaggF3,X ;v5[/_Drr0ƒr]Yqrrȑ#oHnٲ8p@o /HHHrJ>}gܹHKK33M4߿U1'49:j +^Tq8@qT]CII ˽JR_7cWr3 ]Bd\+V֖iC]t16Z L֨%&ŋؿIEEE4Qׯ1a911³/.Æ cgگ_?sؠ]۷oo9Ҙtq4M#NNNl`f_^^^XhΜ97o"<<\cIYUU#G 55pn~ĉLf}I+u5߇6PK ]g杆>G맦P(XE5p:)>K5\8;;_~eBRIvQ\\L:٨Ē%KX{fŋHJJbKXߦ>j2Q=+++@ղ5e4RlsDhVVv%<|#Tۏ?S5s Xriʽ{޽{C`ذaիWc̙f?շhf4355fe-+#6 ehB" q))z`K-%&PJflRBl*0fJ眽{}Yk/3ɓt>==pwwǵkkE*o]?{{{>""iGG?[u.`={yybL #=s& wvvBL1ⳔznoAAA?d"X6IB oo'_[9Q#G!N:ʕ+ׇ`vLv̚5?ҥK[nŃݪU.\xqvACC-'$$pbbbD}rr2C1P8w۴iq]l۶b۷ ߇NuZֆ[nAR1==>}s=zTeDs{   qL&AxjLZ@_h?2Pg^/"(BQPEy/#;k.6L^TgN*O? + 1k,ݻ}}}زe f̘.nѢE|˗b|;vRɓ'P߼hD||<*ioo7 +?}1ϕ###kq=:;;f?55-Fį,>K^+AAAL&. ڋhә-TgAx?z O0g888O7̀S;tH엑2@yy9!+JtPZZ*jkk1*;GGG,_' @|V(yjqMc4Q\\N$''WFOOtuuaݺu\~~~mww7VXӧbV}d h4MSY|^bĂ :,a̙fϞ Zs5vvv\2w ~PRMS;g\@Xg$pԬ~JFG3;Ӳo1P̚^L&. ڋhә-Tml]JKKj6`2S$wssC?֮]bkT*NӡJev~~~>..W^uŋHJJ† 088hu3OFzz:m]F#VZ7o`ܹ=** + Wݍ#<<b;޿/Gk> h4kMSY^WFMM :::| srr2qrrBVV^|7n"ot 3/^3fX?{ Lg{}ףSÇ(++q=!!~…|?UTT#=UUUx]BB\XXDb_̙3g444@*W[[}VVtbF{͛CBBP[[i}dzg[k`2gRz+T%%%SMX^^␞T| <==7 ..@jT*zoC?''Ǥ|,gP]gȐ!}xMHc]{xx8r9ιKvHfׯFqS<Ɓ#GիWfBr +:鿠igB\(R~,((imbbb/[m?)c50'N`s +-lL% A~iA~/$$w/ TwttVQ/r_s8rH}ɼ:;Xk.Nw^|/_DZZ*++9NL&c+W48UUUx޼y/^ //O>Çwmmm dΨAzz:{^`>|'OJgXt)/!!" z6l۷QDd0@qPTlFQglooGxx<>|Mu3y5Ҙ=SH1"#..uuu)Sq*B0QsKr߿+W ǎ=^ױ֧[oĉ3f n݊={ !!&ݍYƴxB*}x۷oqrshmmeu\.޽{qE&~Yfg TiPլo/#3;YtFas2 zED3)> J]h4Ldd$Fo߾rѣ,'>|gϞkZ(J]v_NNNLJ3f ;;wULp|ruSRRXOyf\~F{M՟"؆s)8pB UUUܳg\<й߹s'gT?9$;w~hllĎ;ZZoSkb߾}ٳgm^|t'fYPWW%KR}˗/7M3&bbb/HII16lt:˵B:R)~tlݺ '(5ZJGAgL4{Lƞ% ғj/>nݒTu=]}@SL)8 ˑȍTTT 66NV.܌pnҥKʲUsܒ\̞={NMMEeeel/)sssc:u*/_ N̲4Y---6 +~;v?Ez; . ,-v8[ZZZsX׮] ٳs?˧~dڰ3 ۽{7:flzj5Ϟ+{`Z'gϒbɒ%@BBBB? ˤ$5M29UUUn؈]v6i+WϵޥhjjR^9N^Gaa!sdǣ& }vvv&1g2:m4gzQmwnd2ͬ>SZC勊`0^{AMM͸Ajj*bbbB, Cžs7D+xyYyH{/֣f./E!dˬ>k^H!B=p8fzdY!IX6a.(ʑB!BHdY!IXMb@"B2eVBE>^9B!B ,<$IѢIUskG4_K!A2Z!" !B!Oe$ދhѤ|]QyC\!j\mlaQ#=zLm^'a軉85BV+GB!B!e$Ib=Z4j.+ Ad2#U םH[wIkzIɣ tyض!d=&uxF"52,8Z5z n\m`R#b̈́a.(ʑB!BHdY!IXMKw"Ú v&|{ؾVz]4_˫ƻEF| [sGv6N[,\8,rPq&|񉋟rw潅m'5SP8l*VA#֔Y'{duN4珖P^zvxȕs?ox`f%!X]fY+DQ#!B!ɲC${-T5•ĖM/؎ǟ#Lk/aƶ6V:/h@ Gw4 \/,fڪ~~t8m9,?_+{^wWZK`OZGsl{_{`s>լzs+clĺ|M׳X]f~IrXnv}ey:<] cugEWB!B'2IxzhR\ +WbK&4.m܁nNCņd YuHjiA֭uu~_|./_ĆUXblϦkCݠ=X;N[f1>7?!%Q_ÖG\y,OA/f=ֻ'[^'&!?~\rg$_̴W yc<2!X]fY+DQ#!B!ɲC${-T5•uǑ Aƽ :=(MP#5Iuy~OU.\8ypb5s,18/T2VƿvM8/|A/غֻ'[^'D5yH|+wh^?>s|{?Eպ/)BanG!dˬi(|r$B!>YyH{/֣*fPĀ2 ٶ[PĤv:cI:9ӒYcZL -d]"6Yׄ6!FQ õ&G0238;[|?7s=<-@Nwqĺ~ NvX?U<7sк5Y4|C.VP + wן6RyɶЍ2fZaK _{_sN@l/dpO_m?0iR~q%y;~'ߦˠn2'yf`˺>NJ#$N)őRr{I[uE׮]nZf[;y8b}C>ZE>ύܽPAs2|} 7<ُrCvZav/'B7:#R~^y+l?6Jbmzo~YښS,EQ~3iR鮠Y¨Y}>m-_E+-6U_K w߿]u}!7FHR#Kh@9o~z_#G{=Ko +ի|͌\<{{+h|>U9鮈wl ,;,/|fx߱u`˺>NJ#$N)őRr{I[%G?wpyM+72]u}!7FHR#Kh{iڂ*]u}!7FHR#Kh"iڂyk: I.Je]cEH)=Z2Fs 9q{]os1~7,/.+Bo8GJɽђE6.uО=`0h}O911A[n5?N˗n +nGazl6ے~w@uYXB~c)8RJtL-Gw#h>w3Ϟ=Kmmm}bŞԢ벮ϱkf8GJɽђE6sw#h>7TWWG###dh``hhh\.UVVĄBYVs1LE}}}najnnv$C433Ci5q:<1WUU,effFŞԣ벮ϱ"SJq{-Zd9w:{;>>Nuuu422B6rQee%MLL( +jk=w8k]]]Gz8fjooAx>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(153)Tj +/TT1 1 Tf +0 Tc 0 Tw -20.132 57.06 Td +(vegas_casino_bandits_police_and)Tj +/TT0 1 Tf +(\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +19.485 0 Td +(and )Tj +1.966 0 Td +(they )Tj +2.188 0 Td +(gener)Tj +2.377 0 Td +(ate )Tj +1.632 0 Td +(the )Tj +1.688 0 Td +(statistics)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +( )Tj +4.087 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.41 0 Td +(three )Tj +2.521 0 Td +(remaining )Tj +-37.866 -1.44 Td +(threads )Tj +3.644 0 Td +(access )Tj +3.31 0 Td +(the )Tj +1.866 0 Td +(statistics )Tj +4.089 0 Td +(\()Tj +/TT1 1 Tf +(/x-ray/resources/hitsperminute)Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +19.091 0 Td +(/x-ray/resources/)Tj +-31.998 -1.44 Td +(hits)Tj +/TT0 1 Tf +( )Tj +2.745 0 Td +(and )Tj +/TT1 1 Tf +1.957 0 Td +(/x-ray/resources/mostpopular)Tj +/TT0 1 Tf +(\) )Tj +17.425 0 Td +(via )Tj +1.623 0 Td +(the )Tj +1.679 0 Td +(REST )Tj +2.475 0 Td +(API. )Tj +2.124 0 Td +(My )Tj +1.734 0 Td +(laptop )Tj +3.069 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.234 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.845 0 Td +(fully)Tj +-40.31 -1.44 Td +(utilized, )Tj +4.19 0 Td +(so )Tj +/C2_0 1 Tf +1.633 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(guring )Tj +5.579 0 Td +(more )Tj +2.91 0 Td +(threads )Tj +3.8 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.634 0 Td +(not )Tj +2.078 0 Td +(increase )Tj +4.244 0 Td +(the )Tj +2.022 0 Td +(load. )Tj +2.856 0 Td +(JMeter )Tj +3.466 0 Td +(measures )Tj +4.688 0 Td +(the )Tj +-40.866 -1.44 Td +(throughput, )Tj +5.46 0 Td +(minimum, )Tj +4.902 0 Td +(maximum, )Tj +5.068 0 Td +(and )Tj +2.069 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age )Tj +1.957 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(ocation )Tj +3.681 0 Td +(time, )Tj +2.624 0 Td +(and )Tj +2.069 0 Td +(it )Tj +1.013 0 Td +(is )Tj +1.124 0 Td +(able )Tj +2.291 0 Td +(to )Tj +1.291 0 Td +(visualize )Tj +4.236 0 Td +(the )Tj +-40.866 -1.44 Td +(results in tables and diagr)Tj +10.937 0 Td +(ams.)Tj +-9.137 -2.24 Td +(I )Tj +0.694 0 Td +(used )Tj +2.326 0 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.974 0 Td +(\()Tj +(http://visualvm.ja)Tj +7.64 0 Td +(v)Tj +0.476 0 Td +(a.net/)Tj +(\) )Tj +3.084 0 Td +(to )Tj +1.25 0 Td +(monitor )Tj +3.807 0 Td +(the )Tj +1.75 0 Td +(runtime )Tj +3.751 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(. )Tj +0.602 0 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.974 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(es )Tj +-41.311 -1.44 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.493 0 Td +(some )Tj +2.659 0 Td +(insights )Tj +3.605 0 Td +(into )Tj +2.049 0 Td +(the )Tj +1.715 0 Td +(JVM )Tj +2.215 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.048 0 Td +(and )Tj +1.993 0 Td +(is )Tj +1.048 0 Td +(described )Tj +4.549 0 Td +(as )Tj +1.27 0 Td +(\223)Tj +/TT3 1 Tf +(\205a )Tj +2.325 0 Td +(visual )Tj +2.808 0 Td +(tool )Tj +2.03 0 Td +(integr)Tj +2.414 0 Td +(ating )Tj +2.474 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al)Tj +-41.459 -1.44 Td +(commandline )Tj +6.264 0 Td +(JDK )Tj +2.041 0 Td +(tools )Tj +2.412 0 Td +(and )Tj +2.004 0 Td +(lightweight )Tj +/C2_1 1 Tf +5.079 0 Td +<003200340031003F>Tj +/TT3 1 Tf +(ling )Tj +3.893 0 Td +(capabilities. )Tj +5.449 0 Td +(Designed )Tj +4.412 0 Td +(for )Tj +1.541 0 Td +(both )Tj +2.356 0 Td +(production )Tj +5.116 0 Td +(and )Tj +-40.57 -1.44 Td +(dev)Tj +1.562 0 Td +(elopment )Tj +4.399 0 Td +(time )Tj +2.213 0 Td +(use, )Tj +2.066 0 Td +(it )Tj +0.88 0 Td +(further )Tj +3.195 0 Td +(enhances )Tj +4.4 0 Td +(the )Tj +1.695 0 Td +(capability )Tj +4.51 0 Td +(of )Tj +1.177 0 Td +(monitoring )Tj +5.011 0 Td +(and )Tj +1.973 0 Td +(performance )Tj +5.806 0 Td +(analysis )Tj +-38.884 -1.44 Td +(for the J)Tj +3.341 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a SE platform\205)Tj +/TT0 1 Tf +(\224)Tj +-2.487 -2.24 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.946 0 Td +(is )Tj +1.056 0 Td +(currently )Tj +4.223 0 Td +(bundled )Tj +3.947 0 Td +(with )Tj +2.279 0 Td +(JDK )Tj +2.056 0 Td +(1.6, )Tj +2.057 0 Td +(but )Tj +1.779 0 Td +(it )Tj +0.945 0 Td +(is )Tj +1.056 0 Td +(w)Tj +0.766 0 Td +(orth )Tj +2.112 0 Td +(using )Tj +2.668 0 Td +(the )Tj +1.723 0 Td +(more )Tj +2.611 0 Td +(recent )Tj +3.056 0 Td +(v)Tj +0.488 0 Td +(ersions )Tj +-39.199 -1.44 Td +(from the )Tj +3.798 0 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.798 0 Td +(W)Tj +0.963 0 Td +(eb site. )Tj +-7.389 -2.24 Td +(During )Tj +3.368 0 Td +(the )Tj +1.701 0 Td +(stress )Tj +2.645 0 Td +(test)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.062 0 Td +(I )Tj +0.645 0 Td +(used )Tj +2.276 0 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.924 0 Td +(to )Tj +1.201 0 Td +(monitor )Tj +3.757 0 Td +(the )Tj +1.701 0 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.59 0 Td +(JVM. )Tj +2.479 0 Td +(P)Tj +0.464 0 Td +(articularly )Tj +4.701 0 Td +(interesting )Tj +-37.754 -1.44 Td +(w)Tj +0.76 0 Td +(as )Tj +1.309 0 Td +(information )Tj +5.422 0 Td +(about )Tj +2.866 0 Td +(the )Tj +1.754 0 Td +(memory )Tj +3.975 0 Td +(consumption, )Tj +6.312 0 Td +(number )Tj +3.754 0 Td +(of )Tj +1.254 0 Td +(threads, )Tj +3.81 0 Td +(and )Tj +2.032 0 Td +(CPU )Tj +2.421 0 Td +(utilization. )Tj +4.96 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(V)Tj +0.63 0 Td +(isualVM-MBeans )Tj +7.894 0 Td +(plug-in )Tj +3.616 0 Td +(allo)Tj +1.6 0 Td +(ws )Tj +1.726 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.671 0 Td +(to )Tj +1.393 0 Td +(integr)Tj +2.433 0 Td +(ate )Tj +1.837 0 Td +(JMX )Tj +2.337 0 Td +(MBean )Tj +3.615 0 Td +(view )Tj +2.615 0 Td +(and )Tj +2.171 0 Td +(it )Tj +1.115 0 Td +(makes )Tj +3.281 0 Td +(JConsole )Tj +-38.42 -1.44 Td +(obsolete. )Tj +4.166 0 Td +(V)Tj +0.63 0 Td +(isual )Tj +2.368 0 Td +(GC )Tj +1.812 0 Td +(is )Tj +1.034 0 Td +(useful )Tj +2.924 0 Td +(for )Tj +1.534 0 Td +(visualizing )Tj +4.98 0 Td +(Garbage )Tj +4.034 0 Td +(Collector )Tj +4.313 0 Td +(acti)Tj +1.538 0 Td +(vities )Tj +2.59 0 Td +(during )Tj +3.146 0 Td +(stress )Tj +2.645 0 Td +(tests. )Tj +2.479 0 Td +(Both)Tj +-40.199 -1.44 Td +(plug)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(ins were installed with the plug)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(in manager)Tj +20.767 0 Td +(.)Tj +/TT4 1 Tf +12 0 0 12 57 324.4001 Tm +(...and Ho)Tj +4.046 0 Td +(w Did It P)Tj +4.401 0 Td +(erform?)Tj +/TT0 1 Tf +10 0 0 10 75 302.0001 Tm +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.813 0 Td +(performance )Tj +5.758 0 Td +(turned )Tj +3.092 0 Td +(out )Tj +1.703 0 Td +(to )Tj +1.147 0 Td +(be )Tj +/C2_0 1 Tf +1.369 0 Td +<005D>Tj +/TT0 1 Tf +(v)Tj +1.044 0 Td +(e )Tj +0.813 0 Td +(times )Tj +2.591 0 Td +(better )Tj +2.758 0 Td +(than )Tj +2.203 0 Td +(Roller )Tj +2.869 0 Td +(weblogger)Tj +4.427 0 Td +(. )Tj +0.591 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.813 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.202 0 Td +(able )Tj +2.147 0 Td +(to )Tj +-41.366 -1.44 Td +(handle )Tj +3.415 0 Td +(more )Tj +2.691 0 Td +(than )Tj +2.359 0 Td +(1.5k )Tj +2.359 0 Td +(tr)Tj +0.599 0 Td +(ansactions )Tj +4.971 0 Td +(per )Tj +1.858 0 Td +(second, )Tj +3.804 0 Td +(and )Tj +2.081 0 Td +(Roller )Tj +3.025 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.358 0 Td +(less )Tj +2.025 0 Td +(than )Tj +2.359 0 Td +(50 )Tj +1.581 0 Td +(tr)Tj +0.599 0 Td +(ansactions )Tj +4.971 0 Td +(per )Tj +-40.811 -1.44 Td +(second. )Tj +3.699 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.327 0 Td +(are )Tj +1.771 0 Td +(about )Tj +2.884 0 Td +(15k )Tj +2.05 0 Td +(visitors )Tj +3.439 0 Td +(a )Tj +0.938 0 Td +(da)Tj +1.026 0 Td +(y )Tj +0.938 0 Td +(on )Tj +1.55 0 Td +(m)Tj +0.821 0 Td +(y )Tj +0.938 0 Td +(blog, )Tj +2.606 0 Td +(so )Tj +1.383 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.938 0 Td +(could )Tj +2.884 0 Td +(handle )Tj +3.384 0 Td +(the )Tj +1.772 0 Td +(load )Tj +2.328 0 Td +(in )Tj +1.272 0 Td +(10 )Tj +-41.088 -1.44 Td +(seconds :-\).)Tj +ET +q +484 226.8 -407 -105 re +W n +q +407.7445221 0 0 105.6624603 76.6687622 121.4687805 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +10 0 0 10 75 102.4 Tm +(F)Tj +0.482 0 Td +(igure 7: JMeter Setup and P)Tj +11.682 0 Td +(erformance Results)Tj +-12.164 -2.24 Td +(It )Tj +1.114 0 Td +(is )Tj +1.225 0 Td +(important )Tj +4.726 0 Td +(to )Tj +1.392 0 Td +(note )Tj +2.448 0 Td +(that )Tj +2.17 0 Td +(ev)Tj +0.988 0 Td +(ery )Tj +1.891 0 Td +(page )Tj +2.614 0 Td +(view )Tj +2.614 0 Td +(also )Tj +2.281 0 Td +(initiates )Tj +3.893 0 Td +(sev)Tj +1.377 0 Td +(er)Tj +0.821 0 Td +(al )Tj +1.336 0 Td +(REST )Tj +2.725 0 Td +(requests )Tj +4.059 0 Td +(to )Tj +1.392 0 Td +(the )Tj +ET + +endstream +endobj +365 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 366 0 R>>endobj +366 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(154)Tj +0 Tc 0 Tw -20.132 57.06 Td +(bac)Tj +1.538 0 Td +(kend, )Tj +2.949 0 Td +(so )Tj +1.504 0 Td +(the )Tj +1.893 0 Td +(actual )Tj +3.171 0 Td +(throughput )Tj +5.284 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.448 0 Td +(ev)Tj +0.988 0 Td +(en )Tj +1.615 0 Td +(higher)Tj +2.649 0 Td +(. )Tj +0.837 0 Td +(During )Tj +3.56 0 Td +(the )Tj +1.893 0 Td +(dur)Tj +1.433 0 Td +(ation )Tj +2.727 0 Td +(of )Tj +1.393 0 Td +(the )Tj +1.893 0 Td +(stress )Tj +2.837 0 Td +(tests)Tj +( )Tj +-40.366 -1.44 Td +(\(approximately )Tj +6.869 0 Td +(half )Tj +2.035 0 Td +(an )Tj +1.479 0 Td +(hour\))Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.952 0 Td +(no )Tj +1.535 0 Td +(jobs )Tj +2.202 0 Td +(were )Tj +2.534 0 Td +(rejected )Tj +3.868 0 Td +(and )Tj +2.035 0 Td +(so )Tj +1.368 0 Td +(no )Tj +1.535 0 Td +(statistics )Tj +3.98 0 Td +(were )Tj +2.534 0 Td +(lost. )Tj +2.128 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.479 0 Td +(slo)Tj +1.211 0 Td +(west)Tj +( )Tj +-40.255 -1.44 Td +(POST )Tj +3.174 0 Td +(request )Tj +3.841 0 Td +(took )Tj +2.619 0 Td +(52 )Tj +1.841 0 Td +(ms. )Tj +2.155 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.785 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(all )Tj +1.785 0 Td +(performance )Tj +6.174 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.618 0 Td +(acceptable )Tj +5.397 0 Td +(as )Tj +1.618 0 Td +(well. )Tj +2.841 0 Td +(Only )Tj +2.896 0 Td +(the )Tj +-40.866 -1.44 Td +(async)Tj +2.427 0 Td +(hronous )Tj +4.018 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +/C2_0 1 Tf +1.572 0 Td +<005E>Tj +/TT0 1 Tf +(ushing )Tj +3.907 0 Td +(took )Tj +2.406 0 Td +(about )Tj +2.962 0 Td +(4 )Tj +1.072 0 Td +(seconds )Tj +3.962 0 Td +(\(see )Tj +2.183 0 Td +(Listing )Tj +3.295 0 Td +(84\). )Tj +2.147 0 Td +(All )Tj +1.739 0 Td +(other )Tj +2.739 0 Td +(methods )Tj +4.184 0 Td +(were )Tj +-40.089 -1.44 Td +(performed in less than one second.)Tj +/TT2 1 Tf +0 -1.79 TD +()Tj +T* +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +()Tj +0 -1.79 TD +( )Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 84: Slo)Tj +6.047 0 Td +(west Methods During Stress )Tj +12.097 0 Td +(T)Tj +0.456 0 Td +(est)Tj +-16.8 -2.24 Td +(GlassF)Tj +2.816 0 Td +(ish )Tj +1.637 0 Td +(allocated )Tj +4.36 0 Td +(130 )Tj +2.082 0 Td +(MB )Tj +1.914 0 Td +(of )Tj +1.248 0 Td +(RAM )Tj +2.581 0 Td +(during )Tj +3.193 0 Td +(the )Tj +1.748 0 Td +(stress )Tj +2.692 0 Td +(tests )Tj +2.248 0 Td +(and )Tj +2.026 0 Td +(used )Tj +2.415 0 Td +(thirteen )Tj +3.693 0 Td +(more )Tj +2.636 0 Td +(threads )Tj +-39.088 -1.44 Td +(\(Li)Tj +1.038 0 Td +(v)Tj +0.488 0 Td +(e P)Tj +1.289 0 Td +(eak 89\) than in the idle state \(see F)Tj +14.878 0 Td +(igure 8\).)Tj +ET + +endstream +endobj +367 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 369 0 R>>endobj +368 0 obj<>/Name/X/Subtype/Image/ColorSpace/DeviceCMYK/Height 512/Filter/FlateDecode/Width 810/Length 46956/Type/XObject/BitsPerComponent 8>>stream +HiHToCimN"J-jT0AD (m! +ZhJH[}]6Ң( yQߌu࢙sΌgl<ϹEMѐ!C\үXݿ_"9"""GsJNu3wLDDDDD 9Z)DDDDDbN!""""s +5SyzzJ||ɮ]dɒ%2qDҥ?~x={̚5Ko 611Q"##d2ɔ)Su9cN,RUUjzl2;v|ퟍ\3攛7oʶmjmS69Z7o,|3Bttm߁$55Uv)z͚ռ~_5wPVV&;v~ynk\pp5Q#??~5KcN!"RsuQTΚS}ZksVkUbb 0@*Z-ZןsJffd5rH)uݻw?k„ ҧO}լ^flR۲l7n(w3z_j С~M}A@͜9S^~ Qxx~ >q|1b+,,4mک|DD԰Խ;R:YsʶmjmW9l6ڵkrU[F'M$7nܐw^ze7lذ+**$55թsJ]kdll>+WHAA-뚫f5kؽWmllsu 6l{ } >d)))q}qxgddԹ/??_Μ9cm:GDDO#;wԩ5<qj!߿|Μ9ɤ+))ɩsJ]kd=3fL9źgeeٽG9BDMy %%EڶmiF%,,L?w4,_\|" 󒞞FDDo׮]3zl^ƚSTj]x>h49R)}P9x|nNϗ@}k]=Ԍν[nyΝK?9EeXWZUSz)DԚ1cnk_aaF:u^sJǎX\\Νooo.""r]9$77Wo˘1c'OʷoߤLϟ׳G攳gJQQ~}s>}Zgݻw9cNQ5\}O>۷B^x!QQQ >"jK>}ӳH@@?>g) WBBBjm7LFuNQ;w=z;'un~~~. + +HuDDDDDsJC)ΜSqjsܹsl63#59ObN!""""j~1QS9ZœBDD : (Zr4ybXd֭2m4 u$$$ȦMl6K֭gHHɺuvL&zͼy$,,> lADD9;pKLL?^Zh-[eɒ%Ү]#)))vZ۷>nݺKEE(b=` J;(h%KDBĂQ+XbQ1*V`]#(" +˹_dwy_{+޼s=WVZ4|pڰaM:jԨ9ёMfNNNgk׮2ÜNc?sd:t(ϙ4iTRsmeff2!>}%ͣ4#-yxxXqsG|[/bccUݛ>LΝS~GO/Iqw>q۷oSRR?ׇ8_ĿΝϟ?_j^O`` ݽ{W5k~_k?BBBr,ejɜ! ~x_̽zѠAU +bjj* %N1/8ǏvNZv[Ni/X>}JK8jذ!)S222X{c:f:uٙ @TŚ8|0呋נAjڴ)s@ʕ͛K)v={(mh&99mqk򵓓-OZ_S⼬~ڷoO߿Zj#עNj,_/@|=>}kZӺNwG{]]z3g=|Pf͚ѡCb YnݺE>}7oҼyևq-]ן8q20::K_hOA-ZPp]TTz{E ct?! 5jԈ5--[\B;v}6Cq5<=BfwLbovXhJ =}4B +b +>|bqJJ +jk_LJ \mJ@N y +j.]OKKSՔ!wpmCV<.]D۷o7C^{9c:E-Iq;̸! }XժU[Ye>иqc4x<aTX;ΫG=>>4Ƞ3fh_j0=~Ϧ9xzzw2:u9r$nVZ;V;{,糆zI~~~t8n80TXX>=z'N0yd6|GU+C'\QQQt*_ZxիW+mwwwN49B6l+W3s:@ܐS4!!=v 29Jnnnc=j@z&puf͚Eo޼a~W[s>&@FLY&ܹQ?СCm{)9+$$j׮VӉ9޸)O<… $!롴(556n={Y3ΫgϦ{i8$b?jwq㿥|5dg߳CǏl"W|nݪg"<ҥKFT\ySL>nCȁ8p O#BV/ZPi~ ApE3nG$''Ӻu4目\k587%_sZjeԟdlٲe0q]ǀ)w*V}ֈ@ƍ)33S9Gjψ{-խ[^ZCF'O|z㦀KLL7or^0aMPZ~H=z6r^ҏ}w﮹΀=zo>z2GURgӇS/+P;4hhĔz⾅ j+Stؑ1:88{.[s^^eeeS}XC)kD +W< W T|NR>LWy$,,|m۶UׯORRR?&&zi3RSSʆb= +ٳG~:eFmҩS'nڴ|5CCC/((V\I\X:|<]>Tl}8o+zF筚M8 ֭[Jch)1޿:O.:\T̛7/CԡCsΥX83gR߾lذ Mm6k˖-0e㕕 \|rK0$++ ?~P!9_`7W-~I娯x[Pм*8>t7> DoE)d}6xxx>%MqWRS˗/BvصkرcٳbbsssJKKСC`hhH_xAu.]B9ޱcGIoc 6mDvooo޽[o D;YQQA xB 2n8YaHjj*Fơk7j8m󡃛ҥKa̙;wRߵׯ_wll,5Xݩm_sbB(j<. `(zBCC:8{?⤿۟>vDÆ S~(K-}H:799ޫO>)锾O^^{NwT[W}/{p|W^ymmm-h}dT2U)}uk4jbb7+_.R|/]'{ۀS_r)SQKkmcll5 q9!j\M[l#\U0õ c +j7GGGȇuaҤID1*0 e`mm>OƌCsk?OTLJJ"$ uvvv0{~w5k̘1C}]uq'cJ[>h}B/o+upp\Q|/}'c"hiiׯ_(X02x7wwwCvv@/aJaٲe| 8>^aaapQ̄kׂ@/ap0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 06oެTEDFFBVVlٲf̘kÇÆ M\\XB뜦fHOO9rhsww,sL<bbb 11,X G{{{$psse766y cƌQ) +4 KKKsz7n1 0 0`ѣG/hiiYʓ'OȖvrXE{DDdggæMחAaa!_ѣZ笪cǎAXXTVV*Gq=۷o'-z4 +4΅RRR ##~ +AAA5҇t&LP_PP@{õ9sF|wޅ:Vx-=Zy0 0 0`@)X|}}z)O>թy4={HM<<)III5tvvaB~~>Hqrr8 +e@RSS===p9>++ ?~ :PQQ?;w@TTh'ZaԨQT/_\?vR}tԩS̙#ֽ|nݪޱϟ?i^u߿ź6Qy9::ׯ4?G#ENQƍ.)V:&0`u99(Py&tvvZLLLbbb@U@HH,Z>}h?r9q$[PPRSSծBGGCBB?WիzcccZKdd$@ss3/jcΝ… PTTjEDD@UUʊvzHLL=<eLCh0LݢFET1.-NV ~JV(rCqWG*/" WfNvFs_pμy'{3jzJQQȊ )&GgΜ6 D 444-Z$y-Sdl6XsߑIKKo߾}E-YYY4aZt)={^zE.+ѣc +Jv999bN=(ŋ15;O8AO>'OͥSqqoԨQb>rǏ&|~_HUUU79***B뭧QwwwydtvvիWż^$I0)9"G#rOuׯ_t)ڹsX)]nX~޼y#CY]]-Kř𚿭-xffAV}-YD9@\ȑ# V|GO>֓CnԓtqiӦ),WZZw-X@kǎo>0x=%??={F .9 -[ &\vm#b~#r4Qz!b78qbDOSxOӧݼySyl߾}|m/_^qYe6nܨlvq '_N+VP'}EEE"YfE|Ç!rrrT>X/^Y$VOrGUu=ٵkݾ}[w ~s2IpO-cq}$={ /_\LSSݸqRSS6cǎ)#%⼱z֭[t: }XV*((wΝ;c1bgCyϙfjooϥuuu!C1)9"G#={Jzz:y^wX˿z-[F?~RqqgI&ѷoٳg7.X@m۶ײtRׯӝ;wh$I2;wϟ޽{)++K/_S0a2~ dNO=FgggH/b^xsmϝ]]]"+WPvvv6l p8իC{Nɔ{/k'Nzm Gў={jlIk֬)A]u;brx<@O19I]31h Fg8΄U<4v;3Vk~wp222DgUGG/''G +f"HD {{JYY) D˗ӌ3wStݻw9|>RII ǝ="Gh$v#c2DzJnSy]={.i99jLxO$:::'cZnoIMM@ ށbŋpD=C= DQ/#Sr'W5VWWGG444n="Gh$v#]O`2rh֭Lt:{2e +UTT(ǕRMM UVVF="Gh$v3B$IR5X_$r."btv6$rDF9j_$r."AO19I]Db~#r4Q="Gh$v:}տ]7nKs0QD@O(9(zEH"GudLf="Gh$v:S`2{&J3b~#r4Q@)0=AO19I]➃Ҍ_$r.Pz +LFqDiFS/rDF9j=&`4#)9"G# ԁQs0QD@Oh3On!۔!AO19I]ƽ +IjFcǎm?I$r.PlSU_ku\ƼukPM, a\zEH"Gu"tҽ?_L.sYNʘҋ|^Xa\dZ#KDC|קO)9"G# 頻_L.s)BU&Ljmmڲe (c.Kknnvr:b㩮|>K B1XϘ[$r.P<^]-Ӥ5Lf޼y4w\۷+cOnsX,T^^NRSS)빏EH"GudLf̙n:ȠSsIC|2K[)eeeS~~~>39"G# 5Ks0Q&_vOMtwmxd&I :'#j4yESPDFUz!`GF{\7E;sљ^t=pwpgsݓ/9{r/_Y,6Р䒂r9 +iddB|vyFl#|4Q;:(W;'  %猉 ++bͦ\\.p8L488eL\qm$/H-|B)׸9} \^Uc}]__'J$Q6e-fggȑ#JA; :!3z d]WUUQ.c) )H(Ũ,SFGGfq|N,˕oƹ  Ntfff9rL2d8N6A}}}}DQuyFl#|4Q;UQQAE$I"Z-s|NJ7 Ћj-X,;.K79E|#|4Q;> (KDlJJJXv9E?.]RƖibbbGNNĉEj腈j.^HGArNG}}=nhhؑ=rosJ[[=~]{^ׯo)xX!lW>\Jw \^(HGfGQSS2[knRRRB_GR,9̙3tUzy<of|j̭=weњ-{hoErGh$vx2 566n$,ke*dsF[W\ϒWZ.s}9  ">> JRJ^خ) )H۬BNzA׮]c׻;wxgs W|j腈BN|/԰oy!燂n7e2J&Nt۬BNե93BNf5BD!|F>jȲX,dI$Ms!Sp5sz!S>G#r +0#9" +9E|#|4Q;:so q_09" +9E|#|4Q;:=W|Ǹ  ">> HSAQ)ᣑځ)S(5sz!S>G#)_sw5sz!S>G#r +0#9" +9E|#|4Q;:߫ +_?W|s_09" +9E|#|4Q;:_:5sz_%պc\$vÇ_> H9+P@[r>Y\\iev2%IJt:x X,Fx\%4>>뾏Gh$v uBNf5Bo$:Y_&DSPOOQyy9Ruu>3bᣑځ)S.q%f`.Ps@/TUU}***r˜$IfY+K%+++_),ܸqq|N,4^/`.Ps@/㡷o͛7޽{N)%p{8P(8ψ |F>jR'`FPs@/e{S>}ͦ\\.p8L488eL\qm$/H-|B)\F,^'%N"..GSV666СCZ$zUWW~6e-fggȑ#JA; :{>>qNwOAsk's8vaT\ o/~uRsz!3bᣑځ)Sz;;Z EG.?/5nC_s=MT@~,SWu8K5MZscǎQ.9zv)P2t:MNwttP__r_8h4J8ψ |F>jR|Nla󯾯oҫ]/ko+߳?eOY2^_}l}A=rZGO|N8,f=`/Cesv$IR\.ז 9E|#|4Q;:U7W|gcUq'S(ƽ?+ _6!N8ĉ_رcǎ# V*-*F.Kn]TDQYvJRJl +*,C=g2<3^gv>sg|}C5dj\1ҵȳaN6R=Z요ƧvN߇m,r-@{HQyW ӹmז gsc9Aǩ_Q2|v='_#mx-y3j̧GR1w!op>e`A4#dl@s +qӨmZ>LJD;z +kwxrĈskDLf8Pclեm*r5%/677&귢?7 +Hl>o@x\J`<6 x_y]bB =)sy֑ Tӎ*q4P\5()C ~=0DRեy^#-<6uvbϼYrOSQsEtH}at { |xd<.%0sӨq=JgS ][\}6Y$:}8IȌgɰI{l"7b\QvxU!Pd2m%0K >3C~^SzZxǸ:k>p-; w{/~y ~ Of%TeuPKijyZ)2 +:S{D(*Rr5X99_vDu䬫Z5q;TY鷣EKI@q0~0K !ǧ|A1uwsLq}q1[j\pƩ8XLA73>@ҵȋ͂=wRyHG~oY?fh;kwx$  K9_u";ϣ&\ֵcۈ9/pg֌>YZCWݯ=?zn-o&LE_Im+_x^x\J`<6 x_*K2mkg4YcLq F0DS\WUk"n.Hbstg<&  ?ɨIy- $:,Jɿ\^vRn\1FzC[N8>?vU<4]sAObzH&{.܇{džqsE1$}׹sW&\5a[7Kmc=j̧GR1w!o*Zخ-#,J0 YsɆAM y6Z~rp 9Ā51ly֑R[ F60ʋW1>!%rgr譕3vT 19%g y=xx*;-BoH9iW<j}s M{6!>+ Fm?N:z!P f~Ar;1SDܼ`K^צ™] j9ry8݅{(Q^E9k{[.8| +3Gx,ؐ7ɠEgFR {# LKVRszx^NgiiKݲ1Ĺgȗϯuy1iҩ_U<9y~3KH)a^Ol_Avo^}fM|̋?ɊQb&S9 U {Uףu8>bZ~Ξ<.P>9={!.3x=_&!b5OQ?|&±?1w!o*B5D6jex/rZcU%L5rIZGD>^BNP\|hsWM6*lѐN#\þ۴39?{04Gp֥m>e^t_zϞswzɳai3JSx%@hn#=šmw޿n +q 7opc< ~b^wm\Ν 7e5ty3aZɡn^ׅ}KAӜ` e-U/<|xTNJ!n)z^j!קc=τzږy;@^ln&RE+z~F +2))(Fa}bϠ4@_mX5/G!}l%΃sL>u!D{;gD q^sSvTSy;x^.^$~Γ|&+ +8otFJqﶭA.O{=.A_ uWuyOrkM'STL{\yMr+Iܛ< fx#l)xF\|Mj̧Gy\QAVu8"E˯eq\g@DXB FM,Ҙf;6V(C6?4` Ԏm'ikccS3X3Wzy{.Yw|w;oyy~nNA9d_z?Zži-]#|]yp= 5 j|;/t~[O\Uވ}n-/4-gGmzWd Vf_W m4w.ڋ @}fmbdeWe`ԗ+)/+ˣPdoKW*01d* +~M>_beVHn0G`sPv\)o0%K)4*?_mjm+~& ԥZv{xpKU%빍kRƛT +h*tO|q\IU7x|[v߸&z1\#>f!/VsJܼͥcuyWRzK&FQZ }Ý#0wCgH +z0Z~TyEt,<&/*:#XEi>Ay\bG}t9ep=ԫFdiSP_Du8]qTv{1CO ײ_=9?ڶQz|'T~^8v$I!\RciqAm'Ԭfw Qޑ dö y&o㝾M"~Y;K`l|=Cnj{rה$p*vV3ұXZR\Lifc9o=޾Ke"{hY\U|kbؓ39i l ,%Cш3nm.-,]=D J&T/kfuOr~cj@,#^@$& LI?缎cp}6~%lxFs\ )1N<tfv7rԽ7;Y=[#v-ߕQ߬ᙚI=KX,NI9GA@9xWW.cbu|˱/Wi>᧸"W1Ʈh|O gcdAm;g z/+)y+S)åDgn$5.0LC {V@=v#YJwʈF˝%Qcp=8ƍi8A+.&;cBDa8G8`c)/o)KFF+,,kVQ,.92?$Vq5~jTF(\ X5uD)M1ƾG a( c9(mfS}*4?;q; ְ.LBkJ8>{g!^ ;>c8b cSKK9sZJ>. ^wPD#O_^.׍y*֘p{8<GQ$a.or5x)--e333ljj9sQg`Kؑ#GbIY'gʣƟO!ώ` <͜2a$~XK>7,g1kE6W3˙r%&h>g ssП HlybX,>Zi~,cv87g8+V1W{.%YJ]3Ȝrrt:gl||"o)6 x[5&dY%8Ka<<'U%dH}n:h<䜁lÙΙS zXGYRO{LEXF^Wmo}:z=W Rr"i^B?e[GQnddDP* +D7 *1%N44fI&&&fSVMUu7]`J|RԽ8;1^9j$'yz<]^$;TzțAh&|X%}2GwBCaaaʸ磽˙[ R's`cvF$@4}`vv>L; sS z=jv)u1Gh\M~;F߹S{,dٮEɧڇ<6OOmڷ:߁}cmC'c伶x;|U]؃_7bPj:_c`%X}~G[w<7[{P󬩋YM\=~#j>ԛch^GN^Pw)N_?~CucڼD̋u<>GW^.e=T+t7sy2cӦM0== h}(LB"=([ǫW`ff0{۷oȑ#5O舁E[ + + +`jj +֯_Ob\xN>2Ps&;C tsz9sUs +|}E9?=Jzfc{Tsc<e=FX򮭇'xo977iVP;U>O#^=?Շ狿Ch (Yz0'z'tDGIZjk!G +/LdZsq]͹jzQ\\ `nݺSЃqFGG-˗ЛKczRQQA^ޞYS/5j~>crrR#!ضmh>… }Bwz_A񙟵_+4.%)EU #/Ե'˩G}QocbMztUw?{eGXzW=V}.E/ϫuZǚB]u|{'NO|@G\ڇ͙}twwkcd._S0fgg)p+Z=o5j٧D"D"Ap8L{쁞}'3o=A1UKz:yjb/hRoQznKzzVqKhhNMU=,cS/j{nzw;隭HGS=_O@%Q۔uv_È`|S煿xS6lؐ=>}J~b9sOyuu5LLLȈ  _V&g-X!WVVfƧ )'P{BK +IS,=GS^JxDO$/eգ-q?nI|k\>8t>UG+vv=WG1]V慦skb?[u^2 aէ-9g)3!hhhH)ӧOÝ;w`ƍG類WyҎ#H}?wTtcOq>}3JOzC97͘TOsʆѿaOsr%+>26E5[sf`aayyy7YjS0Ο?0??OS***rJg~G2^vc>)}6:Ԟ0Kuh쥂ܔS6P>9[u\)y>t'[0Iwss3ZӇS͛7pY:S]i>"\s]1ا82(җFi15͇i9e :xO铏Qz.nq˷B%Ͷ>Wf׸{.,..ÇajjJD"077Dfgg![ӇS0:;;5?b)?GիW!}W^+3΁\s]1ا8{aSb4cRx.;lK>ˎ:: 'GNN[jW_V&ݢg-pcOq6ؓblK >š:s, +H'NmˇZO)ɓJw}o5؅} >?0b?P/]8 l8UG:.kUkerLs`cn JamIu' E!ВjRsSutS/5؅}|6RsSut_{LQvc>V|JU+ʰ,8W%R9ZEzc>لޑO)4 :ʂZOacn )&47ŧKqaYGYpX ܯZ+[x 9.SMŧJYUudea-ا0^k 7gaW֑uI29"zF90ނk 7RTQ)g~f֑uQ2=o5؅}s)N>%u\XGQւ} +EpcOq.V)cY5udea-pj(Ε90ނk 7ܦ?k:ʂZOac֭s>-q)_wR)mIq `YGYpX ܯvV&3΁\s]ׯ_y&ܾ}B6D LB"Y4CCC0<

9_|X9V_^9`RXN>-ɣ%rI̫ڬ䨶3rzŇRII%: +$yFjnn5.pn+;<-s>f$UDvF@ +t +ƽrnJeee466FhwɻuR{EfV9֟);>큏G!59Ɋ3zڰaPmmQ(??In)((D"A499)P0LԜu<9S3|\@j^|5{faDhkkKE"yw^5>t9ܹsҾd'oeNq1G&S|NV\9`fH!rqJ&TZZ*755Qggh4JXzzzV|cN}zNٴ >f$ڬD5{fi9N +p8{eeeKrJR4RWa|>rI̫:mrvF@SQdN>G. 5!;faE!d)r9|>rI̫ڬEk=ŠʆpP;/d MdN-*Ԅz 9-wr_B.ߣ甮?*$vWz 9(w lQrv^h>rI̫6k9ivF@!O 9en=V>r 90 +*rğ)B!(~x^W>rI̫Zmr"vF@!ټ}g +I?QG~G&`Gs,(/((`!˻^}SjZ& +xU)#w|\@jʡj@sƭFF{ !6'V׭#w|\@jsCuU5{faEqwhmɾ3dm=;|7 HMb^Uk]9`VwNԴ}?B?~ ΐ :K?ܡJ>rכ G&1Yɏ`/s,(ǽGyg|+pj|7 HM)YXQ9pߘ= q*z:E݋[|7 HMb^}q*@s7z[)ۻLb)|)(|7 HM)YXQ9X&=rW,n2(]o.#ļڦZN]9`VwNNMUTB{{+śr湲5>rI̫ڬG]9``0(kI|oݺuog)/]Opgm"{sT6\n3wyS+yOdwyk}G]qtMR^)%%%xhvvZZZ> 90Lpܜ< +\"B"" SmmZ-"2ؙSxO6rBkNs\oQyw+̂_ٓ+Oݵ:^MiٲGN,,qukVj3hDN9<?~ܸ7==M.]z#%Iڽ{wgyUZN`/s,2P(LFjnnU%>k}3$zZq}?zt;aDG;wӨu~aJ$q=;E",Hj -ߥ'>@ i\"444͛7uMM В"Ԕ?%UHvF@ȔV@.++ R?.y&)yyyt}ڲe qڵk9t)~:UVV?Bp8hnnŇJ$T\\LըLz˂>#Zk.S(ѭ[dnYSJJJy__]|#Qo(BAVE"yw^5>t9ܹsXj]I3GGsfJ唚z ={V^S^J/^տPrqJ&TZZ*755Qggh4JXzzz*]Y3GGsfrrPkkG画wҝ;wʕ+TQQWL =?<$3EZ*4*MJ(qI1MESӰ(܊J6Z?ڋV{ l%6 +"s^rgt838\{=ssy=j5J <܅ 0b=VGՆJ"kK+P26Gqcؓ#&%1dp+V +ZjS騴ʨG[ + +*((j + Ln׮]TWWGMMM^XXt݃VfJHH%$ݢdEm 29Gı'GpMJc]`̹sN4KIII]ST~II M26طJTTߏ8  ʢ<~~Ν45k?T26Gqcؓ#&%1.0J\9pW-K:"""qQWWGaaa60Y;6m2SSee%gdnMM +>>GQ#Y,CtlEzZ59#ˡ)g\99pGϳq,ΕJQh썣^O#&1.(sa5sΥ`㨮NO7γ,Y-ZD6lUTEm ֗?v֝88kR2dEwRVVfz{{>5kmqƠL ={… RS8@e菎cOwqvΕCwhh޽멱o?["##~UUڵkgsAAAT[[_uu5JDer'/Qb|*Gsm0GKe菎cOr軠DΕCLVV>}ݎ?T*z +GRG[bhU9j^.J^z-$Z.]df#T^^NTRRB˓)33.]?ҵgϦhBBBhΜ9y#✔Dm6*..h4FuD™(&&uٓ;|FF :ٷn%=1UrNKKO>-gf/=8dWW~~~tyz5UUUQnn.mڴ>|Hqqq͛7tAzuttk\Ҩxz3_b?͖8oܸZZZ8[.%88BCC߿ + ޴nW0QlٰaCN-9^GJX=s۩Zm2J}cbݼ`2Cyr N[])J:\Ew___Lam۶˗/~wɓ'iŋĉٳ<ӕ+Wt9?~T#ݹs֭[R9?ro'|nSݝ”(~~~͛7W}JIIIݻ)//t:mݺ;;vPeeׯ\Q~I˖/_N7owѓ'O(99쳈'y^txp:E{8p<ޝ5իWvߡs@ll,F-l_N6l}qw)---R.g + ݻ1SR(,,z-Rtt4yyyQss38p(/^rcnj#cMMMh(''}ȑ#~љ3gZIOO66BCC;=3y{{:>>>|-iw¾u([7^~MEEEEz>|@]ޏh~ECöl2'M6ZSgSD)SNӧ\D'ONy-mٲF$G,W;twHLL<ڣGta߿?/s:R [gad&!C1bP{{; +C(;^V[.D0tU׳}y܏{QCC":Ŗ.ϓ{x[&L~Di^4;v,},Ybu{HH/cmasϱo>8##^zeszwsɓyСC4e4hQYkk+c,ciٳgׯ_T[[˿ fΜI7nܠ۷o<7,Ǹ8^~uzYzv 8O4Fg̘??/?6_K((2ղ"GYk +k)*մG?f3٘)XՔ +ǐC~XEhZR[wl>Ͻuqx<99|t~|~~~V0JKK_z6n(8V|t]~B۶m&)YYYN߅|mEOOh\X~4 uwwmG ]>,|f[nNI{,,, + EgyɓJ->>!Xg[ND=<aA9]w8)_r,9s&}_4bbMVߧy_bM:E +0;}o355(Z`S:D߾}ߤ jjj(33SpW\2m}vJj*MzCC޽… *}+ylBV|ϟ1''G&?]0⻶8~Ν;dccnzz: $K٘[nQ]]1d>%oSl?ϓ-B$$$̾'_~cDeeNu%UTTwb>QB^ϟtU3Vo޿~C#رXc}}=l_>|P0pvvߓ&&&3hɒ%4{lƛ`WLMMD"jŋt֭QRtZx0g\7oޅ󰳳nnn>{ +ԩSKgϞA + 3,,WuttЖ-[ ЈN )c#889BŔI~~~^ҔŅ222KSHH^'BḈ!_6mB8#Vz}B!©'!B:B!BhlNB!S ZkkkJ_Bq"CDBӧO79CTh:vÇ)&&yĉ_'BQ:%..7h3NU(++CKcP@!TW:%''JKK---$L''')B8-**6rqq'H_)B8*ص]}uOGjG!SS'''7%''SiiiC룚 + + +R􅆆Ruu5S]޼yC:=!pld5INN]߫:%##zSVVF3g Oܹs>LMMM|u +rN,-[&:NN˗-˗},!Hˋllltcܹs<Ǥҋ/tzBعxbUi;QuJww7瓿??_/ȑ#CRT4۷oӝ;wӓϟOUUU*u +rNѼN^(Bmmm(XEul޼(00MBVVqjD)$T/**Rk'* 6lؠ菍US p qy͚5M6Qcc#={ޮc񻺺~Edgg/""%6'±}4:E9$$$PWW`|"֭[ǟswwW̥^ AikkKT\\,:N9wܩR 'LF{E!6'BdHAA]߫7:E,/777x:E.rN)))4<2rrr+WRss BH444D<TUUiS_19aJJPBII2"uXV˜62- P#gipՐSQ&!KaYoH}?w=}~+++jjj"""off&^RRcCN.\WAwZ]+00_AAh) Օڒ9[ZZ:+++VctI ?ߙ'/ FwAA^<  ')AA6!O   y +AAAMS   jmBA5G$̤Ν;7L2ǟ:ucǎ4zh% :KKK + + +͛7G:ӧ-X@CmLMM)88) ~ZO{ёSNrYK>;j*JHH 77& -&NH3f ##KT!'''1͝;oNqqq>@Q)\ٳg/*((h>|stҥIeҥ<~LLC+++ݻܯW^GSNQxx8:t~J666Z7n}Ο?/k֬YmݻGv1hΝӞBAcǎ庖E}Psm1vK,^hM$߿?V[ni˗/thh(k4%UWWӃk NKS# :%~w)))rq222T2117ju<<~Xk7{i/5Y[[M4lmmykc޽{e;,,q׏`TQQAl^Lw!ŀ1\&ꌍ[ B5kpL\A]޽k#eggNdŔ6l7nЧO1y5ot%4x'w'ٸq#CmM6k5y/_6"mΞ=KdeeՠX؋Ǐә3gԴIi|.]o >}J[nb=<<6j>L->m-vzu#G(AD)O>>>-TB޼y~jhŋ޽{Y d~} >9hm۶qyzz:ۺj%ߗ} + + +;--]3gjQW)bE[wܑ˄۷}EkaaA \/f)j֠k>///9$[;Ϗ'O5-jPR^0`*--P㈽qwwH F1.ę >?D{}ԩ?佸u@ &˶8;"h)kk#YJ1F@G~HGxb,1nitڵh pY<ɉ={he3f`{l?S9PmyʢE|r?;wy]󩦦*++~)JkP/$$파 w4Gmm-OU]yzfϞט]vw[||\&$++y|Ʃ]O{ӓ + y?RSSJ+hϵ155rY4Fo"(aÃŹ)PE8p;Qfll… A|k|-D ENtV}1Ϸod;%%-:Rt?B)s.iӦqyNN\b +.KKKc[S`;==L)JkP͍7o4I'Of;77C-kkkQΝxb'yyy|r611-88Xz+QTTĶ9To)k#rǺw }c蛧ݛrڿ?]zUnjpuu巑o//ީHB(QFQ2S^6m%D򶱆lFLEޒ=E5VXlϳ{u}{oߥv|>9G{{{0*llly???ɻZkۧȩSc)+wCBYYFg6oLk)DEE8++ ƍ4LMMi6}왘@uu5TXn*I۷ZHXUPPő\`ɓp}:Cgkk+ʱN[z8633{xx@SSRm nExfw[S|}}\їHú{K*Yd ܹs,--iĉ:}oƸﷰ0׻wo%b݆s|QW'?~ zˡ,,,Z,b DFFʕ+ɯpn]-m9T~9c)n»w`n޼Icee4$$$@}}='rrrDŋ\/\\>|7nPo߾G6+--UcV9޼yCup׮]I.u*<իW~EEE`gg2UBsxa}&_3c׮]*e T;a 7l0}i555TK) 箖SO*?JŜTLq1ЩS'޽Z9uKc/ѣA e^޽{ta<==ĉJ{quu'''lllgaԃg nnn:[֭2# M/`nnFr!|_c'11m0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0_!''ڷoWۙ}%K@uu5lHHHgϞcǎ%YkZ±ôOOW}{}`޼yp-ػw(:Ǐ7l3-a{())uݻwWcRXX JqcG_mKˋ~xv!ιs1hhhgggٶO]!++KclKgϞЭ[7]}~:8v>ёri+'ϟ?もHMMljPYY fffmi:L{ԥm.011vځ>e͚5ԧsrty c8֯_OjժUd=z~۷P[[ W^Yt)|־xB/lPWW7n܀%Rq5zF|vܩюwo'''|2דbӧOCMM IKKsss:FZbʳuޞ{zz|ȑ#={zj&|hjLo_8@*8v8v&Wmll`ӦM_Ayy9Xʇ5j\~|ף^)滌 pXYYIׯ_HcCE9PСCվ3c[6`5B{:]/_‚ 4ptt?R1C]|_BSS3f@uu5466߿Ok͛C uS1110|pr +WCR6~!f:>}J>8}||Tڑz}ÇI}_~#ӈHOO'y\\l4޶m[sڵ+F4g5uTM@QQ/_ >>D?^Gٳ[WTñ7!է(1c?ŋ?R>I?1ϟxڵ$S|7ghhhoooiYoy)8{,X[[2SRRRı? S1N;w|j~=ԍkO1e\>ޱǏT#xyy) ={@AA[+.>&L@w0Np.33Ɨ.]s3;v;-٧?ƘWpʎwѴo???V16&MD3g@Ϟ=aРA4"W&YOOOz\ϨҒ_~޾}"=00P3p쨆c8ѦOAcи RSS鿔iAcpu:ܸqT[Κ5K`̈́5]NNTVV‹/`ذa|TG-ZM&P6값㾺t$ǞbTй@U} +9/ܹ3:t]PQQATNh;8 M:Ο?O?}6l555$3g/=FG+Fc=ʲ%WzGEq:ۅ$JDٻ0I*ȢAdQpA.3Tt *0"wb33g=k~{{~o-}ܧhshy*^]c]{<>y!zuo߾HHHkLmg„ SQu6N`P;j>E(1{q!C9 +g^zXԐk9# +1իW}RROx-QXXC{qQF}rssÇ|Mkk+QLLL.{/)?@5kcC233;!겥6oѽAdyw6mN8c-Dzx`>}o-"ݧnǮs޽{wٮ6̙ڀ+9h9r$}<M^^Ϟ=Qu6NpP;>voLgϞZ +g~-^|֜ɓy%====端7޽{: bzTXXH^kg̘+@#>EH{ǩ|}V|`#11^xA_~=1cѣGל4i_o>޽{,ZgΜ|su111y&ߵk:u>~c sl6^YQQA۶m߷>}ZHSҪU|8s̚5-4֯_O cpň~o''N.r 33M.]Fy|\ jӓL.\o\r -[7ʡPQFѵkx挴nuuu<;mIIIǏcsPi&o^h񔜜Z1owh`&x y<oܸ?Nqqq;}aC9˔֜7nXkrvwz-544Ѓhݻw󹚚ɲTBu u k>ImmޝK`v/HHH>CԑF||T`ڵk.(@NT?DA*M,⩺))C+BBB"Zz&jT]񔡕Q! wl +=B5x.bxʨЃP;h*LvqF._CBD""22* !!Lh˖-TRRB|cT^^Nn;<*M,⩺))C+BBB"d4g~rR?''^PQQQyTYSuSSVF<2DAiǎH'O+WqFWAll,%55UV+_gΜsXWMaW3W+SSș%TU G"ȑ#ٳg_~d*-=_OQY3v jkG="ieM-'NJZrR{W4[Y=HEE > TUUůz>77pXJ@"QwotjI"ieD{14zn=!DAѣJKKiΝ4m4}Lqq1_v={-}ψb%"ߤzb'"\2܃z^8uk)o'K9F.jZS*PGhfOc>, S9vW~Zz+ wl +=B5x.bx:QJ2*NjfkTYSuSēWrL(&ǤҨheTA=6ay +#4Q" +=yefkTYSuSSVF<2DA*M,⩺))C+BBB"Zz&jT]񔡕Q! wl +=B5x.bxʨЃP;hV@EMT|U& /1Fa~(,~*_ϐ1N}$d\{gB?Dqf^Zsc,ة;Mj/髾w}!+_U蕭?7F:9sF3΃܁oBPn[ت;oB?;ϩdվl2ٰ~9O=1B{ +T&eMdg?8.+_[۝l ˉbwhhhHv޽QIMݞnS`B7!( =gɲ~3{7}Ndלcǎܜ,--IZ]u$K^F!r{t{׻vw߄ `f:Soާ>>W~fo5'O{Zw###f)R{Y3S$ch]&|n3w+e!h@7ZgffL|PNӡ9B9scg?u) +}}Y߿_c;rҡCǏ{(dyy9L4M3ຽe,tO)~j,t9 FS/_GGGѣGYT*멩)jBG8Y!BCЀ܁o4uQi6y捜>}u$,,,H^F!rX3S dY r;dhh]EQf?AȲA4 wd#,~ZOSe!h@7!BG8Y!BCЀ܁oBp0iCyf՞'J%]VVu| `f:x, DArV;wN?S(4M3SPŎa#,~ZOSe!h@7[nW)###f)RX3S dY r;$ׯ_ˑ#GhĄ vSbVfE|ʉ[:?G('~n Y)S!w-MMM\eyeH4LvoY) `f:x, DArlT*uj?k#,~ZOSe!h@7VvOID^Kѐrg-tO)~j,t9 Ʋ%Y3S dY r;Mf?AȲA4 wd#,~ZOSMEQ$qVݭ"߄ `f:xl_.߿o\zsIui4R.7}V:|,tO)~j/~lϨT*j*ZmwkuО={TP wd#,~ZOSF($MT(dqqqSwd!h@7!BG8Y[WJ.Qdrr3###f)RvA4 wd#,~ZOS'NR]ӾQ,{szg%.ZKT?<3 ~usc͛7ƍEi[Gwd!h@7!BG8Y>3l}]V~4q:*¹RoԠF$/#*x^hP +!T~QsBdE>Msv;ڑ|>ITJ\.7sbaCԐahcŽ2i]2%O fii)}xM 8gzjz\,VIRj*Bqߞ!jH01`aGxY.Y344$N}n޼)3333L>$I]皱!jH01`aGxY.ʕ+>!ƀefӺdJƌDQCz ;̒uɔ<5 ;Cv%O)yj3v=D 6,/3K%S0f, z; m X^fv%O)yj3v=D  +r8I髣_[efӺdJƌDQCzx\211<99dgg' ,/3K%S0f, z; 6ccc)333Z=k=n/4gEڵk&>G,WsJG{SWwZMFGGVo'I"z=}u {niŽ2i]2%O c!j. [[[RI\ny ;̒uɔ<5 ;CE.Koۓԕb(ZM*TU) +-eaGxY.1caCԐah-'|^$i{efӺdJƌAj=6,/3K%S0f, z; m X^f>~nWuQ {; EfGh`gHa7j5~v{jv"b\vIH^O_v5-czH73-=d-'kkkR*㹹9)ʟ=4wЫtێ0BCBqR,VIRj*BA#znf6[3{4[3^$K$ 222ru\.Odѻvxtr$I"|>}=ιnyG,y::7/ȳW: +syzJ666dxx>}*/_uy}۷oR˗/RVٳ7366&?~l`,z\3p: ŢlmmIRIgP(\3纓yG,y::7/ȳW: +l*^ |4>>.yaׯ_eoo/{t,N]s;.pGJRz<;;+rH皱>ם̳=bɽAGEQܽ{ӧOezzk\?=9똛[n5ڒGѱ_{wX' ={{vzܟt\̳=bbo0y.s>sls>}}^{(\O>g~=b/'cbvbKV79+Џbܱz|||HR)Xc>OX뽁?k'blŅj-Rhv/k1fDX3z-=0nݒJJJu֙ۤ۶m3%/_N_|{Y[̍/ŋ޽{)++ΝkPEj= ,ɿ 4c (""–]q\_\"##j}sF}i|,{!1ܹڪfF#ٶ?*+) NJ~LRM6Qaa!={֠^g_Cpߙ1O ؞sRzѣG˗oJOOZ=ϒ}ׯ "־T[^^^tyjkk'Ot9[MM .kl󩱱yScYU__O>>>EeիW˖-[x޽k0bbbƍt!>!CXu=),,gdff߿?C3bϵ>S{\4[o>dLDž ٳg'6/lY۷SSS=z(99jkkŋ{M[uǖk׮QEEύ7ʕ+AWDqU9E}^JeeeHFK.,#GbT]]-bcc &X3̞YJEcƌuɹ'6rrXsrrYرc<۷&NRIIybe[[[)++aZmD:_G:烔z 6#\3'J%֑CS둑AHOl^X켱uV>Jz5^jn9s~̆z,X>H֕*9&by6l yOl,rcs +h"]8z +G:GG:aGGRss3>ZثiI8p ?ٳGr|Rk"gs=VZM='NӓΜ9C>$J{ny̬Yx9~A(9H/+[TTDMFO>5Ϟ_@~ۑSVS]]MSNcǎIs6*JOOuOl,b07/Stt4LJJ +{pp_đ5q|qžwǏ)''bϵpO`-X[Gpss*++甡Cߥ'J)rwJ)ξ8l|;0ׯwPI&Qmm-θ%%%/jjjkϟXW9틵K߾}NwKKK3Y/_ꨥd9r${OOQCCX\vX޺teZb"VNs+!!~A,G'%%+Ƒ5q|qY~g9nݧRW0fgg.\ WkӒ|!l%>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(155)Tj +ET +q +484 589 -409 -258 re +W n +q +409.7646332 0 0 259.0117798 74.4941254 330.4941101 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 312 Tm +(F)Tj +0.482 0 Td +(igure 8: Monitoring )Tj +8.523 0 Td +(V)Tj +0.63 0 Td +(isualVM Output)Tj +-9.635 -2.24 Td +(Only tw)Tj +3.489 0 Td +(o major garbage collections occurred during the load tests and they were\ performed )Tj +-5.289 -1.44 Td +(in 1.4 seconds. )Tj +/TT1 1 Tf +12 0 0 12 57 238.8 Tm +(Lessons Learned)Tj +/TT0 1 Tf +10 0 0 10 75 216.4001 Tm +(Stress )Tj +3.165 0 Td +(tests )Tj +2.61 0 Td +(are )Tj +2.109 0 Td +(perfectly )Tj +4.499 0 Td +(suitable )Tj +4.111 0 Td +(for )Tj +1.943 0 Td +(the )Tj +/C2_0 1 Tf +2.11 0 Td +<0041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(cation )Tj +6.446 0 Td +(of )Tj +1.61 0 Td +(bottlenec)Tj +3.984 0 Td +(ks, )Tj +1.943 0 Td +(v)Tj +0.476 0 Td +(alidation )Tj +4.556 0 Td +(of )Tj +-41.366 -1.44 Td +(\223suspicious\223 )Tj +5.625 0 Td +(parts )Tj +2.346 0 Td +(of )Tj +1.124 0 Td +(the )Tj +1.624 0 Td +(system)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.429 0 Td +(and )Tj +1.902 0 Td +(robustness )Tj +4.792 0 Td +(testing. )Tj +3.347 0 Td +(Memory )Tj +3.901 0 Td +(leaks, )Tj +2.735 0 Td +(deadloc)Tj +3.428 0 Td +(ks)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.429 0 Td +(and )Tj +1.902 0 Td +(contention )Tj +-37.586 -1.44 Td +(points )Tj +2.998 0 Td +(often )Tj +2.553 0 Td +(appear )Tj +3.33 0 Td +(only )Tj +2.275 0 Td +(under )Tj +2.886 0 Td +(hea)Tj +1.526 0 Td +(vy )Tj +1.385 0 Td +(load )Tj +2.275 0 Td +(and )Tj +1.997 0 Td +(they )Tj +2.219 0 Td +(are )Tj +1.718 0 Td +(hard )Tj +2.33 0 Td +(to )Tj +1.219 0 Td +(identify )Tj +3.609 0 Td +(in )Tj +1.219 0 Td +(single)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(threaded )Tj +6.998 0 Td +(unit )Tj +-40.532 -1.44 Td +(tests )Tj +2.339 0 Td +(or )Tj +1.394 0 Td +(integr)Tj +2.433 0 Td +(ation )Tj +2.673 0 Td +(tests. )Tj +2.617 0 Td +(Pr)Tj +0.877 0 Td +(agmatic )Tj +3.894 0 Td +(stress )Tj +2.783 0 Td +(tests )Tj +2.339 0 Td +(are )Tj +1.838 0 Td +(also )Tj +2.228 0 Td +(the )Tj +1.839 0 Td +(most )Tj +2.561 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(enient )Tj +3.173 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.005 0 Td +(to )Tj +1.339 0 Td +(estimate )Tj +-38.644 -1.44 Td +(runtime )Tj +3.822 0 Td +(beha)Tj +2.082 0 Td +(vior )Tj +2.155 0 Td +(and )Tj +2.1 0 Td +(necessary )Tj +4.655 0 Td +(resour)Tj +2.655 0 Td +(ces )Tj +1.877 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.044 0 Td +(as )Tj +1.377 0 Td +(RAM, )Tj +2.933 0 Td +(CPUs)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.128 0 Td +(and )Tj +2.1 0 Td +(the )Tj +1.822 0 Td +(number )Tj +3.822 0 Td +(of )Tj +1.322 0 Td +(nodes )Tj +3.045 0 Td +(to)Tj +-41.366 -1.44 Td +(handle the necessary throughput. )Tj +1.8 -2.24 Td +(Load )Tj +2.534 0 Td +(gener)Tj +2.377 0 Td +(ation )Tj +2.59 0 Td +(is )Tj +1.089 0 Td +(important, )Tj +4.868 0 Td +(but )Tj +1.812 0 Td +(the )Tj +1.756 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(ailability )Tj +4.146 0 Td +(of )Tj +1.256 0 Td +(performance )Tj +5.867 0 Td +(and )Tj +2.034 0 Td +(monitoring )Tj +5.146 0 Td +(probes )Tj +3.312 0 Td +(is )Tj +-41.533 -1.44 Td +(essential )Tj +4.273 0 Td +(for )Tj +1.772 0 Td +(the )Tj +1.939 0 Td +(ev)Tj +0.976 0 Td +(aluation )Tj +4.107 0 Td +(and )Tj +2.217 0 Td +(interpretation )Tj +6.385 0 Td +(of )Tj +1.439 0 Td +(results. )Tj +3.606 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.105 0 Td +(comes )Tj +3.383 0 Td +(with )Tj +2.495 0 Td +(JMX )Tj +2.383 0 Td +(and )Tj +2.217 0 Td +(REST )Tj +-40.033 -1.44 Td +(monitoring. )Tj +5.443 0 Td +(I )Tj +0.719 0 Td +(used )Tj +2.442 0 Td +(both )Tj +2.387 0 Td +(to )Tj +1.275 0 Td +(monitor )Tj +3.831 0 Td +(the )Tj +1.775 0 Td +(state )Tj +2.386 0 Td +(of )Tj +1.275 0 Td +(the )Tj +1.775 0 Td +(system. )Tj +3.608 0 Td +(It )Tj +0.997 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.33 0 Td +(easy )Tj +2.33 0 Td +(to )Tj +1.275 0 Td +(identify )Tj +3.665 0 Td +(the )Tj +1.775 0 Td +(slo)Tj +1.211 0 Td +(west)Tj +-40.255 -1.44 Td +(methods )Tj +4.024 0 Td +(of )Tj +1.19 0 Td +(the )Tj +1.69 0 Td +(system )Tj +3.245 0 Td +(or )Tj +1.245 0 Td +(the )Tj +1.69 0 Td +(current )Tj +3.412 0 Td +(state )Tj +2.301 0 Td +(of )Tj +1.19 0 Td +(the )Tj +1.69 0 Td +(cac)Tj +1.482 0 Td +(he. )Tj +1.653 0 Td +(Application)Tj +/TT2 1 Tf +(-)Tj +/C2_0 1 Tf +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +8.971 0 Td +(probes )Tj +/C2_0 1 Tf +3.246 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly )Tj +ET + +endstream +endobj +370 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 372 0 R>>endobj +371 0 obj<>endobj +372 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(156)Tj +0 Tc 0 Tw -20.132 57.06 Td +(increase )Tj +3.866 0 Td +(the )Tj +1.644 0 Td +(\(stress\) )Tj +3.144 0 Td +(testability )Tj +4.423 0 Td +(of )Tj +1.144 0 Td +(the )Tj +1.644 0 Td +(system. )Tj +3.44 0 Td +(W)Tj +0.982 0 Td +(ith )Tj +1.33 0 Td +(V)Tj +0.63 0 Td +(isualVM )Tj +3.867 0 Td +(sampler)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.949 0 Td +(the )Tj +1.644 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +3.255 0 Td +(for )Tj +1.477 0 Td +(monitoring )Tj +/C2_0 1 Tf +-37.476 -1.44 Td +<003B0047004D0044003C0001003A003D00010041003C003D0046004C0041005D>Tj +/TT0 1 Tf +(ed easily as well \(it w)Tj +16.268 0 Td +(as about 1%\).)Tj +-14.468 -2.24 Td +(JDK )Tj +2.132 0 Td +(1.6 )Tj +1.855 0 Td +(and )Tj +2.077 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.965 0 Td +(EE )Tj +1.465 0 Td +(application )Tj +5.301 0 Td +(serv)Tj +1.71 0 Td +(ers )Tj +1.687 0 Td +(come )Tj +2.854 0 Td +(with )Tj +2.355 0 Td +(interesting )Tj +4.911 0 Td +(monitoring )Tj +5.189 0 Td +(probes )Tj +3.355 0 Td +(alread)Tj +2.643 0 Td +(y)Tj +0.408 0 Td +(. )Tj +-41.922 -1.44 Td +(Especially interesting for stability and robustness tests are the follo)Tj +28.278 0 Td +(wing par)Tj +3.767 0 Td +(ameters:)Tj +/C2_0 1 Tf +-28.445 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Current size of the heap)Tj +/C2_0 1 Tf +-3.6 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Current number of threads and peak number of threads)Tj +/C2_0 1 Tf +-3.6 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Number of successful tr)Tj +10.158 0 Td +(ansactions)Tj +/C2_0 1 Tf +-13.758 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Number of rolled)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(bac)Tj +9.318 0 Td +(k tr)Tj +1.377 0 Td +(ansactions)Tj +/C2_0 1 Tf +-14.295 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Garbage Collector acti)Tj +9.707 0 Td +(vity)Tj +/C2_0 1 Tf +-13.307 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Number of requests in the queue)Tj +/C2_0 1 Tf +-3.6 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Number of database connections)Tj +/C2_0 1 Tf +-3.6 -2.24 Td +<0055>Tj +/TT0 1 Tf +3.6 0 Td +(Size of the JP)Tj +5.559 0 Td +(A cac)Tj +2.427 0 Td +(hes)Tj +-13.386 -2.24 Td +(Robustness )Tj +5.217 0 Td +(and )Tj +2.049 0 Td +(stability )Tj +3.772 0 Td +(are )Tj +1.77 0 Td +(the )Tj +1.771 0 Td +(actual )Tj +3.049 0 Td +(goal )Tj +2.271 0 Td +(of )Tj +1.271 0 Td +(stress )Tj +2.715 0 Td +(testing. )Tj +3.494 0 Td +(In )Tj +1.271 0 Td +(this )Tj +1.938 0 Td +(context)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.855 0 Td +(all )Tj +1.493 0 Td +(the )Tj +1.771 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +-39.977 -1.44 Td +(listed )Tj +2.869 0 Td +(abo)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.09 0 Td +(should )Tj +3.481 0 Td +(also )Tj +2.313 0 Td +(be )Tj +1.646 0 Td +(\223stable)Tj +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +(\224 )Tj +4.155 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.479 0 Td +(should )Tj +3.481 0 Td +(be )Tj +1.646 0 Td +(no )Tj +1.702 0 Td +(increase )Tj +4.146 0 Td +(of )Tj +1.424 0 Td +(memory)Tj +3.463 0 Td +(, )Tj +0.868 0 Td +(threads)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.952 0 Td +(or )Tj +-41.311 -1.44 Td +(uncontrolled )Tj +5.894 0 Td +(cac)Tj +1.482 0 Td +(he )Tj +1.447 0 Td +(gro)Tj +1.377 0 Td +(wth )Tj +2.003 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er )Tj +1.224 0 Td +(time. )Tj +2.521 0 Td +(Also )Tj +2.281 0 Td +(performance )Tj +5.836 0 Td +(degr)Tj +1.877 0 Td +(adation )Tj +3.615 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.337 0 Td +(indicate )Tj +3.837 0 Td +(a )Tj +0.891 0 Td +(potential )Tj +-38.42 -1.44 Td +(resour)Tj +2.655 0 Td +(ce )Tj +1.293 0 Td +(problem. )Tj +4.183 0 Td +(In )Tj +1.127 0 Td +(gener)Tj +2.377 0 Td +(al)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.321 0 Td +(all )Tj +1.349 0 Td +(the )Tj +1.627 0 Td +(measured )Tj +4.46 0 Td +(v)Tj +0.476 0 Td +(alues )Tj +2.516 0 Td +(should )Tj +3.184 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.793 0 Td +(a )Tj +0.793 0 Td +(modest )Tj +3.405 0 Td +(progression. )Tj +5.517 0 Td +(Random )Tj +-38.588 -1.44 Td +(peaks or degr)Tj +5.767 0 Td +(adations are usually early indicators of potential problems.)Tj +-3.967 -2.24 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.001 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.39 0 Td +(built )Tj +2.447 0 Td +(with )Tj +2.391 0 Td +(man)Tj +1.871 0 Td +(y )Tj +1.001 0 Td +(enterprise )Tj +4.724 0 Td +(features )Tj +3.835 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.057 0 Td +(as )Tj +1.39 0 Td +(J)Tj +0.26 0 Td +(AX-RS, )Tj +3.501 0 Td +(EJB )Tj +1.89 0 Td +(3.1, )Tj +2.169 0 Td +(inter)Tj +1.933 0 Td +(ceptors, )Tj +3.891 0 Td +(CDI )Tj +-40.477 -1.44 Td +(managed )Tj +4.321 0 Td +(beans, )Tj +3.155 0 Td +(ev)Tj +0.988 0 Td +(ents, )Tj +2.377 0 Td +(timers)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.237 0 Td +(and )Tj +1.988 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.043 0 Td +(entities. )Tj +3.711 0 Td +(P)Tj +0.511 0 Td +(erformance )Tj +5.265 0 Td +(and )Tj +1.988 0 Td +(scalability )Tj +4.711 0 Td +(were )Tj +2.487 0 Td +(not )Tj +1.766 0 Td +(the )Tj +1.71 0 Td +(main )Tj +-40.033 -1.44 Td +(dri)Tj +1.149 0 Td +(v)Tj +0.488 0 Td +(ers )Tj +1.637 0 Td +(behind )Tj +3.417 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y\222)Tj +0.686 0 Td +(s )Tj +0.804 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitecture; )Tj +4.472 0 Td +(r)Tj +0.321 0 Td +(ather)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.832 0 Td +(simplicity )Tj +4.583 0 Td +(and )Tj +2.027 0 Td +(maintainability )Tj +6.862 0 Td +(were )Tj +2.526 0 Td +(the )Tj +1.749 0 Td +(main )Tj +2.582 0 Td +(dri)Tj +1.149 0 Td +(v)Tj +0.488 0 Td +(ers. )Tj +-40.7 -1.44 Td +(T)Tj +0.511 0 Td +(he )Tj +1.393 0 Td +(hea)Tj +1.526 0 Td +(vy )Tj +1.337 0 Td +(use )Tj +1.782 0 Td +(of )Tj +1.171 0 Td +(enterprise )Tj +4.56 0 Td +(features )Tj +3.671 0 Td +(didn\222)Tj +2.187 0 Td +(t )Tj +/C2_0 1 Tf +0.615 0 Td +<004B0039003B004A0041005D>Tj +/TT0 1 Tf +(ce )Tj +3.893 0 Td +(good )Tj +2.505 0 Td +(performance. )Tj +6.06 0 Td +(It )Tj +0.893 0 Td +(turns )Tj +2.449 0 Td +(out, )Tj +2.005 0 Td +(the )Tj +1.671 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(erhead )Tj +-39.255 -1.44 Td +(for )Tj +1.505 0 Td +(using )Tj +2.617 0 Td +(containers )Tj +4.784 0 Td +(and)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.2 0 Td +(particularly)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +5.478 0 Td +(EJB )Tj +1.727 0 Td +(beans, )Tj +3.117 0 Td +(CDI )Tj +2.061 0 Td +(managed )Tj +4.283 0 Td +(beans, )Tj +3.117 0 Td +(and )Tj +1.95 0 Td +(inter)Tj +1.933 0 Td +(ceptors)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.7 0 Td +(is )Tj +1.005 0 Td +(hardly )Tj +-39.477 -1.44 Td +(measur)Tj +3.099 0 Td +(able )Tj +-3.099 -1.44 Td +(\()Tj +0.282 0 Td +(s)Tj +0.393 0 Td +(e)Tj +0.504 0 Td +(e )Tj +1.28 0 Td +(h)Tj +0.56 0 Td +(t)Tj +0.282 0 Td +(t)Tj +0.282 0 Td +(p)Tj +0.56 0 Td +(:)Tj +0.282 0 Td +(/)Tj +0.282 0 Td +(/)Tj +0.282 0 Td +(w)Tj +0.782 0 Td +(w)Tj +0.782 0 Td +(w)Tj +0.708 0 Td +(.)Tj +0.282 0 Td +(a)Tj +0.504 0 Td +(d)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(m)Tj +0.837 0 Td +(-)Tj +0.337 0 Td +(b)Tj +0.56 0 Td +(i)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(.)Tj +0.282 0 Td +(c)Tj +0.504 0 Td +(o)Tj +0.56 0 Td +(m)Tj +0.837 0 Td +(/)Tj +0.282 0 Td +(r)Tj +0.337 0 Td +(o)Tj +0.56 0 Td +(l)Tj +0.282 0 Td +(l)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(r)Tj +0.337 0 Td +(/)Tj +0.282 0 Td +(a)Tj +0.504 0 Td +(b)Tj +0.56 0 Td +(i)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(/)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(t)Tj +0.282 0 Td +(r)Tj +0.337 0 Td +(y)Tj +0.504 0 Td +(/)Tj +0.282 0 Td +(d)Tj +0.56 0 Td +(e)Tj +0.504 0 Td +(p)Tj +0.56 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(d)Tj +0.56 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(c)Tj +0.48 0 Td +(y)Tj +0.504 0 Td +(_)Tj +0.504 0 Td +(i)Tj +0.282 0 Td +(n)Tj +0.56 0 Td +(j)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(c)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(i)Tj +0.282 0 Td +(o)Tj +0.56 0 Td +(n)Tj +0.56 0 Td +(_)Tj +0.504 0 Td +(p)Tj +0.56 0 Td +(e)Tj +0.504 0 Td +(r)Tj +0.337 0 Td +(f)Tj +0.282 0 Td +(o)Tj +0.56 0 Td +(r)Tj +0.337 0 Td +(m)Tj +0.837 0 Td +(a)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(c)Tj +0.504 0 Td +(e)Tj +0.504 0 Td +(_)Tj +0.504 0 Td +(i)Tj +0.282 0 Td +(n)Tj +0.56 0 Td +(_)Tj +0.504 0 Td +(j)Tj +0.282 0 Td +(a)Tj +0.474 0 Td +(v)Tj +0.48 0 Td +(a)Tj +0.504 0 Td +(\))Tj +0.282 0 Td +(.)Tj +( )Tj +-41.922 -1.44 Td +(Premature )Tj +4.744 0 Td +(optimization )Tj +5.802 0 Td +(and )Tj +1.967 0 Td +(replacement )Tj +5.689 0 Td +(of )Tj +1.189 0 Td +(EJB )Tj +1.744 0 Td +(beans )Tj +2.856 0 Td +(or )Tj +1.244 0 Td +(CDI )Tj +2.078 0 Td +(managed )Tj +4.3 0 Td +(beans )Tj +2.856 0 Td +(just )Tj +1.856 0 Td +(leads )Tj +2.578 0 Td +(to )Tj +1.189 0 Td +(code)Tj +( )Tj +-40.088 -1.44 Td +(b)Tj +0.56 0 Td +(l)Tj +0.282 0 Td +(o)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(t )Tj +1.058 0 Td +(\()Tj +0.282 0 Td +(h)Tj +0.56 0 Td +(t)Tj +0.282 0 Td +(t)Tj +0.282 0 Td +(p)Tj +0.56 0 Td +(:)Tj +0.282 0 Td +(/)Tj +0.282 0 Td +(/)Tj +0.282 0 Td +(w)Tj +0.782 0 Td +(w)Tj +0.782 0 Td +(w)Tj +0.708 0 Td +(.)Tj +0.282 0 Td +(a)Tj +0.504 0 Td +(d)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(m)Tj +0.837 0 Td +(-)Tj +0.337 0 Td +(b)Tj +0.56 0 Td +(i)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(.)Tj +0.282 0 Td +(c)Tj +0.504 0 Td +(o)Tj +0.56 0 Td +(m)Tj +0.837 0 Td +(/)Tj +0.282 0 Td +(r)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 214.6956 181.6001 Tm +(o)Tj +0.56 0 Td +(l)Tj +0.282 0 Td +(l)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(r)Tj +0.337 0 Td +(/)Tj +0.282 0 Td +(a)Tj +0.504 0 Td +(b)Tj +0.56 0 Td +(i)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(/)Tj +0.282 0 Td +(e)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(t)Tj +0.282 0 Td +(r)Tj +0.337 0 Td +(y)Tj +0.504 0 Td +(/)Tj +0.282 0 Td +(j)Tj +0.282 0 Td +(s)Tj +0.393 0 Td +(f)Tj +0.282 0 Td +(_)Tj +0.504 0 Td +(j)Tj +0.282 0 Td +(p)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(_)Tj +0.504 0 Td +(e)Tj +0.504 0 Td +(j)Tj +0.282 0 Td +(b)Tj +0.56 0 Td +(_)Tj +0.504 0 Td +(b)Tj +0.56 0 Td +(l)Tj +0.282 0 Td +(o)Tj +0.56 0 Td +(a)Tj +0.504 0 Td +(t)Tj +0.282 0 Td +(\) )Tj +1.058 0 Td +(a)Tj +0.504 0 Td +(n)Tj +0.56 0 Td +(d )Tj +1.336 0 Td +(d)Tj +0.56 0 Td +(o)Tj +0.56 0 Td +(e)Tj +0.504 0 Td +(s)Tj +0.393 0 Td +(n)Tj +0.56 0 Td +(\222)Tj +0.245 0 Td +(t )Tj +1.058 0 Td +(h)Tj +0.56 0 Td +(a)Tj +0.474 0 Td +(v)Tj +0.492 0 Td +(e )Tj +1.28 0 Td +(a)Tj +0.504 0 Td +(n)Tj +0.542 0 Td +(y )Tj +-41.7 -1.44 Td +(measur)Tj +3.099 0 Td +(able effect on performance. )Tj +-1.299 -2.24 Td +(Regardless )Tj +5.162 0 Td +(ho)Tj +1.1 0 Td +(w )Tj +1.384 0 Td +(good )Tj +2.774 0 Td +(the )Tj +1.94 0 Td +(performance )Tj +6.051 0 Td +(of )Tj +1.44 0 Td +(EJB )Tj +1.995 0 Td +(beans, )Tj +3.385 0 Td +(CDI, )Tj +2.607 0 Td +(J)Tj +0.26 0 Td +(AX-RS)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.578 0 Td +(and )Tj +2.218 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.273 0 Td +(is, )Tj +1.551 0 Td +(o)Tj +0.544 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(all)Tj +( )Tj +-41.144 -1.44 Td +(performance )Tj +5.773 0 Td +(is )Tj +0.995 0 Td +(highly )Tj +2.996 0 Td +(dependent )Tj +4.886 0 Td +(on )Tj +1.44 0 Td +(the )Tj +1.662 0 Td +(container )Tj +4.385 0 Td +(implementation. )Tj +7.386 0 Td +(Extensi)Tj +2.983 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.828 0 Td +(stress )Tj +2.606 0 Td +(tests )Tj +2.162 0 Td +(not )Tj +1.718 0 Td +(only)Tj +( )Tj +-40.31 -1.44 Td +(measure )Tj +3.98 0 Td +(the )Tj +1.703 0 Td +(performance; )Tj +6.092 0 Td +(they )Tj +2.203 0 Td +(also )Tj +2.092 0 Td +(v)Tj +0.488 0 Td +(erify )Tj +2.258 0 Td +(robustness )Tj +4.871 0 Td +(and )Tj +1.981 0 Td +(stability)Tj +3.243 0 Td +(. )Tj +0.647 0 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +1.702 0 Td +(new )Tj +2.203 0 Td +(application )Tj +5.205 0 Td +(serv)Tj +1.71 0 Td +(er )Tj +-41.367 -1.44 Td +(release can ha)Tj +6.138 0 Td +(v)Tj +0.488 0 Td +(e a negati)Tj +4.15 0 Td +(v)Tj +0.488 0 Td +(e impact on the non-functional requirements described here)Tj +/TT1 1 Tf +(.)Tj +ET + +endstream +endobj +373 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 374 0 R>>endobj +374 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(157)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +(Entity Control Boundary: P)Tj +11.682 0 Td +(erhaps the Simplest )Tj +-11.682 -1.222 Td +(P)Tj +0.511 0 Td +(ossible )Tj +3.187 0 Td +(Ar)Tj +1.044 0 Td +(c)Tj +0.482 0 Td +(hitecture)Tj +64 0 0 64 443.416 517.8 Tm +(8)Tj +/TT0 1 Tf +10 0 0 10 75 439.4 Tm +(T)Tj +0.511 0 Td +(he )Tj +1.452 0 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.896 0 Td +(in )Tj +1.23 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.952 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitectures )Tj +4.564 0 Td +(are )Tj +1.729 0 Td +(created )Tj +3.563 0 Td +(in )Tj +1.23 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.896 0 Td +(EE )Tj +1.396 0 Td +(6 )Tj +0.952 0 Td +(is )Tj +1.063 0 Td +(fundamentally )Tj +6.565 0 Td +(different )Tj +3.953 0 Td +(than )Tj +2.286 0 Td +(the )Tj +-40.866 -1.44 Td +(w)Tj +0.76 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.016 0 Td +(they )Tj +2.35 0 Td +(are )Tj +1.849 0 Td +(created )Tj +3.683 0 Td +(in )Tj +1.35 0 Td +(J2EE. )Tj +2.554 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.572 0 Td +(J2EE )Tj +2.35 0 Td +(progr)Tj +2.266 0 Td +(amming )Tj +4.016 0 Td +(model )Tj +3.239 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.405 0 Td +(\(it\222)Tj +1.02 0 Td +(s )Tj +0.905 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +1.016 0 Td +(8 )Tj +1.072 0 Td +(y)Tj +0.482 0 Td +(ears )Tj +2.238 0 Td +(old\205\) )Tj +-39.532 -1.44 Td +(intrusi)Tj +2.65 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.953 0 Td +(and )Tj +2.065 0 Td +(required )Tj +4.065 0 Td +(the )Tj +1.787 0 Td +(hea)Tj +1.526 0 Td +(vy )Tj +1.453 0 Td +(use )Tj +1.898 0 Td +(of )Tj +1.287 0 Td +(interfaces )Tj +4.565 0 Td +(and )Tj +2.065 0 Td +(c)Tj +0.482 0 Td +(hec)Tj +1.538 0 Td +(ked )Tj +2.009 0 Td +(exceptions. )Tj +5.307 0 Td +(A )Tj +1.12 0 Td +(strict )Tj +2.509 0 Td +(separ)Tj +2.266 0 Td +(ation)Tj +( )Tj +-40.032 -1.44 Td +(between )Tj +3.974 0 Td +(business )Tj +3.919 0 Td +(logic )Tj +2.418 0 Td +(and )Tj +1.918 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.529 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.195 0 Td +(not )Tj +1.696 0 Td +(pro)Tj +1.433 0 Td +(vided. )Tj +2.882 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.418 0 Td +(had )Tj +1.918 0 Td +(to )Tj +1.14 0 Td +(start )Tj +2.084 0 Td +(with )Tj +2.196 0 Td +(a )Tj +0.806 0 Td +(set )Tj +1.473 0 Td +(of )Tj +1.14 0 Td +(patterns )Tj +-38.81 -1.44 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.099 0 Td +(as )Tj +1.432 0 Td +(Business )Tj +4.211 0 Td +(Delegate, )Tj +4.655 0 Td +(Service )Tj +3.654 0 Td +(Locator)Tj +3.149 0 Td +(, )Tj +0.821 0 Td +(Session )Tj +3.711 0 Td +(F)Tj +0.445 0 Td +(a\347ade, )Tj +3.377 0 Td +(or )Tj +1.432 0 Td +(Data )Tj +2.525 0 Td +(T)Tj +0.482 0 Td +(r)Tj +0.321 0 Td +(ansfer )Tj +3.099 0 Td +(Object )Tj +3.488 0 Td +(just )Tj +2.044 0 Td +(to )Tj +-41.366 -1.44 Td +(implement tri)Tj +5.761 0 Td +(vial applications in a reasonable w)Tj +14.933 0 Td +(a)Tj +0.47 0 Td +(y)Tj +0.408 0 Td +(.)Tj +/TT1 1 Tf +12 0 0 12 57 331 Tm +(In)Tj +0.877 0 Td +(v)Tj +0.488 0 Td +(ersion of )Tj +4.021 0 Td +(T)Tj +0.511 0 Td +(hinking)Tj +/TT0 1 Tf +10 0 0 10 75 308.6 Tm +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.809 0 Td +(EE )Tj +1.309 0 Td +(6 )Tj +0.865 0 Td +(is )Tj +0.976 0 Td +(different. )Tj +4.07 0 Td +(T)Tj +0.511 0 Td +(here )Tj +2.198 0 Td +(are )Tj +1.642 0 Td +(no )Tj +1.421 0 Td +(required )Tj +3.921 0 Td +(dependencies )Tj +6.256 0 Td +(on )Tj +1.421 0 Td +(the )Tj +1.643 0 Td +(platform )Tj +3.921 0 Td +(except )Tj +3.143 0 Td +(metadata )Tj +4.254 0 Td +(in )Tj +-41.366 -1.44 Td +(the )Tj +1.738 0 Td +(form )Tj +2.404 0 Td +(of )Tj +1.238 0 Td +(annotations )Tj +5.407 0 Td +(or )Tj +1.293 0 Td +(XML. )Tj +2.682 0 Td +(In )Tj +1.238 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.904 0 Td +(EE )Tj +1.404 0 Td +(6)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.21 0 Td +(the )Tj +1.738 0 Td +(infr)Tj +1.433 0 Td +(astructure )Tj +4.627 0 Td +(is )Tj +1.071 0 Td +(alread)Tj +2.643 0 Td +(y )Tj +0.904 0 Td +(cleanly )Tj +3.516 0 Td +(separ)Tj +2.266 0 Td +(ated )Tj +2.238 0 Td +(b)Tj +0.538 0 Td +(y )Tj +-41.7 -1.44 Td +(design. )Tj +3.508 0 Td +(P)Tj +0.464 0 Td +(atterns )Tj +3.285 0 Td +(and )Tj +2.063 0 Td +(\223best )Tj +2.618 0 Td +(pr)Tj +0.877 0 Td +(actices\224 )Tj +3.84 0 Td +(are )Tj +1.784 0 Td +(needed )Tj +3.619 0 Td +(only )Tj +2.341 0 Td +(to )Tj +1.285 0 Td +(solv)Tj +1.711 0 Td +(e )Tj +0.951 0 Td +(application)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +( )Tj +5.62 0 Td +(or )Tj +1.34 0 Td +(domain)Tj +/TT2 1 Tf +(-)Tj +/C2_0 1 Tf +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c )Tj +-35.309 -1.44 Td +(c)Tj +0.482 0 Td +(hallenges)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( not to solv)Tj +9.076 0 Td +(e platform issues. )Tj +-7.758 -2.24 Td +(Not only the control w)Tj +9.765 0 Td +(as in)Tj +1.989 0 Td +(v)Tj +0.488 0 Td +(erted in J)Tj +3.823 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE \(see \223In)Tj +5.267 0 Td +(v)Tj +0.488 0 Td +(ersion of Control)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +(\224)Tj +-24.566 -1.44 Td +(http://en.wikipedia.org/wiki/In)Tj +12.939 0 Td +(v)Tj +0.488 0 Td +(ersion_of_control)Tj +(\))Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +( )Tj +8.728 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.827 0 Td +(process )Tj +3.994 0 Td +(of )Tj +1.605 0 Td +(creating )Tj +4.216 0 Td +(ar)Tj +0.821 0 Td +(c)Tj +0.482 0 Td +(hitectures )Tj +4.939 0 Td +(w)Tj +0.76 0 Td +(as )Tj +-41.311 -1.44 Td +(in)Tj +0.822 0 Td +(v)Tj +0.488 0 Td +(erted )Tj +2.501 0 Td +(as )Tj +1.223 0 Td +(well. )Tj +2.446 0 Td +(In )Tj +1.168 0 Td +(J2EE)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.418 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.446 0 Td +(usually )Tj +3.391 0 Td +(started )Tj +3.168 0 Td +(with )Tj +2.224 0 Td +(patterns, )Tj +4.002 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(ers)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.806 0 Td +(and )Tj +1.946 0 Td +(indirections, )Tj +5.67 0 Td +(and )Tj +1.946 0 Td +(then )Tj +2.224 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +-41.088 -1.44 Td +(started )Tj +3.138 0 Td +(to )Tj +1.138 0 Td +(analyze )Tj +3.638 0 Td +(the )Tj +1.638 0 Td +(business )Tj +3.917 0 Td +(logic\227a )Tj +3.916 0 Td +(typical )Tj +3.194 0 Td +(top)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +(do)Tj +2.823 0 Td +(wn )Tj +1.638 0 Td +(approac)Tj +3.483 0 Td +(h. )Tj +1.138 0 Td +(In )Tj +1.138 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.804 0 Td +(EE )Tj +1.304 0 Td +(6)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.11 0 Td +(there )Tj +2.471 0 Td +(is )Tj +0.971 0 Td +(no )Tj +1.416 0 Td +(need )Tj +-40.088 -1.44 Td +(for )Tj +1.498 0 Td +(upfront )Tj +3.444 0 Td +(design. )Tj +3.296 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.443 0 Td +(can )Tj +1.887 0 Td +(start )Tj +2.109 0 Td +(with )Tj +2.221 0 Td +(the )Tj +1.665 0 Td +(realization )Tj +4.888 0 Td +(of )Tj +1.165 0 Td +(business )Tj +3.944 0 Td +(logic )Tj +2.443 0 Td +(and )Tj +1.943 0 Td +(introduce )Tj +4.444 0 Td +(patterns )Tj +3.721 0 Td +(and )Tj +-40.588 -1.44 Td +(best pr)Tj +2.878 0 Td +(actices on demand.)Tj +/TT1 1 Tf +12 0 0 12 57 134.6001 Tm +(Business Components)Tj +/TT0 1 Tf +10 0 0 10 75 112.2001 Tm +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.969 0 Td +(EE )Tj +1.469 0 Td +(does )Tj +2.47 0 Td +(a )Tj +0.969 0 Td +(good )Tj +2.637 0 Td +(job )Tj +1.859 0 Td +(of )Tj +1.303 0 Td +(separ)Tj +2.266 0 Td +(ating )Tj +2.581 0 Td +(the )Tj +1.803 0 Td +(business )Tj +4.082 0 Td +(logic )Tj +2.581 0 Td +(from )Tj +2.469 0 Td +(the )Tj +1.803 0 Td +(infr)Tj +1.433 0 Td +(astructure. )Tj +4.878 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.581 0 Td +(can )Tj +-40.644 -1.44 Td +(concentr)Tj +3.767 0 Td +(ate )Tj +1.773 0 Td +(fully )Tj +2.385 0 Td +(on )Tj +1.607 0 Td +(the )Tj +1.829 0 Td +(realization )Tj +5.052 0 Td +(of )Tj +1.329 0 Td +(domain )Tj +3.774 0 Td +(logic )Tj +2.607 0 Td +(and )Tj +2.107 0 Td +(almost )Tj +3.329 0 Td +(ignore )Tj +3.218 0 Td +(the )Tj +1.829 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.995 0 Td +(EE )Tj +1.495 0 Td +(platform. )Tj +-38.31 -1.44 Td +(Usually)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.811 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.394 0 Td +(start )Tj +2.06 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.782 0 Td +(analyzing )Tj +4.45 0 Td +(the )Tj +1.616 0 Td +(target )Tj +2.671 0 Td +(domain )Tj +3.561 0 Td +(data, )Tj +2.394 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.838 0 Td +(results )Tj +3.005 0 Td +(in )Tj +1.116 0 Td +(domain )Tj +3.561 0 Td +(objects )Tj +3.339 0 Td +(or )Tj +1.171 0 Td +(entities.)Tj +( )Tj +ET + +endstream +endobj +375 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 376 0 R>>endobj +376 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(158)Tj +0 Tc 0 Tw -20.132 57.06 Td +(Entities )Tj +3.349 0 Td +(with )Tj +2.182 0 Td +(similar )Tj +3.181 0 Td +(responsibilities )Tj +6.684 0 Td +(are )Tj +1.625 0 Td +(organized )Tj +4.571 0 Td +(in )Tj +1.126 0 Td +(pac)Tj +1.538 0 Td +(kages. )Tj +2.959 0 Td +(Suc)Tj +1.538 0 Td +(h )Tj +0.848 0 Td +(a )Tj +0.792 0 Td +(pac)Tj +1.538 0 Td +(kage )Tj +2.292 0 Td +(is )Tj +0.959 0 Td +(named )Tj +3.237 0 Td +(either )Tj +2.737 0 Td +(b)Tj +0.538 0 Td +(y )Tj +-41.7 -1.44 Td +(abstr)Tj +2.044 0 Td +(acting )Tj +2.93 0 Td +(the )Tj +1.652 0 Td +(responsibilities )Tj +6.71 0 Td +(of )Tj +1.152 0 Td +(all )Tj +1.374 0 Td +(included )Tj +4.098 0 Td +(entities )Tj +3.375 0 Td +(or )Tj +1.207 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.818 0 Td +(using )Tj +2.597 0 Td +(the )Tj +1.652 0 Td +(name )Tj +2.707 0 Td +(of )Tj +1.152 0 Td +(the )Tj +1.652 0 Td +(most )Tj +2.374 0 Td +(important )Tj +-38.032 -1.44 Td +(entity)Tj +2.298 0 Td +(. )Tj +-0.498 -2.24 Td +(In )Tj +1.395 0 Td +(later )Tj +2.45 0 Td +(iter)Tj +1.377 0 Td +(ations)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.368 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.673 0 Td +(extend )Tj +3.451 0 Td +(the )Tj +1.895 0 Td +(pac)Tj +1.538 0 Td +(kage )Tj +2.561 0 Td +(with )Tj +2.451 0 Td +(reusable )Tj +4.173 0 Td +(services )Tj +3.95 0 Td +(\(the )Tj +2.173 0 Td +(\223control\224\) )Tj +4.784 0 Td +(and )Tj +2.173 0 Td +(a )Tj +-41.7 -1.44 Td +(dedicated )Tj +4.505 0 Td +(service )Tj +3.281 0 Td +(interface )Tj +4.004 0 Td +(to )Tj +1.115 0 Td +(the )Tj +1.615 0 Td +(outside )Tj +3.394 0 Td +(w)Tj +0.766 0 Td +(orld )Tj +2.004 0 Td +(\(the )Tj +1.893 0 Td +(\223boundary\224\). )Tj +5.801 0 Td +(A )Tj +0.948 0 Td +(pac)Tj +1.538 0 Td +(kage )Tj +2.281 0 Td +(named )Tj +3.226 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.781 0 Td +(its )Tj +1.226 0 Td +(domain )Tj +-38.921 -1.44 Td +(responsibilities )Tj +6.685 0 Td +(with )Tj +2.183 0 Td +(dedicated )Tj +4.517 0 Td +(external )Tj +3.738 0 Td +(interfaces )Tj +4.405 0 Td +(is )Tj +0.96 0 Td +(a )Tj +0.793 0 Td +(business )Tj +3.906 0 Td +(component. )Tj +5.462 0 Td +(It )Tj +0.849 0 Td +(is )Tj +0.96 0 Td +(created )Tj +3.46 0 Td +(according )Tj +-37.921 -1.44 Td +(to )Tj +1.445 0 Td +(the )Tj +1.945 0 Td +(\223Maximal )Tj +4.833 0 Td +(Cohesion, )Tj +4.947 0 Td +(Minimal )Tj +4.223 0 Td +(Coupling\224 )Tj +5.002 0 Td +(principle. )Tj +4.687 0 Td +(All )Tj +1.834 0 Td +(containing )Tj +5.169 0 Td +(elements )Tj +4.445 0 Td +(inside )Tj +3.168 0 Td +(a )Tj +-41.7 -1.44 Td +(business )Tj +3.992 0 Td +(component )Tj +5.27 0 Td +(should )Tj +3.27 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.879 0 Td +(similar )Tj +3.268 0 Td +(responsibilities, )Tj +7.049 0 Td +(but )Tj +1.769 0 Td +(different )Tj +3.936 0 Td +(components )Tj +5.659 0 Td +(should )Tj +3.27 0 Td +(be )Tj +1.435 0 Td +(as )Tj +-41.311 -1.44 Td +(loosely )Tj +3.389 0 Td +(coupled )Tj +3.834 0 Td +(as )Tj +1.221 0 Td +(possible. )Tj +4.112 0 Td +(Some )Tj +2.721 0 Td +(business )Tj +3.945 0 Td +(components )Tj +5.612 0 Td +(do )Tj +1.444 0 Td +(not )Tj +1.722 0 Td +(need )Tj +2.444 0 Td +(to )Tj +1.166 0 Td +(maintain )Tj +4.111 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.832 0 Td +(\(persistent\) )Tj +-37.587 -1.44 Td +(state )Tj +2.603 0 Td +(and )Tj +2.27 0 Td +(so )Tj +1.603 0 Td +(as )Tj +1.547 0 Td +(entities)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +3.965 0 Td +(they )Tj +2.492 0 Td +(are )Tj +1.991 0 Td +(created )Tj +3.825 0 Td +(considering )Tj +5.66 0 Td +(the )Tj +1.992 0 Td +(responsibilities )Tj +7.05 0 Td +(of )Tj +1.492 0 Td +(controls )Tj +4.104 0 Td +(and )Tj +-40.588 -1.44 Td +(boundaries. )Tj +1.8 -2.24 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y comes with sev)Tj +7.379 0 Td +(en business components: )Tj +/C2_0 1 Tf +-9.814 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(configuration)Tj +/TT0 1 Tf +(: )Tj +8.366 0 Td +(Responsible )Tj +5.456 0 Td +(for )Tj +1.454 0 Td +(centr)Tj +2.155 0 Td +(alizing )Tj +/C2_1 1 Tf +3.177 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gur)Tj +3.545 0 Td +(ation )Tj +2.455 0 Td +(in )Tj +1.121 0 Td +(one )Tj +1.899 0 Td +(place )Tj +2.621 0 Td +(and )Tj +1.899 0 Td +(consists )Tj +3.622 0 Td +(of )Tj +-37.766 -1.44 Td +(boundary and control)Tj +/TT1 1 Tf +(.)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(logging)Tj +/TT0 1 Tf +(: )Tj +5.029 0 Td +(Responsible )Tj +5.719 0 Td +(for )Tj +1.717 0 Td +(creation )Tj +4.051 0 Td +(and )Tj +2.162 0 Td +(injection )Tj +4.33 0 Td +(of )Tj +1.384 0 Td +(loggers )Tj +3.606 0 Td +(and )Tj +2.162 0 Td +(comprises )Tj +4.884 0 Td +(a )Tj +1.05 0 Td +(single )Tj +-36.099 -1.44 Td +(boundary pac)Tj +5.929 0 Td +(kage. )Tj +/C2_0 1 Tf +-8.429 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(maintenance)Tj +/TT0 1 Tf +(: )Tj +7.18 0 Td +(Comprises )Tj +4.802 0 Td +(only )Tj +2.191 0 Td +(a )Tj +0.801 0 Td +(single )Tj +2.802 0 Td +(subpac)Tj +3.039 0 Td +(kage: )Tj +2.579 0 Td +(the )Tj +1.635 0 Td +(boundary)Tj +4.021 0 Td +(. )Tj +0.579 0 Td +(Manages )Tj +4.135 0 Td +(cac)Tj +1.482 0 Td +(hes )Tj +1.746 0 Td +(and )Tj +-36.988 -1.44 Td +(returns the current v)Tj +8.657 0 Td +(ersion.)Tj +/C2_0 1 Tf +-11.157 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(monitoring)Tj +/TT0 1 Tf +(: )Tj +6.619 0 Td +(Responsible )Tj +5.509 0 Td +(for )Tj +1.507 0 Td +(exposing )Tj +4.175 0 Td +(runtime )Tj +3.674 0 Td +(data)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +2.424 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.896 0 Td +(as )Tj +1.229 0 Td +(the )Tj +1.674 0 Td +(number )Tj +3.674 0 Td +(of )Tj +1.174 0 Td +(exceptions)Tj +( )Tj +-33.987 -1.44 Td +(and )Tj +2.307 0 Td +(the )Tj +2.029 0 Td +(slo)Tj +1.211 0 Td +(west )Tj +2.64 0 Td +(methods)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.613 0 Td +(and )Tj +2.307 0 Td +(pro)Tj +1.433 0 Td +(viding )Tj +3.363 0 Td +(access )Tj +3.473 0 Td +(to )Tj +1.529 0 Td +(diagnostic )Tj +5.086 0 Td +(data. )Tj +2.733 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.751 0 Td +(business )Tj +-34.987 -1.44 Td +(component )Tj +5.188 0 Td +(monitoring )Tj +5.021 0 Td +(consists )Tj +3.632 0 Td +(of )Tj +1.131 0 Td +(the )Tj +1.631 0 Td +(boundary )Tj +4.41 0 Td +(and )Tj +1.909 0 Td +(entity )Tj +2.687 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.501 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.353 0 Td +(entities )Tj +3.354 0 Td +(are )Tj +1.63 0 Td +(tr)Tj +0.599 0 Td +(ansient )Tj +-35.543 -1.44 Td +(and used only for JSON/XML serialization.)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(statistics)Tj +/TT0 1 Tf +(: )Tj +6.639 0 Td +(Exposes )Tj +3.75 0 Td +(daily)Tj +2.02 0 Td +(, )Tj +0.638 0 Td +(hourly)Tj +2.687 0 Td +(, )Tj +0.638 0 Td +(and )Tj +1.972 0 Td +(minutely )Tj +4.139 0 Td +(statistics. )Tj +4.195 0 Td +(Contains )Tj +4.14 0 Td +(the )Tj +1.694 0 Td +(boundary )Tj +4.473 0 Td +(and)Tj +( )Tj +-36.988 -1.44 Td +(entity la)Tj +3.416 0 Td +(y)Tj +0.482 0 Td +(ers. )Tj +1.704 0 Td +(T)Tj +0.511 0 Td +(he entities are tr)Tj +6.879 0 Td +(ansient.)Tj +/C2_0 1 Tf +-15.492 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(store)Tj +/TT0 1 Tf +(: )Tj +3.607 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.458 0 Td +(core )Tj +2.291 0 Td +(business )Tj +4.015 0 Td +(logic. )Tj +2.792 0 Td +(Manages )Tj +4.236 0 Td +(the )Tj +1.736 0 Td +(hit )Tj +1.514 0 Td +(and )Tj +2.014 0 Td +(referer )Tj +3.179 0 Td +(cac)Tj +1.482 0 Td +(hes )Tj +1.847 0 Td +(and )Tj +2.014 0 Td +(computes )Tj +4.57 0 Td +(the )Tj +-37.266 -1.44 Td +(statistics. It contains all three la)Tj +13.365 0 Td +(y)Tj +0.482 0 Td +(ers \(entity)Tj +4.076 0 Td +(, control, and boundary\))Tj +/TT1 1 Tf +(.)Tj +/C2_0 1 Tf +-20.423 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(useragent)Tj +/TT0 1 Tf +(: Computes user agent \(bro)Tj +16.949 0 Td +(wser\) statistics and contains all three la)Tj +16.699 0 Td +(y)Tj +0.482 0 Td +(ers.)Tj +-35.93 -2.24 Td +(Most )Tj +2.394 0 Td +(of )Tj +1.115 0 Td +(the )Tj +1.615 0 Td +(components )Tj +5.561 0 Td +(are )Tj +1.615 0 Td +(dependent )Tj +4.839 0 Td +(on )Tj +1.393 0 Td +(the )Tj +1.615 0 Td +(logging )Tj +3.45 0 Td +(functionality; )Tj +5.951 0 Td +(some )Tj +2.56 0 Td +(need )Tj +2.394 0 Td +(a )Tj +0.781 0 Td +(reference )Tj +4.281 0 Td +(to )Tj +-41.366 -1.44 Td +(the )Tj +/TT2 1 Tf +1.696 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.763 0 Td +(boundary)Tj +4.021 0 Td +(. )Tj +0.566 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.418 0 Td +(CDI )Tj +2.085 0 Td +(ev)Tj +0.988 0 Td +(ent )Tj +1.696 0 Td +(mec)Tj +1.815 0 Td +(hanism )Tj +3.474 0 Td +(w)Tj +0.76 0 Td +(as )Tj +1.251 0 Td +(used )Tj +2.363 0 Td +(to )Tj +1.196 0 Td +(decouple )Tj +4.364 0 Td +(business )Tj +3.975 0 Td +(components )Tj +5.642 0 Td +(and )Tj +-40.588 -1.44 Td +(get )Tj +1.86 0 Td +(rid )Tj +1.749 0 Td +(of )Tj +/C2_1 1 Tf +1.416 0 Td +<004B004D0048003D004A005E>Tj +/TT0 1 Tf +(uous )Tj +5.529 0 Td +(coupling. )Tj +4.64 0 Td +(X-r)Tj +1.265 0 Td +(a)Tj +0.47 0 Td +(y )Tj +1.082 0 Td +(components )Tj +5.862 0 Td +(are )Tj +1.915 0 Td +(a )Tj +1.082 0 Td +(perfect )Tj +3.527 0 Td +(example )Tj +4.249 0 Td +(of )Tj +1.416 0 Td +(the )Tj +1.916 0 Td +(\223Maximal )Tj +-37.978 -1.44 Td +(Cohesion, )Tj +4.971 0 Td +(Minimal )Tj +4.247 0 Td +(Coupling\224 )Tj +5.026 0 Td +(idea. )Tj +2.673 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.691 0 Td +(example, )Tj +4.58 0 Td +(ho)Tj +1.1 0 Td +(wev)Tj +1.766 0 Td +(er)Tj +0.759 0 Td +(, )Tj +0.913 0 Td +(is )Tj +1.302 0 Td +(r)Tj +0.321 0 Td +(ather )Tj +2.802 0 Td +(unrealistic. )Tj +5.285 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.691 0 Td +(strict )Tj +-40.144 -1.44 Td +(decoupling )Tj +5.464 0 Td +(between )Tj +4.296 0 Td +(components )Tj +5.908 0 Td +(is )Tj +1.295 0 Td +(possible )Tj +4.13 0 Td +(only )Tj +2.518 0 Td +(because )Tj +4.129 0 Td +(there )Tj +2.795 0 Td +(are )Tj +1.961 0 Td +(no )Tj +1.74 0 Td +(relations )Tj +4.296 0 Td +(between )Tj +-38.532 -1.44 Td +(persistent )Tj +4.608 0 Td +(entities. )Tj +3.886 0 Td +(In )Tj +1.385 0 Td +(more )Tj +2.773 0 Td +(complex )Tj +4.274 0 Td +(scenarios)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.802 0 Td +(y)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 279.085 88.8 Tm +(ou )Tj +1.663 0 Td +(will )Tj +2.163 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.051 0 Td +(to )Tj +1.385 0 Td +(deal )Tj +2.385 0 Td +(with )Tj +2.441 0 Td +(cross-component)Tj +( )Tj +ET + +endstream +endobj +377 0 obj<>/ColorSpace<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC]>>/Type/Page/Contents 380 0 R>>endobj +378 0 obj[/ICCBased 381 0 R]endobj +379 0 obj<>/Filter/FlateDecode/Name/X/Subtype/Image/ColorSpace 378 0 R/Interpolate true/Height 592/Decode[0.0 1.0 0.0 1.0 0.0 1.0]/Width 1569/Length 153833/Type/XObject/BitsPerComponent 8>>stream +H}hUۨ=encR&ce4jt_2 zP lv5AG ֺuRU-mC<{}:ޓ}=?sv&1s y ~! +0g$0ܷrug8󘿧bwfe`nG*ͻ'ܚu._M{wͬ;[NS55[8U +|V*wkXTs@3R̨?jgqJnfY@{4juTJ_~K!K'OI@e.52;X,˟QOdJ3 M`UЪ[Wo̓d$%KS$%'u;7&4BpI4ANSMVG4|' e*K~Q֝ԕ? e57ޥqL沏޷˖-koolv/_1s{W,kk|Wx ܉r=*>,2 C~n޼yhhh#,,L&٬tuTҖV|fERQK'WyD۶ST"bH$ +n9rD}1MSj{Z[ ;cNY5^2CZt M+kn~lG_YŐg{U1gYa򻷵u``͛cccRxYQTdddJ,`>rm2>Fp8<>>>22244$yaq4MQ +٤ޡ-+=W1JwwWs9 ?ҰW.v}s糛^}{XsN!񓝭Zw7vı=/V=ț}ƃ~nmj6yeYaoppP:YjYR9bD"J2t8Rۓ)p? ̜뺲zbQ0gY۶d<=t$c(lR ;_pgxK^xWO,{$pۢ[3Tʅk=zcvQsй,2 Cި---7nfFRRR%TLM6N\.9# (;(kJd#H(?x c@Rp&7(ѱXz^&׶~Q4w>}@á3q%fKv+rw>,2 Cި_q""$$<bkDwj`ױZֵu+jAmǪ[T|̺*u*,  1B7y_1q~&ÄsϹ=7[N, +A?--AW J6n1f: @ &ڠǙL&hvz^AST +bppP&IRH󻺺ۡ{vttdff1tCVr"~C6 +*Ecfn6@R(iP^T(UY72F4ͬׯӥ0Lj6As6/(*v\56F + + &G/9uD9F !D(Єj::k+Z(%(p4?~sn90Uòu&7/\h.(-s[d!iwM-El~ +XT *9vq+3?;Vg@ 9L&@ Ee0,\.|Ͻ2 АJh4Aomc@ imdd:`j* +\Q$ .蘭xܷoaLg@ 0d%'74jCљkDwWy{S2pk?YvYwDwg!-Ko{Tk 2gH3f}oXh>&oQ?trת9AXIac[x8wvK -j/z#I/Ra"g3b,O$2Y=8LH, +-foRr齳 +cIi-G=iiW\Tԩ-vxrGsoNfS=gce+x9Dwʂerj?߅.ߞqTzȤEZɑm/:_E=Asntq֭x&0L3>>tr[[[{{;(g>/R)(jՠjN d2>I 4 h4Bj* +L&HMEpZZZlvzz:x1 DFr^WuSH^u56@:|;etxgc謁1ł7=| -SI. I!ânwew[gz-]艻, R)^\7{vUǂ&t yyZʸZ0yG*l˰'(fW#yu6AƯRY + yiyk #{[/o)ۣ bIŢ00d7>R+U11TRr8˴ +sit:`8'b=\gѼ Y\}|*dzc@wCdXq% `](ٙL')W~Sщ&4C7jZW[. FAduսh㪔UUT*IB6.7!#nnrvX3+>NFD 33h;ME_*}/pnl"(TLkٓ]nt3 +0$,4GݯWj(Sn"i}L +xՊۙG琐ĿA0HFtآ +=ֈ$L811ַo:U28*˳[Q:.J'2g͎bt;f-豬i{^xv/?ψAW|]t1+>Tp}T___]]r9Fb1@ +P1T7֊@˸NO!㆑@Gj.2t/'J/}5;f (,~. "R!uH[eb@@ll].^Xڎ`ꞻ"ݥm~xߏҪk6 άJgp^[G{LDdUV6 (J'ɯ?w9Krt+ykhZQ/WL"L888X, +e? ѣG555 MJMkZѡ!RT,wuuxF. ߞ'11 c;6=&q! Wg+ڋ Cjf`$7j,58G.;Dj ﱦqB'J֕ lY ,{QZ<i>%ٜoזA϶4jN'uUk~19ىOaڗ>2l^jUYbQ(Ç*++?~ٳaR ԭ v888888jZVVC4::P(KP.D>XSSSQQQUUFb1@ +P"/3oo/7 d;%©2nhx.A#P +YԍRs+VK8A@cMPЉٙL'$!sR(iG bG 8á&97}=qCqHs띒_}%iߟAÖZB} Y"VK?o!vէKgמ<C2(53vrBJQq&eF!xڥ@,bP j=Ei`K 7 U愊mkpaD*J`vE'.% |C/{adto7.*888 ŢP(_XXX\\ ɵ:;;bT*jx'mJht:ݘnU_mz^—A###/zzzD"@ hmmmjj*--e`$f0 1 }cSk1l#'%jbG˪ERȸa$ꑚ7Ϡ_x|i[y.^;!%ncXcPK_3;sꭲFs0G˝3&+M&'ۛ4.[`T`Mun]oGkŚ/.(J3P)-ҹlW~1qW2hp-5 EW#;'O\݈aĸ};8(`%^~[w,I(i3bH.^YfܺVW,{WQ>dD~<*+Qb(u#'2++ hkCCr*(J5*fpfUB|[=}K&g='3'QŸ,g2 7?μ*X7 '|` OŲt)6X<ۥyx:ў0gɑB|goר$X|1+"fT*7n(++&׷tvv/ L&Z. 6p{Ou@L@k3 ́fZh| KR=z +]3ubPxCFggqIr4p +LN7i^]N(GĽ$"=YX=5^3P9N\f+_ΠrG,!\" 9Z,p'do?uTP(\{2֙ߒ9Lb{'Y']N`i<%D;X_UJQbV^g/!YF BLw&;1d9#a 7Vyv{Vv <0ߧbY^:) q>vid(kx'W$#F8 I8oϱR,!l6J\RRRZZ +|2"8j À8mශ8pm]@ /z=hsٍ+ +$IP(|A[[[cccmm-eHII`غ1 ]~|(k3GHjMS`pI-" u#EYȤS~=/Ж~˗Bzǀ+8N3PE©x.31ck\Πٙ娡|5bϭ{\6*e*5ƙVq~f4bjeն!1Iÿ&ݕl̚] y~,Z*B#m/QTQPK rTg9TYșJ(DMP#>S73J*t!O>w\{45 +NJg4ىPń}<" VҹN+pX^öA- āclF>ū?[,sT/z'==X)@`T*6lvݻwꚚ.xiਥRRTTum0u@L@kZ4qBАD"Š-PSSSQQQnNC`0l].?>ељ#YǏ}8~ۉWMW]aɊQQ44_zZX%>|%F8`:J>S\f+czLj'A3 q QC8rOqϝY1v^մ?G/[w|b(&jT/VΛaM;ހv><7IW0B%<ሕE}y{*oɫϔ͌ +]ȓϝ|f>Mҙ(MvbZd1!0 fn@/z4r)3va){RNđclFxޑ%$XIvu6MNS߹sbxƶ6{{{J]T*U*p:`0n"x֦ZZW(### J$BagggKKK}}=p8eeeIII53 [W@ ˏ7tmt~w +%m7Ò]"3}\aT`Mf7'Г-#\O;{8fOmX.3_?w84[X&&E2RW>xP!D/ר,/D EFbQt>j1(iq9:ey@@ J@B^9{ $q-'}>?Q7<հB0v u(DPf4)<ɤ{/ēգ cb1wÏb9t,bw Ōf7L})CjǪr4@+#1WdՖÆ:귞3Һ*pLlfht +Mj|xΒLNlH +=}'*i}xOĩqVG&a:rFkϻ'Yx8Um/0@r~E@ .KG L Z.//khhhnnD@Wu6@ujV tT7@ Ļ6FR# >B!Jbq[[ \P5X@L@}!Bv\SL0;Uu>Gm$+yQ9YR`#(X8$L"{d[9X(nZ l[h_7I${aȿ{3D1;Z7I!rZ[ tRgJ%)2yMjaϾc¢Vn UH$7YcW̥Θ|xzƣ[aݧwOM#a1>mRhV 3SJ<+Np_ `"ø6QlwЯ?E%Ylf"4Aъ ;,t4:RoEXg3,i,ž9j[Y%6U!^}}\I4M#^.mHy#9?}"brtvc Zx@?744--:;;e2YOOP@oխVZ-S@ 04J>\.Jb1B痖`2Ś/=(Z~كy=&Q'3LpR 6ͧB nr`)zw3h.g* S.KBwG梸]j!'m}AHsnSI%qÄa(31ՄFր?vA{wc%VuɌL9pt;DY/jàGLa̓;1>{:q&>ϭTN,>uN^ܲsY%m+nB[K|CHVؖFwgd~U /*G)D 6g]m'ӈeU#C3mC@6{)\cLlL&f5  /O^ +|"f4xfl%cnղU~Q'X.3L@ZKS"\c.Vn-֦q. Rv|z.gɊضо y|y${a=PGh9ؙKHK;q232![\ɨыwv7Qg䩋E5|:qƼ?1M.x fݞIXPT}yN/uc6'/efed)# sl'}ݿد(;P@`Q񥢀ĠCMbNj%R[Tw`c +q m:N&$*L2V84ܑ=;]۫+r{x'/?ncu}{]W|?aoaYkҗVq#eO}gQrة6.r˻?<;(J{_4G*K ny㖯\rUu]_*8u,/|e_cOȻU+=3~L7.ya?yndiƿhxcܱKWd?ˍ[n̬>4~{x+sFؘ-[Py +Lp*$YWW|gϞ;w… ТKCry<hзuP(=\M B - ~;<>-"1 cXh$jDEɽ}yQw 6HI)IiA;ۿa`Ҽ_Ta[gBq=ߞ}Of˞7G \5-95O~W>r8RwIY8rZo¹PKLڼgPĩF ?Xm$أ4t.!kɜѨش%9̔*׮3SO#6y֫9O;9 U]@:/U KNՁzoui~47cʝ%=uǭ_ΰ*F.>&x% _ N܊mly~_<ެ[o"O c ߓ$ɺSNAO&j,kۡKCry<hзuP(=\M B - ~;<>-"1 cXh0R)5^BhW-_[OmW;hfoي%&'&$Ϝ='=+{k_/jք*ڱƭ=)QVQH\8:zgu=ıcTD^GUHYD3-TUg-Nws|\k>qp?nn^stkW>|g`; W ZYZ }z޿[˞ޘ`^WFY{+0^l,_ +9gּ //N1siW](];Cf.Lxbk%8~sYg.=x<A`0?$I644hZ8h2V+˲v44jA\.て }Zw BB!4 ڂȃsݢ(<q0i^ S*R(J `_\Ka|WO}ZkQ>gG{Kڮyz`Py%閖/0t/+`%kg3݂0!`0f$I644hZ8h2V+˲v44jA\.て }Zw BB!4 ڂȃsݢ(<q0i^ S* EQr!WYZ %ȦBw`0f$I644hZ8h2V+˲v44jA\.て }Zw BB!4mÂz|nt:0l6z)LPH/Eɽ B_ei k^ B=@$RjFLӴbaY8ШyE:64mк{C.&Bi31at:"Ģfcl6FNP(B@JM5r/!` ~HTTjZz- ˲AF(бiC߆ 8p7BM089;<>?p8 !m60fh4t0B! P%&B=@|Rl*{1!t AkFJRF4mXX844jEQ M6n˽ Bh AAAAAA9Nh1FQ5) +(7B2ǥYUR-bB  ׌$IJV5^ib,qtih<ϋ6mhнC{!д ȃs:bf1 c6FNk/uljaxcx p ,7:-@  +.Th-pj,W'C)#ȿǟ_?"YQRcιBι{cQsν7FuQ ""ρa0y>Zo "fZ)%Jס~""""_1 +!RJc9B9Z{c 4zιFcۨn7 +DDD_90p9&Ç[kA,^Z+C):OADDDDk1F!zXJi:B9Zk}FQ9hl6zՍFß>k>3a0k1Zk}(^#~-(@K)1Z\!\k1(9Fo(ptG}a0v< ou7x]WkR޿Z?}ѯa)1Z !k1ZE={QmT7""8 bjRRJzZ맏 """"=,4Xks!s>@K{o46JF{OADD5a0|}Du]RJJ{>RCkDDDDDcBks.shisFiQho8:#s`0s;LֺYVJI)y߇Ruh>bBcu΅rε-s(m6G?}| fcaZ}c1uJ))%PJGZQRcιBι{cQsν7FuQ ""ρa0y>Zo "fZ)%Jס~""""_1 +!RJc9B9Z{c 4zιFcۨn7 +DDD_90p9&Ç[kA,^Z+C):OADDDDk1F!zXJi:B9Zk}FQ9hl6zՍFß>k>3a0k1Zk}(^#~-(@K)1Z\!\k1(9Fo(ptG}a0v< ou7x]WkR޿Z?}ѯa)1Z !k1ZE={QmT7""8 bjRRJzZ맏 """"=,4Xks!s>@K{o46JF{OADD5a0|}Du]RJJ{>RCkDDDDDcBks.shisFiQho8:#s`0s;LֺYVJI)y߇Ruh>bBcu΅rε-s(m6G?}| fcaZ}c1uJ))%PJGZQRcιBι{cQsν7FuQ ""ρa0y>Zo "fZ)%Jס~""""_1 +!RJc9B9Z{c 4zιFcۨn7 +DDD_90p9&Ç[kA,^Z+C):OADDDDk1F!zXJi:B9Zk}:a(0\2o)V`QE0$0D^3mp(9Fo(pt#~sps8;\cqRJJ)`}RסzzѿyZcs1ƜsFQ9hl6zՍFßADD3p|[lRRJ!kR#{/@_u߷㜋1kw4zιFcۨn7 +""888DbkR +!Xk߇u(ADDDDo{!z\1\kQsν7FuQGpv<o5![kRZ>C)"""" !u68b9Zk-s(m6G?=g>7pk1Z+B!|JG^o19c9Z{hisFiQho8:DDD?9pp9.LJ[k1pZ)%B־)PJ==߼Bu]}k1ιcι{GK{o46JF{O ""ρpy8>ZkC-J))}H)_RDDDDDB[kmqsε;ZE={QmT7z|ngZc "nVJI)CJ:RO """"7=|]}Zkcs.Ƙs(9Fo(pt#~sps8;\cqRJJ)`}RסzzѿyZcs1ƜsFQ9hl6zՍFßADD3p|[lRRJ!kR#{/@_u߷㜋1kw4zιFcۨn7 +""888DbkR +!Xk߇u(ADDDDo{!z\1\kQsν7FuQGpv<o5![kRZ>C)"""" !u68b9Zk-s(m6G?=g>7pk1Z+B!|JG^o19c9Z{hisFiQho8:DDD?9pp9.LJ[k1pZ)%B־)PJ==߼Bu]}k1ιcι{GK{o46JF{O ""ρpy8>ZkC-J))}H)_RDDDDDB[kmqsε;ZE={QmT7z|ngZc "nVJI)CJ:RO """"7=|]}Zkcs.Ƙs(9Fo(pt#~sps8;\cqRJJ)`}RסzzѿyZcs1ƜsFQ9hl6zՍFßADD3p|[lRRJ!kR#{/@_u߷㜋1kw4zιFcۨn7 +""888DbkR +!Xk߇u(em + W K * +0<L Ѥfh}BBRkmzSJZk-s(m6G?=g>7pk1Z;ctν^RDDDDDBBZkc{R*Z{hisFiQho8:DDD?9pp9.LJ[k1p}9s}\:RO """"=,ZcR){GK{o46JF{O ""ρpy8>ZkC-9s㺮סzzѿa)cާJ);ZE={QmT7z|ngZc "nvw9{u#- @K)k>TJ(9Fo(pt#~sps8;\cqs1Fu(ADDDDo!!zXJ6Xk)RJFQ9hl6zՍFßADD3p|[ls1:u]C)"""" !!RJ1ZO)Rjw4zιFcۨn7 +""888Dbks9>zJG[ARj1Z}JRkQsν7FuQGpv<o5![k}cιq]PJ==BBRkmzSJZk-s(m6G?=g>7pk1Z;ctν^RDDDDDBBZkc{R*Z{hisFiQho8:DDD?9pp9.LJ[k1p}9s}\:RO """"=,ZcR){GK{o46JF{O ""ρpy8>ZkC-9s㺮סzzѿa)cާJ);ZE={QmT7z|ngZc "nvw9{u#- @K)k>TJ(9Fo(pt#~sps8;\cqs1Fu(ADDDDo!!zXJ6Xk)RJFQ9hl6zՍFßADD3p|[ls1:u]C)"""" !!RJ1ZO)Rjw4zιFcۨn7 +""888Dbks9>zJG[ARj1Z}JRkQsν7FuQGpv<o5![k}cιq]PJ==BBRkmzSJZk-s(m6G?=g>7pk1Z;ctν^RDDDDDBBZkc{R*Z{hisFiQho8:DDD?9pp9.LJ[k1p}9s}\:RO """"=,ZcR){GK{o46JF{O ""_*ryd΅ (^3-:c?J r%JUepKf@]K~tv;<߽3a0|iq ba뺶mZTUYuDDDDDBJ)1Z!SJhiuιFiQho8:|#̼a0v< oq1aﺮmۦiUUmu]}ѹ9a)RJkmzC1ƔZEs.QmT7_"";3/0p9&ÇiG "fqﻮk۶iEUUE]kADDDDtn9!zXJZcB1FQK)hl6zՍF> fcaiYڶmjQUfQGsNR*k>cL)Q9R +FuQ ""3a0|iq ba뺶mZTUYuDDDDDBJ)1Z!SJhiuιFiQho8:|#̼a0v< oq1aﺮmۦiUUmu]}ѹ9a)RJkmzC1ƔZEs.QmT7_"";3/0p9&ÇiG "fqﻮk۶iEUUE]kADDDDtn9!zXJZcB1FQK)hl6zՍF> fcaiYڶmjQUfQGsNR*k>cL)Q9R +FuQ ""3a0|iq ba뺶mZTUYuDDDDDBJ)1Z!SJhiuιFiQho8:|#̼a0v< oq1aﺮmۦiUUmu]}ѹ9a)RJkmzC1ƔZEs.QmT7_"";3/0p9&ÇiG "fqﻮk۶iEUUE]kADDDDtn9!zXJZcB1FQK)hl6zՍF> fcaiYڶmjQUfQGsNR*k>cL)Q9R +FuQ ""~a0ϟ?ӧOm6lڿܜsBR)6XkcJiv3u>x:y^"gX`~嗗/_x~O?A|ӧO'O||_㯾O?,=z\ +ׯ~DDDD8a)RJkmzC1ƔzK)ՍC<4G>ݻY;ڿ|_Љ荜sBR)6Xk!cJivs)ex:_G_裏6Dy9'@I)RZkc{B1n9Rp=i絏 "Z>'|ryyw"h}~WD)}9'@I)RZkc{B1n9R{777xh}޿ŋkǏ7˵ ѿحN< 7ҊI5XgOIm'i6P9 DF.Lyapk1m~MJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-1sNJZ[ksB1\JZy1ƜsujRJSJ|'7!-_矧WC9 'TJi9}!Ƙs.\uwk<cι:}yVN))sכmO?sg!lR*Z>c9RZc9ZgGN/jRJSJ|'7!-߱3?_~~i3_ht3l'ڪuv ;¹@ځ`T)n z0I@l"lC=Ԧ朜i_7noޝ=C{I<9<AOf8y^IdYVEUUMt]aiYmۘ \< ?ĿV_1@Q(2 i:rICH| +,t,f-..믟y{{{}}}*fӦMcccIH!'"0hl#q< I,ˊi|0 4-˲mqu=}?$]g9ƿMV^a,#QPd2(t:%!I*lұtҥѮTLSSӫz陙c$BEal68A$IeEQTU4M|>oieٶ8뺞tn㯲]eJV-tszj #ǟ$^Pd2(t:%!I*lұ633sަTLCCCww˗B!( àgYp>׷qT̆ !*BHEal68A$IeEQTU4M|>oieٶ8뺞t,+-b ,D*1NW*Juq"K#7R 5|)O-uҿAB!ɠi7r a>IXM:r uᝏ>觟~wB!( àgYp2 !r{0 l68A$IeEQ0hz>7 4M˲lvu]|O: rZcX]1Xo J+\.ۑRT,p`xrEՋe<11=:::44駟{zwOo߾}[5___I{6l؀=oϿ,bAaxEA^n/JJG#P(ERIӹ\.pO:̲lұ܍0b&lnc=֭ޖz5'ı%D] [*!˗/d={vhh?|ן}Y7dׯ@cc#v?86w>tJv=vsssTAgOM6q H$2MUU5MuӅaiZe۶8x<}?$c9G"@Rqr`E8'Q̱PGGG}-[(:ΦM/6o҂ 8}W__<ꫯq~Y<,I!0JYV1{I [L&5Ns\R;0e٤cqhϟسg϶m۰{w/>~ƖZSx/b"ELVBw}'dan_~5 Ku#Ԅ*Wk#Oo`#s;vl"GEa8wc8yA$IeYQUU5Mu 0 4-˲mq<,aϛtc"@R+vT*E+KѣlooG񯫫ZG h;/Booo bX=ySΜ9z=iJD4fYiQ%EY--Q #MQЂ,J\7m@fӚyt~k |0}캮믲򒒒޻w/'''%%%>>>,,,((hӦM86ދ-—۷/99/mdt /:G$U]2PӌbܱLIR!f'r8ctww?z(&&fÆ X~1ݰaFܱcǡCBCClق_~]~| ;9_LU샎ė/_ưnmm%0 dT?x ::ehh8% LLL"ݹs"3xu@իb. U7 \gΜ9~8\ʕ+i222""pLLLpl6,BP$J$ށR;222m$SF3z1KJ +B1@ߏ~o<&|۷1\\\ ?s===e˖a߿>6++S.hďU*"ϟR?i&- 4| 4\.\(d> +d q=1DAE^F}| "X,̀&a:aBk)a:MKKKaaɓ'!_VVV~:Űٹ>}:##UUU X!Xvލiŋo޼͛}ihGׯ_qf}}˗/sss=lii9o޼7U1oߎ t- ¤ɂ<}ĉk׮DBݻ7&&&333??_[zzz'laER*--d]p!44ŊK,daxb{&Vt> ,x|>B(D"X,Hpq +J%.&4?2B1L\T*%t~ǡhׯbR(9s0_֬YyA©K'828mmm555yyy>>>Ǎ5,K3.]1PeQQЅBMP7IZ]XڌLvh8_'''!3Z<9ӱL{0q + + +04_]\\ʰA0ѷ@^mjjr̾MpGuuu=:w8ڸ`eeqƋ/VWWߪ @rW燄\ !/0̌DKKVmm-$ٳ~~~_LJM/>0-0IzRlX8.|>^P(bD"ijj}-P*Xu2aʡhFdb388R +MCwx͆Бe===(u뢢Х0Saq᱋ϟ?m6b###D`WZ_ZZ҂jeQPc)WX3y^Є, +g:aBk&a: +Ess{ccc3~߱;v,77ݻwrG7~ ի 6,, _^|yҥ˗Vr+WŚo' ۷wSrww3,|N)$%%ر㧒ejjE .. ?@ fq\1BH$ۋWT .ce: ”@3ƨ#A]0ׯuDX__~ΝYYYTrCC.ZHH3ƊvsAGlkkCP17g + +EBI ]a8ytL G$J@9@6ip8L2hllr劷… uVKVUUuvvNj0s1̝;-11hO|0,4͆rXop"H,:wtt`FcŶ; -Y 0bT Z@@ Ppr'!555)))bkdd>uTIII[[tLFXdEGG/_8 +rW+I't LbpNNNRp -X mw1e + 1G!1ʃmllClhhh7wwwòb3E:S.22c'E n533Ӿ+V/**%kb!_sssrppz l?ӑ@ 011A3lX8.|~EEP(ļ ^7sbe: h4Q-j0:@EQ(pw\ *???00PG]1\|||fhyyyAAA:ӧO( +ׇj T5GUq'`:YL&cX88'''Tt8VEt,S i7edqԴ5ͩir,UCQrKHAQ0 C/4"HF&]0J\h\-k#ʙsͽ6?tq=<w{]s;8Ϟ}%0 @MMMnnnRR8Ԫvx\\\fffyy9 +7|mmmݽ{|sν~tNOOO]]ݎ;F,DaYYYF:F +ja8YH8ajFDaYV h6VnÒ>pxXD#rx< e{𳭭رc#f)SS***uh0Sz{{!.a|l6J&M&p(*t,HK.-X@Abcc/^|cq$7oΎGQQQϟ?]6½&&&AbP(Jwwŋ͛'qqqK,p($.ǔ>}h4qNd2Y~~~ss3?)VJ^R 0 vFt,z\pbXv-l0%}XEB G >tԬɁɓ'{IIIO\~W^C< Xeee+V$H֯__SSˈlC#0G p7mW*A|fS(|?7BO1RH2CqqqFFxes r8~I<6/xOwwwee… ;%99yǎO>r'nɓ'g͚%O8с<"H#x|QBB +>\db +j$M&p(*t,^:&&F 6mjhh;Q]Op .`Djjj* ǏG) +ʕ+ 8uԼ&xL/ 1Ο??w\JKK+..)VJhWR 0Zh4:eY^l6-jw\0p`O +mXD#~Cc@Cn7Zpu~$aBbn߾GXW+XH]\\\nn.fCgӉwbwwǁ)_P($T-AdʡP(P D: +%r>᧟J"xׯ%%%3g[ ~tt,ǖ;w&''ɺu@IHD&O1cxd-Zիf`(=}tb#؈F:@ +?jR)zUTB1 ?ht:˲z`0FbZv;,oc`]XI2a~1<:pn<:ux >D|e2̄,eJ"Nǟ('@ L(b" +ͦP(P\n2HCD'STc! 7ϟ/iYYYUUUH`}855U$$֭[HGGDE⑕]]] D:F֛7oM&d2>>ttʿjOѢJaZht:˲z`0FlXVnw\o+CPF0O@ }^n ?!m۶I$aB?~&*Xׯ_a./_~=,qTKrU@uP&< +p8j%}Q(d"9@NR$?>|L&bb}:::H6QhՅoեK@IGGLl11˕tСNҡMT޽%YuuuPPVJhNWSajFt,z`41",jpؼ0`.!(E8I( +r 1xR ]SVV&˅їwޗ/_>P׳gΘ1Cl49;Tvc( +zzQuDA9Hic +j7LáP"~˖-ɓ7o aN:|Μ9B! IFL06kkk333$H㏖OEW\={m>|thʟZ;mT*!Q-:eY^o0^fbZvrchh!(Bc'A!E'np80Ǐdě9sfii)E?LGVVI&R@QP UG`XPM,z|Iibc + +!M&p(r*t,c D׵kӅQ|3ҡE،6lRqVҡQ(8˗/ (%%˗/C4?~#:::://ŋC7*JѓJaZht: m8%_hJeTj[nDE݉ +.)Rq#U*)Qp1U18c# A։@i2IK$|;Ckmr${ydEQdt]7 #`AbDc#".2mr6lvvM2D$X,F000cǎ/fr_&]MWĉ>=UVݾ}}ڵk;?44DZW`ɒ%xg񆒖FE0vޗʃ"EU, \ҵeQQ^/8p<A$IeYQ UUCaD"U1:t#ofS6L&NR)ʲD"a&cݙVSSsʕh4J6F,Z… ߿w,X_[qpvqڀtAp8̲,NaMHˡP +'X ޼yuVwWUUU|СC ,pLx<uQ(yaCC;޽}fddT)I(z^qXx H$˲(`PUUS] @D!mr6lv;mjd2iYV,ÀZpڵe˖ʆ ^|I?uuui+qL$Ev,u ]AD8fY0 N +p~L3OZ,}UN:. +evymKK;o>44DZ`驪rG~$Rzlay> I,ˊAUUCaD"R'3JL>M3ed`h&LZH$LӌOY}V݋ ]wxM*++p/_ gc8\mVMi R.peY/0COIk1>澪7o$-`qzs+//x"KҺ(p˖-ڶm0iQ)g…}.]nOZ0EaqV8 $ɲ( +扪PHu0"H<wr(z/,myG&gu&f2I&ee4(~لFvam6RQD!1*TAJQQAB *W*t\Ob`1Faf23Og}mm}k!('~ι_k:zjCCiҥK|H[64,GQdYVEUU]#aiFQ۶ljbdrtt4QIƯR e}L&N{H$/_>m۶ 8>}:ܪ[l-n޼YWWG|ϟ]O<;v|(FMiqp(p,+: 0M3ڶ8N,K&8?qՉ{v;2N)bX@C,:yZH$koooSS>-z"S 8b0ܹs;;;8?bj:f +eY0 V$2y>~B +ihhf @Z޿xutt e`L777?ϛ7ZׯwGŋA[F48JED8YEQUUu\ai۶8X,L'|X*X@T*r]}ɧ,y7_^~=9uuunbk[r% ܹ$Rc0M)x::f + +eY0 T$2IN UڢS 3"c|5Y.]G[cu=<͛C"Fiq(p,+*,EiihԶmqbX2JNrl.OTJ@\.d[(D2xJ\CCC'O wJ[["\qʕ[n#,t:f|!+cy˲ha0j2$Ie2\vmܹ۷VĘFݻc{ݺu1pݸibL#===6l0 "ƬG4(QdYVEUU]#fh%fz4ڽsN2^ݻGƟtɒ%O>=1|d`<|X,GZq7EPu]Ay,v@>!I$Z&f~eLڢgDkǏV` 8 ;7nhϟ7mDZq܋/h+bb4M%AD8YEQUUH$bVd4mqܛdg.åܘ8-i X +qJ;,L&ySș3gµr9E0('ؾ};&;^}"`\L\G @.& +eY0 M$2̙CaV|e``" +cǎ!Vxb7o+mEيiH("ɲ(4 4h4j۶886$\.`7ՀJ@\F|/Aeі`'d.ID[˯DdVĠ@WWWU9E[s^|xbՍ7VĠÑuĉ1ڊM8DQDeYQUUu]D"aFmv\alB8cTFCP/.\XQ1]E\p+BQPD# +6~`hp) BLgL&MǙIӹs˻x=3[ XLR*yJ8 nٲ4D"qy'`۷-">tuu!`$뺅B@!`cQj1A\ 7-ˢ:`>!MI$Yt£GNN'N`R3YzŊDϟN`LӧO7 ˖-#2ttthF;6A!Q1ɲRUU] hf*JӶmc%ZxXLJ\.dAx:: +SNM>+>2W\iii!Jl߾Ϲ\.ET*1a iHtp]W\eю`L0$I,ν{Z[['[(:D @s%6n܈v"on޼9c Ν;1NĠ̝;wfϞMضmSiqGEp,+a$I4ST:mob>}ttǏj앴Zm<&0 1(Yb\.GJ988yf@GhQ/|uժUč~ȓdǁ9hdd؅V#bhwEReю`L0v$I,^__H$]F;^ӹ}vF[[۫Wh'b0vAeKKi'b l`7oNh$4M8򈢈NeEQTUu0d2if*JӶm}+T;>/j11Q4aV*rbAy +:/O6chQ_̙ܿD;vr9BP,!ip @Oq]W\eю`L0^$I,ă&={i'b:::6mcJ;ٹ}vKK qSD:˗D[b0hqE#,ˊad4Mtڶ|>>+T!bcP0S* ( 뢈DMlB@iQ|xp/^d2q󼑑 `ZRu/""} +A]}˗i'b#x77oL㯗b<&"% JR.Q P2L5\d2~i?~?}FrYfUzzz +`Q6u]P(%V*`|CO{-J-܉ (-ˢ:`>!]H$Y~Ǐ[[[IݻwNĨS^z5|֭[NhF>|B<ܻw/7ډuJ[[Qeǎi'b4qgDQ'˲(nF24M3Jame>}tt%&(K>DSA!(BEL4Tjdd<qL&S(Pܮ.+V^=44DR[ĥKA7r^,dVT$įcp]W\eю`L0.$I,mpݺu$!>NĨkΜ93m/Ҏh:Ytҏ?NĨkN<9ٲ^J;48#"F8YEQUUu0ɤiT*N۶M}l?~V%E>DSSc(B90T*r +>1Cx)BOr46,=l$ó뺂 x,vcIhg 4^mܹ_0@fbgϞюh +0۷{ډCMiDi-(beYQUUu]7 #LJmX'WOvj-͊!Zx +aR)Ǡ@(y6448λw,YBCwwwX}Fq)ό3^ +٬뺅BFAP*` T c("UA$7hz6l /_7ډ ƅ MpEqSL)k׮%\1sč7ha/qUDQ'˲(nF2ry{8im,^AQ`.7/E хݨŕxC2(TXd@4DJ*FLo2txoΏ}O'=Eb{sGu0,.N|XT*jh4M,1Oi3>MzVs]T*amI2LRy9-Z+۷v999  6x'af"X'sy +LӤOHEvɓ'0:j'ᘞdFFFl ,x98}E[l@;c( +qDp$ɲ#neYx,[$VHibA (MTrd2dF& aڵOTqiӦM>}BC.m3$t]6?CN% "ly)I;0#",͛$R__߻what*x/^8;}v"F0~:lɒ%0:ӧO6lwډsEQ8$ `$Ip8DTU4Mu0,"[d>/X!j #C;>3>(y5urPmn*bLf||t[nюlL^ +͢h"iJ%'%g"uioy\K(2Mv#8`>!=GEYCI .ЎlVZEtr +8۷իW._L;ˉN׮]1Q8"F8IdYÑHDUUMt]7 òxߏЎl01 +ST,l6kvP(ˮBzy,mZDZ9-p|q-P4MqQigW<+WܸqgqAҥKD5k|vFs5b˿|B;cΡ( +q0Dp$ɲ#neYx! GEIΜ9CK_,+JZm4dm}yDw'y^ur\(ld2d2#WW8055n:bѣGc%r8NQO + +ig|ƴOf<ϓ4MqtQ&ԴxbΝ;t0m۶0No߾&^ҎDbDÇc1q#$I,H$iaYY|XT*6dFgrJ%q0d2|h./\͛73L':qP4MqQ)hK<|bF w^"ءC\Nl&&&SWW8spp#G`1WP8!F8IdYØTU4Mu0,N|XT*X3bad:gm6F\yZ.fŶmlT*޽|CCC[ıe˖z +MOO'L&J%x'xNy +LӤOHEbSN(&aqآE0ӎl?Ntڳg1qٳg1&&&haECp$ɲG-iaX4fbZ6 ,Xi"}pխV wy^^jB`6d2Ŧׄ|ğ>#Ӗ.]4 +D"dr8z>2iyW +LӤOHEJ4ϓ [n,D%c>066zzz>|@;#A:{,iY;v(J1ӧOI389( +A0I$r8D"ja9iU ch6Xi"}pM:JBr9T'H;L>~x(+>/^Ў2htƍd +.fYtBP.]׭jh i<Bi0 i2(R hŊ$( ymۃD'NЎH>~tRbѣGha,DaqsEQ8?MhIj +~"tlQA,HABqnAnVЅ܉؅ Etd(BFJSe|g4ߟr/ܫ-jy>NeEQ\.Bia 3F"xBhC>|H\s΅rqbb1rmziaPFUUQɲ(rȉnZJrb\Vȉ z^kPT,L&L&q/@ 6oL'Ohg ߾}Lw]4}>_(FD"NgY8sd2=19pRAq|r /$54u__>99ꌶ񦦦hawܹsF(o>birQU8AEp,+rn4Mu0~?]*rbQZHmp^GkLׁKp8Ç_۷oh/04:;;5k<~4M +b2Z:( +009mStyu~B>m$5nR"ƚY߱c m9UA+WЖh/4M!-AUU9DQ +'˲(. i*#H<ORȉb9DCڇhYlheY< l6N#bP(<FoݺEmۼ^/mv&|8|0\x1 .--4d2|T*̕J&3>o')<^%m9 F IVt~~ԝmZ]hHjĄ###0V4?U^|I[n?44DF˗iaPCUU`Qɲ(rG4] H\.W,rZ%!Z۶[lhrVÛ,T*L&u^/~O>M^'_3ڔ{ڵӧO0'G(FD"Nc + ƆaWXn@[o +jH$R)$bXV imgtVX|>piA'&&gC[>%nKcX"HӿfHRazN O[o `h,[*eYRP(e4 O>%nٲ|F=z:W^E bd2ɐ1c09$`u=!HSҥKɖnb- njʕ䍆r8Zp!޽{p +,/Z8,$IX,UUVfÄHa8bhRC + )xh3 d4q4pt$B!vvS__O[RRZ>]v3np8`W ǢO*QIp*&H&U^^KKK,k9Ο'FQ^xQ\\{;9ueAUUPr<{Ƙ6mZgg'k99B%NeMn_pfYEIEX,l.p8C +1@03in#w)@D Rqt:Lh4p80>~x̙>ï^b( +vٲe0ĉ/_ vTP(DLrR7m`yy9B?>*'d4H۷oSj4ubTEQ{{q8c5k(XZ`T]ZȲl0p L&,$IX,UU1(l6 ^a +eYx94ۜF0a2@ҏs h\;"GМNq8H$ +|>_ww7t:(sxfg4N>Mܸqc[[Lx>PL(|>ܤdd?C0,//GӧO?~ŋs8ҥK555TLFYSh޼y]]]ጕ7n?׭[>{ .a-W^%_M>k9!˲` `2f($)bXTUZ ]. +cX"ӆ0aU! `idX_j98H)FKd/B!χ[pv >߼ySHΏWXAK]]]gggGGxn޼,z%r8A+5|CSSk9נ߰aYʕ+p +,.d2͢(J(bQUjl6z~8HH$0fYu6180IǠ +F!h4h`ZV )oƛ!q8l<%tvttFΜ9C9j*t8gϞ%]]pn$ &O&0?LZ#މ3'? +)ڕ;whhT'6pMcc#UYTJKKJ|ׯSɪ{{e==U& ($)bXTUZ6ra$hbX"HR4bI|88oخ_[g2̤ׯ/\pkii5-Ӡ BKa"@K&x2(+p7իWS^|`"9122i$tƌ=":n +"|&RUѯʻwN}vΗH$חL&a{' kF5v ?v:03,ݻ/_G%;wdx ݲepŬp8rmjEEMr8lF6X|9Z)r8Qy&yuݺuhY.dBEQ$EQ,Vf\<D*Bthİ]5cz "ΝK(**'xɒ% bBkx c~#oƛ0q8m1TUUQ zkp~oN2^={ӧO;4N|z{{au*L`!1l sC)c hmm&ÇSeegl?~h4|TiӦDZ u Z8iԩYZZZXY .]_M]m)i#U0;[!*7B+0,H ]:u@] _WB8GcZ*z߷M"ٹ7D9ia&c˲d26 +BRc% % VJqN.NRv2)~!?>77GV__|y!>?22Bj]d}"Q>$4 UfjX,.,,pT*[nX9q0'\zU*vttwGWIlLWF(oP~?="_2ݘceXL$xDBD/>bLNN\ܞ={hGNQ(ݻjΜ9[m۶mf<9-GXqiY_~Z=rq^7 jaib1˲xiuP iem\$A|xo%I>y󆽖oZf?bؚWՏ?ϏR)"-mYY\va;V }rN#3uvl6NӧO;vZT)ÇTxtL&KRV[\\ק̳b Y+->H$8DBD/98}y\ܹs֢P }hh":-G\~]Z֥K֢PӧO{=*v׮])(N8v\ܸ ni/˲xi5#RPv{K $mI\n[_h4ȤȘt|͚j=?vAR5MVsr7'eSv_h΋|*{n>#>?U +E|ءt:z3iS<z opZɔLyeh4DBD/u>b rk|si9 +ź~t/:E0zv޽Cb]|7Ҳk(N8v\\ niX̲IRqm\7š˿4Ij.dRNۍ~ϷLcǎzJ? bvEB.윋ޞ˦rR9&D3==a }b]Gr:!2,Ke ZW\udk=h+J\ٳ\ʉ'ЏG{t_B=l6k^4nyo)͟) ӇG|>@D<FP(4 +NB^._,vM(A)vǎ (6QiYovZB^Qnwir%\.AMt]7 be%I4ڎT~׍Ɓ{,i{{&[,uaG' huJ%oC[\\\sL&#yxxŋjX,ZVntlHyԕ5,æl141==}+Nt:PQٳSSSDbfff~~>yOOf,Rx<F"D/E>b]۷o>];-Gvi8_|i9ҏ=SrZB~giY.\e9-GG⮽^/J4] 0M3YL&8BPT8m6N -z'`.uiۤNm4ZGC\?x<>?<].wzia&e`YV2K%qm\7[`ĬtcO\^^&fMjRfǏݻ>oqqq-2~d.hd)Il6ٱn;$v:\9d"@ 94J߿/{n>C% +pF~?yA5W,~}xz +ſ3Ӗ)HR2ӇXL$x<F"P(4KXF'|};#(ʕ+snܸEavh,2bh<?~N:ZD=ܹs ###<ٳgq ZˑH6Ϟ=-… ZkT˥xhhZm6nw:GQ +إ٨d&affffO-1 GNXiB\__gGb9<<܌~g^z=ooo'ΉFP2lm0PS +ñ-|`4'|`0}xbbBEoqqҸɓ'T_  D"ASM'goC4g1Ce4L +fc^v8Ef؝,AHsUӧZkHIꡡ!H*[PggxAH${ԩS޽{Ip\:6VfvxEP]:Lf2vl6cgWK SlʝBrܻNYcX4 Cpss3M&f+_^1BT*EE|0QT n%CEl "߼yS[[r_Ւ!fUl$Y\\\^^)sGiP}(K~n!#ՙ}>uL"fYb:Ih2<ÇiDZˑHHOOh;GQ<چo2X+b^ǎc,ŸL.abr +JvvvJ>W`93KTH0 + [cooZ$x]]>11A j766أJ'>Fk?EH<ҏc1VWWR"#|^v;"fY4jŢu2ǺqZ$3??___/6[fr$O7ojE";N =™ׯ_755d2mnn|H <)08pW)Jvvv]D`Sda~q1|ۥHQ8==с욚H &,//O 幼NRBa{{VCP/*v(B'0\YYaџ zn-b6En[,*^H$uuu'TYS%4^|)Zֵk״"ZɓZkT˥xbhZ~vtz<EQ~(bfN&LM}ݛ \E'Vzyկi'#ojjŋ7LxҲWp^|"ܹH$Kr94LV]/"Xf, O0;;{%a[wK$B-:666[$GQDS3(Z 5B`*@הZ4 $0՟D^v;"fYjŢu_+^ÇZkH ѣ3+}"ZD}zzzDzZ$d9B>'IHr1xbhZm6nw:GQ/7S eAeÂ::*At4:蠠,* $G65mnlnd2&b| CO=>ߟ9~u^@  +QCi ߇FÕ +FHzd\.JbɍMnO$ӓccc^Ǐ.ݻwZ t+NΡ +dS/) 0 HDB<"YLn!e$S#L&L&4A5.l\"F!CQ#pnn, +KKKi1m8F1Yvhvˈʤ>Y*+u6hm2NB[,322v8ܹsG Da/,xL&t8&*4۷oZ- |>XNMMM?)_F|L&3 rH+]]]][[1MN SK"wY\/"S~y2%gϞmٲϞ=K$5.l?~,6˵kרs7>>Dbh@ڀ?+GT%G1(JY g=bٺ*FQ&I$$>Jz%W. N{FQT"vVKLxR-dDD|>pEуmmm5^-l={PMMM߾}OM8FG%N啕1pjAYALiʏ")ȹT*Bd-~l]F&I$$ѣGn߾v,24GU766G$<#ݻj"(R޽TNCDaF}zlX,Vn;Nǃ Bhi?M[8>Jrb1/,,d2d2"s\߿Gؿ~Z` T2_XXd2d2E"L(ntxx˗/Z- >x<{{{)쑑Ԕp"Yb,؈F{˿q +g7/ȏ޽{7߿kZ"<ϟӧ5F󙙙YzP(EBˈVA $2?+}~JͱҬʼn vl6[W(d2Ǐ/VH$*ϫWԎEXu$ÑH͛bd}QX$ +p84 fbZvtz<@  +(t:f(m6-R0E~iiiqq1si&I$SSSp8 z{{_xQ__O7Ç===$A&`r "Y.V"px%-. RT,fgg(|>BK.rDhoo}98t:.MڃtPm(;?+TcR;MblUh46Lj'!5Ȟ]vF'OD'˗:U_j#Q;wOV;DI,֭[ .DaZfZvt- +C+ *闖Bg2,'3 :*< nt+N3߿w\>o||< rBP,\. {["]\8T*q>&X,699I$^d_. ˽{jW"lw۶m9'JуLӀNY^^=HIc(~P3Yy,>L*bn{hd2׼{Nv,jv8ehoo#֭[j"(V[ZZP\j#Qáhx\^o6-jN/NgY46JF{Sp>vO8!6 m^dA+Rە P(d2YAԲAX/vQc#cPk1LLLx< +F1M&IH6QGX$%a;wN7Vp$ +6447T;DI(SNQۻvBPDIFqz=.eZv`0FQ'T*FiQho^ommp4Bɥ7\|>ߧOjkk|D3|2wǏS㓓`8O& }(`2zgڱKeD(95cĠx7Q>v xV%~}MMM{{;022BP('t:MDBEocm r,+\F 楩IKT"ٱ}/]Dz<6iUaa!( WWWENHz1Gj}Y@ hNf*`4EIL&lxׯ"`( +SPKԂ"ƍrdI=E?^Vh4^7jvz~0DKD*BcۨnzJƁ|qJ%u=qnׇ?}V%~}MMM{{{gggww7o( +h4Li%ޖS|s\.Qsihh}RɎ+++?N'R_|m8??O...b6cGn"cƚ +0u:6hCd2d:::ݽ{WX$aLUTTPGe{djjjR;DycǎGCzl6[,j].A4:HR)znzJƁ|×l&Ab9\'ޞ'O:t SHD궶b8򝙙FQ-eODRDXVwMs&Gﯫ#򡡡.Hv2(~COLL c'˭8}D7܌ɟY/@1GuȬT&IRTl]F&I$$p^g׮]޽S;DyXW\ґv8R__k޽Çj"(ϟ?/]DWVV\.Ñ(h4^7jv^Fo(ptR9 l6 c\(|n{``@ssV%~]H$}uuu[[ϟwff&Gd2NɗHoKaɮ[qߍVWW- Ƚ8999>>N0G!Ԫ.Hv2իW{D `Эx\ +]|H7܌ɟY/>b\Xk}DMOZbN'Vh_ɤvMpS^^><\@333p8&t:MDB?~ƶdW+< WVVH|[n;_[xW^ pK%΃D߻wY:q~~~aaaqqfWWWiщtS(1G95+Ǹfq"k1qt:m6[W(d2d#\üNUUDp$B{{BWcl gADWhmm#Çj"Q áhxV^o6~6aH#T`F1*E-Q,j7]E Ģ,ƛn):" Hl$vbY&\;)weM8i,&9@g)W^bvxKcFd;66mغ{c^/1x!(^; Sdommmll|>OOPlqT*~R}PH.S~N x^/f,KRJۚ]->~PBe~~~``*ǏS gggG0U":*yj.F㿳WidCF!Ю1""b]Ɖ +*YV gȯ?^l- F.tM6%?j[ZZȣh###Բ+0dH$Ծ4 z^x= 46h4L&c]5zuQ9H<,dX)l6NqLMr`?Vl6 qT*~R z)PH.yL6<; v*`7{A 1(=jAkt͆J\[[;yr\P΃:B5ի0ث@# )A$L$HiD"Qa +*Z;A^xԄ۹uZFt)yGGY,CCC4Pn߾-Q8V -QL&;Bhx v\9`ic& ^.obSl:p8 z^p8V+`TR)+2IC\.2lxxX#,,,/ u7JUㅪjZCa\~;@FX|ܕ+Wh<@ p 9Vb#Tf[^^ƒ`#H"d2\:OTB5ի0ث@# )qTDBb@`,"E12HZ +*Z;A>|H'Q`Dõo0j޽{Բ`4s!e2-0IF!}'Tj3 #ÂCaX GGt9rdnn._A9sFK$?*qqqQ( *%@X* Ŗ4jFaa(PXD^YYm4'*T*rjZ jbka0jWW:ڔrC#Q`ݺx":~0dÝ* +F< n;Nǃ]u4M&رic֍x\f"p8%W]cA p8Vl6 qT*~R z)PH.yL6888::&''斖nw @ommM@dy22ywM +ԦRX,F~ :ߺ|a~gϞ΢Q(y$? +MAT+}ClOj~ica(D" DEx͆5T*IjZ ~:Zr5JubkaիW`4n&I"N4 z^ł[v:46h4L&ccƾ76puQH<#\$NfpppVl6 H8N*BR=P($L&t_ι#~?܌br.+ +Uo[*޼#U<^drr+Ϋ2`XZɓ' 3o{o^-˗/#՛(j>(yUb*BS2惾!|'^jv:fA"bِFqJ5IV{1wuujnrLy7['t|W~izdb+cz{{Q#.]Ė`47nP[ >L&D;U(y^/b!xKcFd;68uy bK~/&?|<.wdsFXm>B惾!|'^I7t~20H L'fC6T*%Z;4<՜>}(ưu?r'u~sֶֶk"#Q#4gϞ% +-}1Z5ht~ >>jYbka$Hp +B<A˳N_WP(⬦`D(Qi+vu2V1g:P/]ݵnBoV6W<(1b~A¯] &$d I K ܞ+^V|<` )n<)&|TznjZM&ht!T.bPL&9㙴lfXx>!!O>)//|qhaVTD]uOOȐxAo9W.i +g$}uttqh#iii8JNBi⣿~1ĥoy㧛cȾci:mtyipqrjnRH&b0PCCC -0F + twww6Nf~jZl XDR%DޞHĄn:Sԅ.W7+O7 ڄuLr oei- . Ν;VNayn޳uRjuZ2Y\}?MRlAV?O#5 >f28s 9Ç% j  1]@(D"TR Iyv)N~>&|T.j2FNh4r\,*g2&x}%\pz~KK juttX,4Xr`JQxo:¯94۷jjjp#Ffm׮]/UE F{mQJbc,X؈?otb ;VGO%r;l^` Yvm]]B$޺u sX}Jcd2x6wN]bؑ:pDRvټ4q!iiinت:2(tra1ACB"LAwaL7AVn?lZZіH$Ap\ry<M1Ldggͅz\/*8,/Wu=&,w%c㭜% <OįSۆCYTNͧ;k֬K/1kuV4yTM_~()9[RzOE 9۹}ۖ,IIY$%ڙNl4H +2==n.aPLFBP$IRJԄ%e0vdžӆ߆ r">U^FDD4!T.bPL&3Ufsrr@̙qM6m޼9''m۶;vܹs{ݷo8_PPpCA~Wn~AكZ۷o0ٲeˉJQrԢ_W$8冧<3.KMzc齁ÎATxn6/ 0䆤VUU) +8L=fb8˅'V~˜n $,;\9\B,Q<>:'3vLy'6]aJz 1118+V% j  )BP$IRJE"`ND^t!erG%N$ʙiEࢉ7NNNM'AII G KGew7BOw$WتHYkJM7x<[t)t 2|S6-BH$Jc`0KQv Dģ r">U^Z:NrX |>Q?=Cɗ@KDQLءTLvV<*i7޺3z*:'G3Cq:<Er\r B$& HK$lOB=q;?}r(H$zN^? B )3h-xrR(Ll|u֝[/ΖѠGjTc3zjYQZVi0hp]C"YkjQitAM:N]SKCC+3}L橈.eyM}*tZ ԪAewH*t:K`J ;#Z; N]mmmaX555\.H$JM +ܘi0K6閩N8 (T8=̠RxKJJrunCzz:Ӥ3azuEcC(NU,rئz{A#ڧOy_Iθ7^f^)Z5^/֕p;**%FlR0$ ʂe>L-.h#F +Jolg77r%ʿ&r1bOxo0sߕFPv+oIa* -\1355\\vf拣PrfѴ1ՠ澤YVë-eС/UVնzms(bo_=40`u>|8l&YXXTi4BSR]]M  >00pϞ=sw^w))\A !`g-"AY]o70n\1?=K9و>C_WڪQx!"ȻgZ[K| D"YaA6~,+#BI/K޼ÎuM{_/i*U`:rVN\duvY$7 A|8HGqB -Z(##bUmhh"S.)JPZ+pch.Ip@@@QAYrkjjAR뙔"s?͕+W\ʼn8*GhVvbk lKxki00qnyD$ܺş㊃D$LR'(~'f/bu4x4KٷH"yy}C")T:*b ~lt^ϫ~yJrvD/tʉ+ٸ6T$66J + +jiiq57d|^~\\vf&gMO9%F0kƞZeMR5~>$syx||bG7!=Dz`%Cͼ|I6HﮉD$G 'Y1h +Cb3%M +j:n8 L6|:^QQQ[[񚛛Kdi;9 ̉t* +OT*HB!p8l6dUFP||Dc [ <~R3%p(()\A}$L?,evڪ.kTRiED[hvt'7-]cvQ2%k~t0.q夿U=w.o1n,Y8A){֚-gq7&+Tʂ۬x \|?al1j +:o>m +$PVeIOOgXUUUMMM"ZD*JE3441`4$8l y IПrygg'"ti@rkjjKJJ̠RmKJJrunÉ'͛DhO&oz~`Nv]g]}CƱ-tڙ&}L={ԈēٿٺQ.qXbNajnn/ Z&uww ~ép +q?0 U +L0WJRDGs86d2 *FP(?>>~```U °NT FS\\j:vDIAݘaT֫I>QfƺI&XZ*B<5<N[8ƒ=:z噱PR|3 T}`*ܷhco DEE!Gscs1duA+?wMdߛWN" +[غOB2\AsH ,<`R%j']5DЊxt# fB,yO!ܬ +%~I-);BY kؽe{C=~8@cU YgwY[b*\%C9}B؀56fcǎ)i<>--\Vv^_:Ra0F/]7BnUExU`m_!E'N t_܏ds 'Qsp9g#byĽ|b) +imȴp:MY.Z74w \a>Dgel:&,HT\*Jt:,..xQwtt ~\7xopB(̏ +̒0Q\&aެ,))!4??OOOTRK 078`@i5?66-{BF,!b + \ef*[vzJyu/}}`TʛԍT9j2_PpH0|\HD=/" 3(s咁>*θ /}`V"*$g/{o.1 ,SYj|ҡӻ_lQ^=>Zxчމ͢V(ַܯW+pwpI&'%%.,,p8UUUp|~sss{{;b1D"Je2Z &`W$;<$?P HFBc0JDDD#:؛0AѤ0"*޼|7 ,UOz4n=E%ɸSwՂ']pub9RH{7nd~`Ɏj'F =Tt0]-c%/P-zg^ +C] TG'fakń <<\a7?=NqR]174WG!.(l&uŻ/p}޵DCۻm6tB:r[xb 9'nأfVFֹ}$K-S qA}m ۷46 E$L=<֍}x1.Oѫ=ѭBɁB Ajkk={_fiiiQQʺwm%ߏܸ3gb#Ggff_O_e*Ė/d3tcTtx>,YbUʻK_"/ؗぺ&ۍW ޼yS۱LЀJPցťbsf>/ +;:::;;R)( rАBH$`5L&W"H xF԰첲2*(t*H^d`s{{F"8p <ۀ;v8*4;X`TYsFTc?mr`TD97a;0.gGa+Xz^mA녳)qpϡhHD +SyUvv1e-*o.m`pzPM` E{b&r]18KxOyأQXD:u㵶MՅq?vCF%-.NA>mGdw)>{yy<6 lGfSpS)L6MئP3S +&S5qD@}jzR3fYp? $QQ#G xKJJƈ,}[{R[B羧}LtBR͒6؛tPU%OPn>jze;ŜfZq)r+ԧ\5[y5tgf7UC78c7X~ׯc0:TvtttAp5mMZ}?OiF&ՠO;o{`kZcb; kJ$W%ޮ556UUUGb J5lU[g,C{t w7G?5nȽ4Ƶvlwp66 D0#;;K"KU'_nM\ziݭ<~߅JXeN0d]n.U]gIÖ{s5\M)aO/ "5iMf_L|||t&hKMO}jL`8F&cLDSjf-BxG 5` yv,3v{LlBchy1L?WC6h +Jy}BLQeqbbbw`ig}PuQ%ũamD;~GuWYttr>MGLyy&-xľh?_x1)*y5 .`xʫ<5-i% I +f(ڇ;\9,j=f阜-R}{V:4 D~V^ ~/맲7uqq)**bX677|P)J{{{AU(ˇ +`w5e2Y__JWWX,D566644԰l%U"Jmm-(xggvDqAxhwpTi(v0q?_gj&;+`m;OU_>j]/M91 Ha*vv1lu*H/ĭB-W߼OǂHk5eɺۥ^6o2Olh@M(,m":Kss1}}R.k,=Ծ:ޗ,Y400prrrss[`E<<<<==}}}-[b +( + + + +^re*܇P(l NEDBk(hhz(`GڂJl;O1`l An/HOvJ$8;L BdiЧP1(:N_=Py(j٘.tadYET;U[ER-NftvJFC@vf|bŠ@( LH&Ȳ$@^=Ȅ1dp=瞛 X P +?2"piѣ, Zېd+yss5j5 ։)| vuWShNXMbF}zӲx>aT8RYf$tI4f/# 1yS8̀*'<\/h7.`s&H0=xۄTBe|֣PE;,ͻvE%ڂIQxgb텺lv3Rr\V醆FFFL&bl!Z0r.app_V+T\__ׯbaaaLLPzH$a=LK~C 币Qz75>Q tz1d,cNL?!#[^b+QӉ +njm܎iӟvcéG8Mw,ݎuVjS,Vħ_<:1p4=ؾ@piQ5rRVZMJ~9e[;].8%I(t,ٓSI7Pp+y&ix͛Tx%%%O)޵0ݻ.ݻw-8@%d:uIʜhGyW.Dhg|&6DP1vf WJN^g)dvˤajc.!s ++ ~%Kw-)BaXl6|H$% H螞>V醆FFF@iì=J@C6iZf3* +EGGT*mnn +5550; +C]` L&85û70JƇ: +$\IDtne8V\%VrjpM9O +njmٴ]o%N1Qx8L>6߱&O|Rjzrs͓RD*vEnoz]hpHhPx|o>&a4û2gL];&9qюK.Dhg|&$f;3+%}JIN$v]x,]՟.ATpLwC9bAFW]lk M) +ł>p|H$D.Eju:hlPڠ];TC"Vl6.app_V+T\__/ +kkkA;}5'0,rN .r. һ'OW|Otϫ1m{۴)ϱ7>ySϯ<-TpK1qDd)S= +/@uMw,ݎWdEuLՐHdܒ[T@p-oc,I~Mb";*ٓ2 Zv8 Glehs x/_`pkhhhmmmooR*,aڂ{}l Jwn C DELǫq 77=X:!i*++ş<21UTzw-_Eϰ9}6#Kh{=+IPpn4Ϙd0 :iQOTHf9_MUEH|LBje{ZTsǬ6h7i.@ Gk ٯ7@u޵RA'wL(s (|tLCA6 J)rut߿93UXgV#=um߈m>\$nqqq.'?@ DDD7P(,fs8>/bD"堥AQkZN6m/Bzjf`0 ~5yeq#b +c-(kw]t;l82eZPvh2eE0cFQ u)F`HMuӷwUUkhYX'}j*/ FրYh0ޝQhTXHX""H)(?Em(nk:'8È!~s^M+^O]`*NV֬tן1;Ӯ](7|C*QQC +8<;wr8.@ e2B0mA=]@7 z2\Tpy<fqS +^ZZp GEMEEs%މ"C[[9Cyjd56ߩ b|q.fCQ!(VDow4}WrnZa ^`L + 2?S_xQ R`O|ub۶mPf{BpAt?흋 ƨ }uAF\Em-x =Kx&6!yeT`QqMB 䔟xmKIH|:|q1{3߼y\,z466DOh4Nohh`2l64(ꁁ!ؠAow6njZT.###RT"B>baV[[ z>//D҉+2,ܥ֯[V exm zO^|F 7ɨ<}nX.H /ۨ>^ +]~فM%_9iwFQ=bGHiO[NOiiZq -dt%z4a1hlɮyqk`~# ]5et89|^xǫV#N(fµL՘tAqr<50 W~Б;k4hQd0v%hAuuuMMM---^@ DlppP&AgP(j{ػ^)L( n44$?@@<ffqS +^aZZp ɱw.34_fp}zsq+&~m $7v>?=gy5&dߑie_^5yiI|ATbEktw{=.)tS_yRDhhP:흋 AVVΝw.v6/ # + (w>,3!,]d8 y6$ME$3F)ޱ|c0ф4O߰/ qW/^ +ުU읎6@cc#H4::F|d2lvgggww7hiP z8߁I&0$"=VJ%$ T*HB!χabaV[[ z>77D"Ad2Y.Ϲ nnnNK69^B:#WS2q8qOJtmdsº'M>3ɛFov}HiebAя\9{}'C$MI* +AA\.Ma0T*HD?ظ8S =Onj.G8ωK*W5Ål qҮ \^Њ7JzhJ++^3=sq]:}>؄eؑۆ)>ZckmoǣO_j֥*z?!q7vo䒙_TLºuvaFgPfo󜢼vMtuu͝;w*،W~fdd Ou^@d䧑S-8OդP 6;!kSmpG?h@ЌE?poFmЩMhjll[g4{T֟TCc|vXI6 90K{}T*e…LM #Fpo~~>L.)))//g2 QDnk;FaB]H$Tvtth6*+++**( +,<~؞MEFQ.Zf2 dO{xh|UffQ^qX0cav([5>2V݅\*5z̰}~kѢ-޳ŞNiˏA}G԰ojD-ȠθZ8f{ޱ ۑmc3+/o6_?@' +dg32`'}:-=]DhB?d}>=|$c9ܸqNX{q8NR*\.Rj5TSŒ7 +C$MIBd욚AR1DtL}3PTT>Mtt=[Ȣqk8"99N:j5u蘃H?NKmz[xqv18 O)5hDo]t1$31.81-]cO{NY^_3]wppkboĵk|'uu'"/wkm(enܔOп2Ż^"톲N%VLVOfbD\W\*圌~Q8|m4L!=bca(lƨ&YQf0)BmrB#B3'1.ُbϓEBnݺUXXXVVFY,V}}=x흝P R)T\%HTT*Z ԇ0$Ip@@@bP(Yrl6`Pb D"]f(>zc>ͮ]Leϊ y{5sz"s[uFì8ۻaGb7uy}dSs17Ϩ(Ss1ؽMhR(5dW剀>G uzJ8ͼ."^Fg{&O m.+hzz[rah4n䒒pbL&>:xip"<68m{n&$"??00P(`h$% 4 ---MMMuuu +|VV~~~2l]7'{IHHF >>>))D"%''0xHȔ>PNmϡ޽(׸xR'Kܣ꡷J + Zv]/P<7{,*/*3%9r*6OM_ \~q + +5ت2:b9kooj J2r(AJRRj>o0 I'B!""e555 Jc 2f衺 +>ƍ˚KG-73- RvĦJ.kiRT+o25⃃?>wmpDU?AQɭ|B5fmlW7bG'β,F㌋~͢Kc2Ylcr9(zL>8iŝXZ^b60^(pRԳ>uZ+G{4sIM;|Eo0SO\i!#eqy!͏7wͿEw0d_^+nܸA5ZXRP]]qj#ʏg,f7$=u5SwgOkS)2y+WFowhzW:uo>FJ?&QaE/nFgy;ldžݻi-,gpp@hZNg2l6z`Y:JQԍ썜V&bX(0 L&2G"P(nnX,zy^Vs\ +\nYb<U"J2L.w( +hRZ4 +wP*@dtvv}X:y<^[[[gggGGD"J2KAMsFT_gѐɋA0#I=rq͛70rg}OHOߣKs "ѣ#4allpLLLp8F2dYT|>T*fggz0e $4X, N$ <ZFqF$,^K lڴ Gaʹș3gH!BdZ AòqFbss3i9,5#MYjg,r HdZ Km0g*4Vt&f\. (BFFFFFG4$BYHf24x<B!vvbjBP(r ΂ET*U*FUwTPTn9رc+Wu֕J0f&r6-Ly > uuu/_1 ccccrrh4H$P ,*C>G §Q.Q=^˲bXn,CO&0Db xdY#IsO|i;v솆|(A###a||pLNNp8FA6QJF\F`z,ˊ9bIi\X@?"mm@餴i;%- bPHs3x!gllv(hb}IIɭ[?~#hllMMMO)$I32UoAl"h Dh%>}a|W%/__fZ՟ɓ=BqqVEOLL~zzÇ@`nn_B*Z\\#%ׯLX[2 -- u:6d2SK +L=vj5Zy~N~7o%kxxi-ma/Ñ)E`+**R>L&C( bZy{ϴBaX,|0t:`6v|P^:Hit+8m]A`HJ>G\.dd,D"pnaZF#\.gtZf-`PrXpܹ@(R ;+ +RNRQtttt0ϾA捻@6 +DliiH$MMM",7n(&M~//_ʴbttt .hZ^?99955533x_(N$tN~{|W%i?%e2d2"H8np r9͆~>fAb}iiiMMMEssT*mmmnJRRuPtuuuSF___V?ؼQ]Pd2D"E"Quu5=? /@mܻwW~zllLONNNMMz<@ 0??SJ9{5 +%!В{@!m1 z^iL&8@ Y(2}Tp8?&>7礫+Zcב#Gp嫫L!vϟ%i-aXX,i4Ng0fnw\>/ +KQ' :xl8m]A`HJ>GL&L&cX$ ~v;j4r9͆~>fF\.֗bP`RR:::{(ЩjK_! +@myoo/ \ggg]Pd2HziMMMQQ={sMA^2۸~:Y޽͛1^o2l6 (AxF B(l "6X[ YC"h`:N*2vB !Sp;G%2@0Ui-m6t \eIIr.YLk! bp<Ot:`6v|P^f,H:19yDrL&LbH$~v8Vh4r6 |>?n%r\/--L&kii&*ŋjzppphhWW^F1:: +ݰ˗/AbJ*>x@cpdaWZUU$߷o_]]V}-k t:^o0KP<OR%%@`nIhv7dro0ᄏtҝ;w޽[__Ǐl6p\.x|>_OOO "л +{~ Y N[ZZ֭['OEx׮]dC|*Ҡv \H?B(s!A$l Z͎|#hbP(L&CRh4*lmX>dh~wcHԇy޽dxuu5Sp$?CX$Y^^td#GGXLhP(K&eYfi&jx}wJE8O> [\\r8鱱1g<ÄZ[[d2=K>7 |o߾WWxakkft\n`0eH$fzp$ 'sTX=yMj677766S8w܎;_~)˪ܳD}өS +TAP# ߿$(JԅZ$l Z͎GbP!3D*F۟*fECH6=ٽ{7t1Tp$aticΝ;yǏӉG"Q&!YgΜ:`t:/k4v Bd2NONNfYfi&%fl2Tٛ \-WT55ES@r@(JR\VK$ DKhIbX(hL&311JwS,Rbh}&0Q<ЁfffG"QׯK /AxPAHp$z+WhDMbNeFnzPh`` Ll6,/--1c3i3o3u3{3*qGvY]]Q2"xL4sdd%Z^O& ]`*qB[[[gggww7XvI$\;b%xy9<$\~$ `y<aZ>|XWWWSSS]]-JETgd@U0B-ևlΕ+W1?hD&?3sN:H?/:DMVVV:Dnt:F,ÑI,Yy\h۽^o(H&tzrr22K3Q/--LLLjJ"ϟ?م^Wr7o7FFFx8&TFD^O&D.|`0}UU͛7VǏ9|`={ vb% x5"e+ w;::A8K$Oʘa<'ur}"]{~/D$L̢"riÑ(˗/E˺|ڱH$JvEn>|Iv8%q:jl6x|>O(D"J(mx(pt"rLFvd28d2#h0^rvB5Z owb:÷o߾{ׯJv''' &1?-Sppoo/WݍCioo OÇʊ7nR%^*TٳgĦ6j(=j,,,,--VWWEu}fc#I$##%In-hYm2>䟡Fw蓮D\|YX$عsp.$ÑHl6uMc(h4<^X,Vf9@8FKFoit) >Q\.f%ɤd2#h0^rvB%9Z- tQ?zW[WWj؄.r|p(b뉉 0XۘcDQfsʃؓ>nuvvPxuEEnJ,UK$C>}ZLrI4(%VWWEa)O#ll#d#I IZ$*JҶ1"M&ڇ3G/H$0ŋj"Q &ÇyBH$q%ѲՎE0NSzgZx|@ w-,"rl]2L:N&x<Wz.nljo0K,t|_RRsjAGG˲8a`` 8~4s1;;KHsWSSS099911qBϟ?طH?UK$Cm߾޳gϣG.uuuTb{{(C(j¡q +"֡i$p\uOO߹yE<^<,eee\D:$j*b]]]Ը??555;;KQb}}CP4F1v#G'i###L~hc4EbL&!%Npl7=ⷬ:$'be.]B>}{{{*{MUU۷mFgEn["Q .r_ QԉD"JfmT7W$|\ .L&N'I f$r~rv;fVK]bNgϞ}9vjj +CA ۅ 1O-+&den9; sɲe"-~RڵkյTbGGGEBqjvzz|:}CH6!yH"yqyD` ҺGFFho߾1B2L&!%3gLMMMj#('DJYX$ +9u0j#(@iiHiͦv,q:'j|@ (D"J(m6G+ VQ\.f;Nd<D"`{^e/eqf5IQtcQAII AYP;QN-9u/趚ۜνpM|O>9}_}^_bA:U744@[`\#e؄[sIxy6r|>O7;W$A<~---92;;KPoo\.z*-/ +H=>}Z"d2:['FA0"O`:>dYIިD"jDM2QVK6&-N+ xX,nڵk1 +S@֒Jy_E͛7BS>znllJ~_l6Cq)JZ{7L6tz^bqyPPUj, +8%ɤRx<s\v`0h4*9tzSB\nkk(^H #z2$6!qĆܿl#x0=$/|L|mm -//n177/?11d>!D;Oɓ'D)577ry__ZNyJÇ!+ UC&h4Dez<T)jh4j"BԶH$b: ʯ­M?~Kp(?L۷o3 *O8t8k2޽t,Cfq|>_P(JOJ2$A_r+FFF>|KrMHUS(L6%Iggg?e@N\]]yJs("d%anFFI6ZvP($-N+ӛe9áPbe:JUfbut8J@߹s,Lt8Cfq|>_PjNg2l6\녖Au\^E"A=X(pJ&IRx<LT j0FX,p8_ =O B<rX###cccSSS333߾}t~? F" זRF?~"x[d +^XXX,fzz JK.f|YE>8C޽{'H?}R&''I'ϣ&8 +5|(S$2("֢Y\\ZFQՎ +dPD"7oeݺuX(8C%Cb@1Zx,,cPgiiȑ#'OB3*z6[ +BTjNg2l6zX^PԱXlccJzڻ.owwyGHd+Q{p8|>Nn6 *B 8=O BX=}/_ggg-p~[ 0JƖǏ_E[v%IGGG?<GnLUt:u\65EaaZ&~NǗbh4>77i)_algffȗHe'< U܈6k B<wVTTY~׮]|HԩSBӀTuuuu}}}ccc[[[WWW__N't"ӀNL&M$&O(1)3c\B 822"ƵnB׋ +g\+dyPBdffG"Y5ׯ_3֭[J"YwE&R:d\zU۷o+dZ)ZFd6-p:gtt- hFoU0~@,$c'1X I XNrm6[kBZM:./{ГhnSSR8Ed2"Ɩ||1D³ qf" f*ߖ'&&³4Ƌ.UUU%%%$C!( ~ +xӦM7o,***//y-qg|i@'&IGt"ݔv3J$f15>b\XTc(b!GFFĸ흝Rz IHWOV]]t8`:;vLpKKHω'ċ+D:PGpR::bZU*jFd2p8N3::FQh4Fikho8 +marr )BLe,Cc31>\~֚PVN^199h}nnnii)v)_H$233CDBئj#ߊnL&-ō+r9"uuu^zEIIѣGEc޸q#0$@o޼ݵkWAAAQQQEEEmmmCCCsssGGntk(b0d`>NnF,`1:Vu@5R,D"UJ8[҇z^htCd.\P:du ѳݻw3GܹsG+W(D:\.׎;}!GXVJ[kZh2fbq8N(p8F(m6GU0FBr8vrvvkINOOA7<755Ԕܽ{733I/d}N<)tѹs犋窪:NKK m+m6co:Q"YTƬX|ԡ,Dsddv8v{ggz^`P: Ɋ}sssy-[yG"Y׮]J" XFwѷo>00t8*tY?V:STV5x=lXzhiu8FhlzU&:|6r(gggc~zz: |aՖٳgju:]<_IFʚɗ/6)8sDsssDbɶǶ "tm!†₂FFFMMMzH$-Mnݺ͛siiiuu7o[[[m6^z4;mo߾6cG;iwD,)4ڣf5 Ȭvݟ?C +^/`P: J9{xG)DRNn7oҢt8bd=yDX$:p0]]]J#Y_VJ⹵Zh4Lfb8xFGG(p8F&Z/\XX?~b1$G~ٳgju:]<_ +h4>//G m__ r&,y["cl rl" +.D"\ccc100 ޿_WWWUU"˗7mD +EH$":~xQچNNk\qZƧ0L2DGӉɟYL!f5YͰeQPZdϟ?Sz^Թ`P: JAl۶W۳gĄH$+޽{bڜ9sFX$ +!++a)D"Ebd]xQX$jUTBH$uo>*z*e\RR˺wqbPH$sssCGӉɟYL?,m Q +ȃ>1h$&"14WM0Q1HeiTrL-CЖ-Rh,e.e/\\Ӗg)eo#'9/"RU.K$ʒ%Is(t\qpp0P(?)(($-cZeU1ٷo|P(?f~~>00$mnn.r(NG,X,\7`S*a6L{1icHopGsĂpXryt^&$$$B_ddݻw|{]|rMMMjSc_<66NnZm6 +48.,Vs!a¹RPPہत$|)R5PDDDؽ{s8̼wޡ I 666T*V700E!51Q~eH=BʡQC~ӨI&Q$o޼tf8GRXNb XKL<00`4~rD>|fxUOOOr)))IIIK|x<^vvׯ KJJ***jjj뛚T*VŎ$ة);;; mvzۯKjb`?TVCa(//=D ϟ?ǃ憻u @ ޽?'NG1TI ~WvTN[6###ccc(@ +p~~4;kyw܉`0]p +n.^xaIPV+a<[n%;o# +寁0,,[CaXp4LˡPeqqѣ$EFյl,q| lmpph4z(V\UbZbhD ā'Ƙ|Ĥ6ԑ1pFh41q&& ŊUJiB)WiyP +rr'O^c~ս׷TWW'D"+Gt-...,,,((@|2BT*%񶥥opppttn; >D,~EJQ0??0666<d y611366h42M|p8_~H$jZӵ OMM!nзЇ)2(@`eeeyyyaa}ojEE liiihhPT]SSSUUUQQZZZZϻ_𥬬WVVVWW*JVFfFNr!-b%bE ?ޢAG (E;(#JCioo/655i4T* {ɓ'ǎ"r +{E^^Q#A`0LafÀ0` ]0g6 , i:040r3')) k/ + o޼I4Cd3gJDGGd2PPׯkP(q+D"Q:g```ddd|||jjjvvv{^B/RdP +777(Quu=OOOONN"Ʈ.SPh4r\, /__1"JRJxPt:p~LKDP Q'ᙀRp8l6j%JPkZ󋊊>~ ^x +O>uχȨq50 !Q,8L+)f!bvPP>M ^="RRR?d:~8n&v,Lӡ8,xYLs ]]]qqq\Lӡ8P s8p$ts,r|~occckk+PY2 >%z-.."̀ȀRooogggsss}}=8ښjXh|BP,d2Rjz}{{{ww7^mlZ'''GH)I@$\"vgg'|(R{Ţ$J +JǁCQT-eee>|zyBBy\FA>pur-޽ӧ>U( f].WVV0j>xN_"8mTl6Y,ngdpˤݫW?¥Kȵe!aeZ2Mp8X$Ztmmm===###SSSn|>侵>BDDeGdLLNy epp`0'$թT*\"ZBbT*U*񶷷C*# {*K섯EBbQ|}}bŏ PjZ2 |~QQȸz*prrr◁\Fɓ'_|[R̙Zbd6ɜavKKK ;B_oL*6 , Äi:07Hr.==j7:RP=EGGN:u ++"t(hu5KLӡ*** +w홦Cqhll'{V8DVu:_OO~n|>߿}"Rۛ\.ȘHh fYaR0ȪO0$⚚H_P(?Z-wwwơ!Ų7"*...섯EX E;Ek533P7\9Źٙ'GBBO"W\!΍7޼y[WXXXVV&`Fؐxgs^X]]ŜAL0/͆jeۙCA )\.a{v111uuuБqmb4P:fbccCA[BJe @#C`CS:g~D "Eq{{5Qy}}-1\.744d2RY"T*RP(d\.|ǿbWojjjmm5 Fqppl6@P +&DiŢjnnnX<77 A* +Bdbs"Ep޽mL7elcVe+jkhՑάUg:I\nW|IMM%3_W@y A@Pޟ7)?G{=u]}իWo޼A? GGGуjgffPP(9>L ~Al6t2-B8`?!Se'"Dܿ?P'FI?~"r(#د:t r(uILˡ0\.gX.N,K$LT*U*N3L6 pXxp8/Sbqj"݊o~2aj6^hGFFXd)zSHQZFb333`%#4z)e0Y-NH^/^;^>DjZ䈏\D"QKKP(W^%_! P%'N:,(((--ƒ ӃVENNN 4pnnmf_?d0'@>h57-//C1$̚o)/O$xznH^'Jvttx񢩩ӧ(//472BmvM%ϯ +---+& 2aЉZ-t:^F=@EnfZҹsȺtY344 +ܺukoo/r(!Y,*bH$T*Ng2`]. pxqqqii)%I LXJ@X A#H( +ssspn{zzf`I^ց'joK^>p8㙝Ev.,, "qDJW\,ɗ$hd&*tB-d# |4,H$jmm +555|>޽{v"KqqqR(?EPBAmٲʕ+eeeOZ(DoߒP(ЏF+4 Bq2aD݇x"08FRLˡP6OxxY@Bcsƶ QR{´ʟ)}abZeQ\\6X晖Ca\bP \.+X,&PTT*Ng2l6|@ WVV$_H@p˱X q#h0̄av.l6î ^9IMOOnl8 &6)ͬ%|"(BC@,rt8Vujjjbbbddd``UUUeeenھ};i𦦦 P~k޽ + KKKQ?mlllkkJ9CCCj]fDK(BCwc:şp8xl6t2-B8#e94.ÇYNٴB'w}P`mHP6 X;F +ÇLˡ0 B1p\pbX"d2RRM&fK{p8WVV`2F[ +k +Xο/.Kpeqe6?,ua bbF&4L2Jd2P(e)cZ*-jSw,{9<  + rVl,QΙ~⚹9^p/N9^oCP$H|grqP &C*4#ZTSSSQQQ\\͛/_p +}`(PDEE%&&&%%x";;;[z{{}jђhޅłv84^HA,!D"ŷ~BF*?N ,aaaTr;(A_BHH00XWDB%0GPB ++*JJ511Fn'vaQ>?9`-q8yɓ/_ƱP`Uڱc>|SPPPVVV]]V ޯ_̠я6D Pz_0b1H$[?3GsF*"_;wKF"q lz|aH;ݺuFVDD6+1|PiGϷ_B +2Bd2\.T**jlllbbB ....//v v777_8vgggkXNGEhvCp8L9Rvռ?⯸[Y[[ű?~@dr!i |)S(Af٠iV;22288сWVYYYZZqm߉gfPN&<<ٳg񩩩YYYEEEؓ5dFFGS׭`b< +Hd0`OhHR4`s&|`7EEEQ]v ?qPDTUUŷv/^Hev3|B + +DN&NRR&&&t:h$'h۝NBEymJArgg!8<'":l?[jZ~;84IQEDtiP,SPy KKK&innnrrR 򥽽ﮤ$//իWiii7nܠ k~3̙3TcϟOII|uaaayyyMMMCCCkk+FM__ީb0ЛG4#_X,DȎo9 oTʣleee<*a%]tJNȷ" $jkk7\.Wdd$h|+b- BD" +'ryggRkF#nDEM|`Wʟlsr">p?8a}}}mmmuuαgٖƁ?w^ۂ]tMiB5Rlb6žVźVUUu0'''## ?>qwWKq +~||<.===+++//#ӧOjZLMM͙L&TA3 ix,hUX" r ÄT*QիWIɅ H(^ occ#rlS4"""eWȂ![/BPBԆD" +'P!JRRMLLt:5Nrnrظ]/pŁ&<:r8.+=aiq/N@.dlR %|.勠 +!V‚d»h4j {HmmmEE:=777+++555e΂qx :{lllӧO322rrr + KKK?|҂;444::jzlX,6 ]~ʧv߉ .@D"`[?`?i#JUѣ$_[~0 lTZ|+bTW|aΝҺr&ߊ +B(6$ V8L ~PTT_f1Mnk>`4X-j4DkMzebbF 1^9\i/41`C), @A P& l!ZJRZ +9sӵpowٰhznow}{rBPTZV Q/$=r[nn VĘ9 'كՍݍ z?|>G%U 苨L +J333]'&&4 ^T +;XYYYRRRPPݻ8O7AAA~~~d&tvvn۶ +Fb6p^|3Lvvv~~~qqqyyyMMMSSS[[[WWWOORTSSSR< +w?SkBC 0bpkwKK PrxǏG|2܃|u6l@zn9_`ttСCT4].nEE]]L&p@(B/D&rBRZN<8;;kXl6WBآ4]n=ݍ H2/aP?Y#P?===''IEEEmm-L_~[oo6SSSFd2ft0QKAp5߅^g02t:}ddw [#I02Cb~XRRRUU˗/Rw```xxXьOMMn2V u0qd0Dt:.brX,n-ˀu5-00"C[W^E۹sgWWnE97n,//-H-L&F8@  +E"X,H$2L.+ +Jju:`X,6?]H}3IpuMP*( +<N"2:3%MSj1mf6Q1{Qܜkߓ@w iQP}/rҺ#TDҷMP(| +ř 0.JYE*ʒ쬬,̚ׯ_Ӯ팏?~xf999"H"d֏?bh^yÁ5v^$9.5bh$mxIHHHKKyrrrհ7Y#8vTGrQ2m9 ,"@@[ˏv+i+bD#r.\J_Hk1~SRSSZZZh+bD#)))'{Eȧ=h4p +ZtɅhvCrTT[[{]z$''OMMѮ]~!111gΜ̄srss˫D"ы/d2soo`0Lebb" rz~PDhK8Nvq\|0;m- ұcLjǏVĈ:ܾ}o BÇOB&h>Fr1400ӣj;::0VL&HD"QCCCMMMyyyqqqnnnVVVff+WCh͠vu⊘ӧO߹sn +UUUuuuMMMbY.+JJ٩0ͣv|>'#6i8Nq\J[s@>!I 7 =z=v!mEO'Sb7oҖ`p!'N`VĈ +v}'m9mFp80GS(jZӑ;qxxxllfvguuummm}}}cc!"v26 h5ySX^^v\Ȉdj#;L&H>}PSSSQQQ\\ՑIFF%;d[E3h?۷/55&" + + +ʪ?~f\T*U*^0f{crrrfffaap`una`0 +HvNoV+m9 ,%@@[߃͹α9i+barr21"7MڊҥKĢ111%%%1hbXN:u"Cགྷ|>"Beڅ b\p.HƅMFM.4IDcF`qDjkAD&' P(c H@RmB[HPZ{nW_r_7 =r|>bX"rT(jZN\~8X[[E`XfdvtyR 'T* VpwޕgffĄ1ܸq<0]v~7 ={wwst #)))---// L===ðr9Jh4aaai0Ä{l6baQ?} +JG&{D-q DPkW@vXaݻͳg\ca\ Ht!bJ}}}v@4o޼鴬Ԋ0%<D"Af9\|>_(bI2 NE=Zhtމđ!G2vP櫫P%hd2 =Ã===ʦ&EEEIII/_ + a0t:8q cv}ZP(=<𘘘Z!mmmhhLC*NOO+yNwZ clZ !G @CѠtd2Z:@>!|Fo!d9rdll " RSS=<<1x" Ԋ0MEE71ǎDd="o #H0ET*"p8\. BX עL&S(jZ©w"q$~c:lVʾ +.@/ h4JmcGFFD"Qoooww7tZ\RR͛ 𐸸谰0&`0KʶmP?utuu݇q`:b"##ccc!*ggg}S c cLOOt:QPfb训~_"Bdj9ˋp'Z/weB)jEɓ'o߾" 0 .]"#)) "111qqeeea~cx<DYRl6r|>FX,H`T(jZ啕uNDZ fd2ASt:RH#JkCCC[YY QXX7""b=sp5b?1[\.?u:}tPPPpp0 ufff~~~IIIEEŇ>} ;888222>>>99 R4 8sKanG CS(!L/ u|BFC8x !~Νar֭?ÇP`s a"VAn@e=y":jQ8I$Jf9BP,K$LZjFy-"-j][[[]] c6M&Em+Jqо_vuuCg?~{EEEqqqQQQ N?xNW* , 2Lgw}Ν`ŋʚ֎+D" F1 0NǀӀJ 3L5l$zB@d2|`0£h4j- xfϜ9>ZfM{%Q+`~i?vZօ T*jQM$;;ӓh\a~{x<DRl6r(%L&S(jZF? ;~6jBW@/#&`0h4hطoD"Q__ߗ/_:::ZZZjjj*++KKK + +RRSSbcc#""X,N$ȹ\GG 򼼼F\r%((ӧL&3,,,::իWuuuMMM`]]]===WiR9??`2fbZ[[%L Fu6^OPd2Z:@>!lFfxuV}jQM}߾}D!`DepZֽ{ ȡ8Ξ={Fر "+`PQTpl6& .G>/ +Q&) +ZjF:q-~ӁfCW@;fdh4QHmmm 媪*𐢢PԁsQR(nnnG}APPNgX_!MocA:IBQB7k<QD ;`"e#Dq̆*χK҆iCL7y9Os-u.b?O/Uuﺯ;&11Q,?}4##WWW:𑞞N4 & 'fX)lvseLNfZr +P( cVt-NSSÇxxxL]G( +ϩݿ?3ϸq2Lp-^x;w ."Ni`|>"\eee]]BhooW*jZrFq~~~qqǏ˫8q*~bcc _[[Cvf Xօ<;;k0s /_zzz wCCCMM͛7oJKK322$X,~a\\H$ +  +Ovssc˫t(q)v=z[HHtOIIyɋ/rrrRiII\.g,[R}uhhhttjzz1 +z L28O.HC'YHײ)<==.Q?UϞ=F( +e 3Swׯ_p0޺uK.!.:4773i#0BhooW*jZhZ,J^\܌I?b `eeZ@bX Ě*ӧOWUU򒒒BPPp1IYǯ]zcTD/***޽{333&l6cVFfaz7ny<Zru:r(+@@Musscs!ldEQ6 6]`` U}||HE8ĶHvoIE,8޽ʊgEQ\ +*++v +E{{RTF2ǣh_\\d.//y#`?TXqQnX`ĝ;<< !% WWWeffJ$Xwo>x kDgΜ ʟ! + +bܵkիWFEEEGG'$$=<''G*|R.jkk?|?444:: +3 [HݘLf` _d2aM3 ?=P( Zt-NVy ֊JE(ʟuH{lEQ(NϏ'O ]OcwwwF={ .477s8GYWWP(ەJZhZ܏zh4/..x\^^^]]eFҏr;Kvf,--YVcX`GGG`iGGGkkkcccmmmUU\.iiipXH͛c˕+WYmB۷3""_p!؁P(gϲ + + +d2YYYYEEEMMMCCCKK ̡o``&&& ,,Ⱥ&1 ++3;0L<r r({1.@@022r9v߰SEQ~ݻw3"jC²#]|Ξ=Z˗HE=qܹ=$ r +A9ƌ#UVV) +\JRVk4xؘ^7㑹1pvhQ 2ssskzzzbb0O>~߿_]]]^^^ZZ*333={HPʕ+lׯ_gI7k0"n۶m'N`d &&&ⴴ4,\TZRR"a MMM---3~eppWkjjjffd2aVf r3ʌ.~-s\t9|ؗ@ ]3.a/8EQ~ YAA]`` ( FooovIE5H8<==Yq6+8&#ᖬS(!V5VFq~~~qq+ruuϟZҏ؊ ެ;X[[ +v}j]XX08xgff ߷o\U*lmmmjjo߾^***ȐH$bÇߏ ?WˤA/kD;v`$sss;~84z޽Ш'O<<;;Y&UTT444+ںzzzgt1d\sKx<rP( `.ҵ8#G[˚tQL*~4Q"9ZV) +U +$( Uъ` +<ʣhˣQ({ݹ83#_k[j8H0{xx?tPkk+8hՎ?Hz. j#łٸ\.NBL& +RdKKKGGGOO" +HG?A3mgʎjX,ccc###!t޾>hO +Y~ZUUU^^߼y˂쌌[nEGG_~], ]vQ8x?H"hɒ%LNNN7ot<|PPPHHȵkעbbbRibbbzzzff&ӧ>^zǏ+**kkk!w[[bAt:^df3pf\ +~YSlFCz1GzY!//oV=pI;kiiiR>>>]]]b`k>|f͚&C1aRRѣG +I0ł\.NBL& +RTT---0d?dEĪBy$#;v j";l6^V ښqBϟ?={ѣGYYYC"ݹs'...:::<<\,D .|ݻw/]={?$$ Ϟ=L oϏRAAAW\zjdd͛7%IBBBjjq9a`?>㑞e +]bl+Vy{{www +WҟS(p߸q͍\ #łP?(2L.+ +JdGGGOOU$'''Q!IefffڎfVX,322b6F^t]]]PIV|(---))y`%&&JҘH$ +C ~_@#G899Q7o>y$ҥK/_ׯ_H$)))ُ?.((xś7oeee_~khhhnnnoo2`0 i.p*ү2)8fC004xgE׭[Gom۶!I 8\A...:>>>8H@իWq4q/_VرcI( +X,rqd2\P(JJjllliidd*$ؙ9V+t؁LfwrFjZHPWW+++!ׯ_x쌌䄄Dr͈Xt@ Ν;s挗+`81qP Ν;i9-ZuV???J@Pw|b@.rRTTFʎQ Lq*$ؙc٠j9 +FFFАh|:[@?~VWWWTTfeeݻw/999>>^"DGG˗/_xQ s߿Ŋrcbb`oX{D1ٴi-;N:E)D"QhhhXXXTTTllT*{nZZ<'%%%򪪪o߾QQcij  e6Lv`Eʓ?Ip8xy68 'Tx<ҳXǞtEDD0[u%|Zؤ8Hgq˖-"\ϟK l2P[\ Z$6&Lrqd2\P(X^҂Rߏ d2Quvjj +-`̴6egbbb@&e6NjZPWW۷ҷo yyy999IIIR"***<<\,_xQ >|xڵt-X`߾}f5Ϟ=B?+V_uW8bD"QHHȵk"##!D"IHHHII~VVVnnn~~~QQׯn>~=UMMMK! +pcT0YVx&p&; ebܷ(~hėhJ AMĨQ+3 +j0 "eD +R2(CK2Wh]9=ɇs ~ހ{ղX,dWˡY=Pˍᐮv9S`pyviTKyioo?sXYY8qt](GGGsq\oooOnnnvM1<`0nϪE&>}ڲp§N4 FDDD'O@|PWW禦^ܯᑑj `u:ܜ #[L#&h G1ЬEpHB={>Ĺs/wo>˫ +'L4B"5mڴͭtiq4y޽&"|ti44 Q2 %͆C,))RCP j*]`u,,, T"KX6dwF`0zՠDFRAپnl$ȍ___߾}[XXŋO%'''$$ĈDȰ0@y<yɓ'~b=~xzztV6)...W\A) !͝;wBaxxxTTTttt\\\RRtFFFVVVvvv^^^QQQii)D"ۗmmm]]]xJrhhhdddtt >S& +0i(lqq?!>@b!DHCCz?v!] 1`؎=jyUߟLOgg'Fk֭nٲ% Wti44+2WWW˕3խxۯ^5emۂHFC'p, faKJJ4R)bfKKKGG2Z6÷o+*'IY6dbqqF(!tӓZB֡!R ar9{=+LHffG㣣E"Qdddhh@  + +x\.ŋ>>\.7 6 ˆccc>|ٳ/_WTTTWWWS1<<<22?>>tssszX."5r="VeXduˡY=P{ᐮ<ؽo޼9r" bW{Dmmm= %] ͪeڵ׊+&w=\Y_ fct9b1fCC~GGBPՈ8333߾}ú@DO@#& NSSSPsllLѨT*H [[[rL&H$aC޻0br 1+,k*HA% +((Z0BBe54Q4\J'GTHKsԜ\L}Q=qO>̐q/n|c8=9s>fff&&&옘Ȱ0&`0=<<ܜt:B/ׯkiiI/FdttۺS޽322RTT|:999 keeO851-  xy\\\BBBrr2ruFFFvv6^YYY[[ى- >M(B3VVV -lmmM"<'LNNBhJ] D&DײUWSS]]][' fw=uuH%@IGG򪪪# bvMM={W>IH~Ǐ)[!Ԭ,\<''GFFpiNOO%7*d/A666ֿ@NDe\XX +H ݯ>}h#'''333==I,11d2 5lN#]|رc;wޓFaDe===8xϟ{:888;;zxxxyyaaah ŋ䴴 WXX/))744477#lCzjfH@]ArD`h4:ER1JDCB}@>AKKKkr֚p}hjj:99Wp|  ~HEEEN8 #@d۷oIO#GcEq] w%##b8.IP Z(9++x2\MMM|>8͹EɍӒ/As׿N,APM掎 ƺ:xP\\\XX쌌Ԥ$6#wwwGGG{{{+++:;w={yXVVvsm?~ӳ"-w(**J͛7%hmmmgg}7 d2111qqq ɯ^B8N^^^AAf^__܌aüݐ LҒD?hQI!#͢R#!!> H6%ѵlE|ȧOޱcǦk(((hii۱0\]nܸw^iWUWW733]# ˗/O:l$;7<޹W^š$ HDHB7̤P(Э"\VVxeee8NΑq85ů_Dh!u.DhܲqaaavvV(Ȩccch@__%ڊmVWWWYYYZZZ\\\XXdgggff#&%%dzXOy{{{zz9;;;::X}ŋҩ())e@TH+ZҥKH //f```ll [N:88899>|/fSRR2228N^^ڇG+˫%c+GGG18cfff~~^2  AH({;ă hhJK] DeKϿr +CMTTT aKKKDˁ,,,>,222GA!F?0MUUUGugΜD$_VVAAqIѣG FOO5plR(hXGG.++x #$&M\80$ņu1ĈD"nY ZD:;;+ +܉/_ hiiihhsqqqQQtԤxٳP&,hoookkKq)XYYGۧ Wwڥ?ByD?}ܹYYYثkLMM7'OB#ЎĔ4(331%%%FxWWWoo/:>444::Iěl;Բ"&F"*~-F}T*It9$$n&$apigQVVDK@XEE8pа@]ZZ"LeنJJJ3 vID\yA~͛[naA>>h{\\\bb"nECp镕555uuu 8mt{{{www__ÁÁCѰXh7&.c'O`n*++] +i[ɮhݻw'Nn 11Ǐ烸Ȯ@Ǥ7KJJʕ+a@7qAYYx3ek" ]ׁ + eo,-- r@0[II .;;͛7֮.0 AON &ُg.`0U q 9pgff'&&@###CCC~oooGGf744`7^~Ң"XS,1%%%)))!!!66622/((nnnΎvvv, J`0 h4.S'$$e٣o&&&677QdoKԾ!1JEEkkkDt: B?~!U%%% jhhE e3>p +$G8@UUUfںu j=z!np||TFy :::***۷o\ ŋPC~ +@A}ٳgqTvapd +xrPիjjjPQQQM`ΝjNccc!l2^ch:Z<f̃j8>֛LY2B2M3fc ɤ鴉B(%JQ"TŖ"Ԕ)L7}7y\r=8;;|?Μ9SGGٳgӫW/1r3c fKKKbt29*;::?ٱcBlCCC>CH{rr2G!(GFF۷Y +e8cQ@XQQ˪zmcc#9iii!-h1͠T* +RDg> +GbhhHuuuiUG(NRDAgR@x(:`J҆!ssYnaL +*AAhUBPjL:tRtHg6lqM~A& ] /ђI ئ,55nݺ)x"e]v b`e4X~5|* 6 "2s"r;0aԷoR(T6xI&9;;b)XhP Yy]NaᒒRRRXNzvR!bDFc(X?yL?㣀:;;cR Q\J +ëȫsYYٓ'O|d;v"z@WW<8$tOD9U} H{Q\\>}QEUeC|544>---tȑ|OOOoѰ(|:dvCv1󋪊X󼾾 |||;%Ac$+{0w [=0Q޽" rxwÆN:?)NzNaᒒRYQ󋋋L+++YHU% SAH|A@gg'蠦JRejDjkkiW^ϟ?/+++--}aQQѽ{޽s֭ +W.]|SN]ǎ A@sN___ooo//۷{xx8;;;99m޼N&X[[[ 6lXf͊+-Z4{l82ߩ _#zvM6˗_Z'pZ|-9::#\.W(i]v۷t{ŋ8s3άԗBc߿.6.' A> i )RHu| ,:Cڍ ~C%UTU --q-YYx'Oʞ?ŋ/_2555 ۷o)hSS{jM)}qEMV:[H#ABD4ЩgbhEjΝ;eʔ';v̘1zzz:::ڰ"o``0i$x…'^5w.+pa,mL'ELQ8j``lmmmjjh4jZRTVVdeeeddKRD"E"P(LLL1Ȉ7o޼~:<<իW!/_|?- ˋ):@1( h,'55JKKdXlvv6P(Jeiiiyy96[T__Рj[ZZ۱>|F  əl;6mŨI21CS)Be#\o0_rqr8l;P(w'8cBPn^|>'ރ0K3]r<gXLBOl64x:::t:dBPAD=>> oK///~?B(Ӌ? ? >*_8twggg. Np8nl{{{Vblll>^ A_C؟x " ">(š$JE([" ,J.cJP[[R-Fb;;;{{{z}:==V]XXXZZ36l6ommA $s:.BY#\=@Gp\t9=akP(ljt9ʭ +óXAk8l64x:::t:+rOL&&1Rj "^^^~DQA~~|>zһ338nl=jX`u8gyyyqqq~~~vvvjjj||\rCCC]]]\kkVh4jZRVWWWTT{N.gff}6==]*J$TX,BaRRRBBB(z/..9??\.1NNNCͶkZ- c6奥833399i0~gv(^/%Tu<+ 8D@dP @9{Dq`ABf!JlbNN8ٿ[セoh٬V+g0@NR +ܜT*H$bxrrrllldddhhhppW§O>~O‡޿_+G{ϟ! "!!%P\.S*+++ZM&byt:n{ww񜞞>/B! G|XJ`G.bT±kUlhdYP(oܐ"i- +Z8LˡPZP(DY,P~l6>>:::222<<<88800AhkkLO/G|/ >o#xWWv^[C0 "bD"drU,..(JjQ^ذX,v q\{{{h1֝_^^4xb1d2gYH6,,q&JBhӃx<\\.gZvA$1BPZ d7ƴ +Bbmmm1f)slv8;;;ٙ￾ +FЊ*U̧LAi /4 8^'*R RX, +|>2L*J$x<Eћp8|uu|>=99A9t:?fZM&h\__tfeeER! +B.d2T*Hb0ahhhppp``M$tttI]"X }!2 fjj + ovvR!PRT( + kX677v;NCg"szzxqqAH$ݡhu2D۳,)\ͣ +pZTVk&W4f:n?=h>ura r(wHĴ +Bi-x xoBP(-G(",kkki-..6 O|>pvf`cOӘ^s+VU12]|'<oZVVD\.#B!rl6$I$ׯP4D"ruqqz<ýmt:vfD F^G8u:ZV*KKK +B.d2T:;;;M& 000G}k+-Vh.\[`#lMb14@ RPVE-d2Y,ܨ(r h :y^P(onnX,D*d2h; bT)JJSu/4e:bod:rH;r('"i- +Z08^LˡPZP(DY,"P~l6rlI&ׯ_h4Dp( +>x<ýmrRn٬V+򹱱a0UNjWWWjR\^^^\\\XXW(r\&IٙD2M"LNNNLLg1>i~+ű6/,--4AJZYYh4 +zh4ł+E4Ӊ2qPV_^^ AC4-Jbx-MRLMFp/ +S` W LMx<\\.61-By;F}GDLkP(ւ@ pPdZrB!b01f)nmml6; u0bO+V̪LAW4 ^#T J(IdL&JD<bHT4 HW0 >xVd2FjZFV~a&&߁K/Mz՛B/M%vwPc(g9QMa%':];k=>k޷o߾yׯ^ŋϟ?{ӧ Oez.˗/وؔggg{$! yHE%PG(r<'Q>&`E4aN*¨l6cB9yzh4jm̧Oz w'ցluj0hrklZBP\,fff񦦦x.j-GpnݺEu:SZ^&'bZ673|>TH{xxxtt ʸu+qp8>znxt:rn Ll4VrLvww B.d2;;;T*LX,DBP >ossAz +\G _|Ǐ?|`~ ? ޽ގy# cXmh#6eO>qe"^]]p\.j(NAEQN\" + RiJZb#fb)ƶZ-LU@#}Agu"hK +}1\i-G +>|  ~>Zm2[-,,/$B!vS|>4 +D"hH$(drBP"T*8uÈIge=<&f( +͛KobbIMP\^~ׯEϟ\\d2X,Vf9Nt>g=888<<<::beeeeպǘp8iznt:_vMfCZZ rT* +쎐JBLF[[[5 +@ }IZ;/hwd & +yx;88`=::bee ̳Zp"8p8}znK~:A:>>&QVl62VժPJRX \.T*L&x D$!#L&'PWhIJBLzC-`vaZWCY|QUFS@P\x\fZ +xwYܻwovvAFç8v^f2xY,jٜN ٯ%7$8A*~߈#l$Ignčev?ѴHfE)ex}pN.//!⼾F"x$݄ _."d!J(jحF{vSMp;ƎbF߱0cQcLӴ,˶mu=}?0 (8I,# A5iv2snMp:w,1c qEئ:F84-˲mu]| (8N$˲<ϋi; #H&Uǒ,,˂l&drGЙ$%z{{ΈRFDl"d\JDgj[DTVmd_}4 שp;ONa}c1rGQmc3MӲ,۶]< 0($I,(n޾`?v Zk%ӖdA*Re!fLɄI]ߓ~XJDaȜ H\I"dԶi6D-ȶJ}oh Mp:w,1c qEئ:F84-˲mu]| (8N$˲<ϋiڶ; cHmǚVh%YeY9fhiDۓGo( ΅k"jZa[}4M5Mup8;ƎbF߱0cQcLӴ,˶mu=}?0 (8I,}Ag1c9( +6]ieٶyAaEq'IeYEQTUUu4ml:/Yw4^ۦc/ e2ݍٳFɈM?xAAׯ>1c q0aru}0iYmۮz~aFQq$Yy^٭{U9v4 +ftE*q"_`2EHl`01l6}90b@r}o.Ow~}0y5lǏ1޽{]J˗/^x왵|>c:5}z7o^zs?<~4<}_&""""5$=,TJi1ιB1\Jyj_Ao?<< >j.3a0}1mRJ.b=4y>ּBR)68B1Ɯs)-(m6G}\ fcaZkc1۶u]Z{i: <}ѭya)RJkmq΅b9R +ZE]kQmT7?"" 8} bmK),""""[ !RJ !sΥ4{Gcۨn7 +~DDDWs0p9&ÇkA,nۖRZuYky4|DDDDDBJ)19B1K)hiuFiQho8:#2`0s;LZYܶ-,0Mi#n{/@K)RZkcs.c9R(ZkFo(ptG]ea0v< 毵;m[Ji]eYa0Gݚ^R*\!Ƙs.QԵ;FuQ ""ˀa0y>_kmw "fq۶Һ˲Xk4Ma磏 """"5=,TJi1ιB1\JAKkw46JF{GADDt5a0|ھDm)u]e֞iNj.3a0}1mRJ.b=4y>ּBR)68B1Ɯs)-(m6G}\ fcaZkc1۶u]Z{i: <}ѭya)RJkmq΅b9R +ZE]kQmT7?"" 8} bmK),""""[ !RJ !sΥ4{Gcۨn7 +~DDDWs0p9&ÇkA,nۖRZuYky4|DDDDDBJ)19B1K)hiuFiQho8:#2`0s;LZYܶ-,0Mi#n{/@K)RZkcs.c9R(ZkFo(ptG]ea0v< 毵;m[Ji]eYa0Gݚ^R*\!Ƙs.QԵ;FuQ ""ˀa0y>_kmw "fq۶Һ˲Xk4Ma磏 """"5=,TJi1ιB1\JAKkw46JF{GADDt5a0|ھDm)u]e֞iNj.fm + W K#QEL Ѥfh}pv<o5![kRJJ{>RCk""""1 +!RJc9B9_uw-s(m6G?=g>7pk1ZRRJzZG[QRcιB{hisFiQho8:DDD?9pp9.LJ[k1pZR޿Z?=bBcu΅ru{GK{o46JF{O ""ρpy8>ZkC-j}(^DDDDDcBks.s;ZE={QmT7z|ngZc "nVk-C):O """"=,4Xks!u]}(9Fo(pt#~sps8;\cqZk)%Jס~zѿa)1Z !䜯FQ9hl6zՍFßADD3p|[lZK))%PJ#-(@K)1Z\!|]}߽w4zιFcۨn7 +""888DbkZJI)y߇RuhADDDDo1F!zXJi:B9Qsν7FuQGpv<o5![kRJJ{>RCk""""1 +!RJc9B9_uw-s(m6G?=g>7pk1ZRRJzZG[QRcιB{hisFiQho8:DDD?9pp9.LJ[k1pZR޿Z?=bBcu΅ru{GK{o46JF{O ""ρpy8>ZkC-j}(^DDDDDcBks.s;ZE={QmT7z|ngZc "nVk-C):O """"=,4Xks!u]}(9Fo(pt#~sps8;\cqZk)%Jס~zѿa)1Z !䜯FQ9hl6zՍFßADD3p|[lZK))%PJ#-(@K)1Z\!|]}߽w4zιFcۨn7 +""888DbkZJI)y߇RuhADDDDo1F!zXJi:B9Qsν7FuQGpv<o5![kRJJ{>RCk""""1 +!RJc9B9_uw-s(m6G?=g>7pk1ZRRJzZG[QRcιB{hisFiQho8:DDD?9pp9.LJ[k1pZR޿Z?=bBc:a(0\2o)V`$4(x0$0D^3mp~csε;ZE={QmT7z|ngZc "nVJI)sCJ:RO """"뺴k>Ƙs(9Fo(pt#~sps8;\cqRJJ){Rסzzѿ-@_ץ6Xk1ƜsFQ9hl6zՍFßADD3p|[lRRJ!R#o!z.1Z뽏1kw4zιFcۨn7 +""888DbkR +!8އu(ADDDDo} !ui1Z}1\kQsν7FuQGpv<o5![kR9>C)""""[Kkmzc9Zk-s(m6G?=g>7pk1Z+Bι!|JG}Bu]Zkc{c9Z{hisFiQho8:DDD?9pp9.LJ[k1pZ)%Bpν)PJ==BZccι{GK{o46JF{O ""ρpy8>ZkC-J))s}H)_RDDDDDv߷=|]csε;ZE={QmT7z|ngZc "nVJI)sCJ:RO """"뺴k>Ƙs(9Fo(pt#~sps8;\cqRJJ){Rסzzѿ-@_ץ6Xk1ƜsFQ9hl6zՍFßADD3p|[lRRJ!R#o!z.1Z뽏1kw4zιFcۨn7 +""888DbkR +!8އu(ADDDDo} !ui1Z}1\kQsν7FuQGpv<o5![kR9>C)""""[Kkmzc9Zk-s(m6G?=g>7pk1Z+Bι!|JG}Bu]Zkc{c9Z{hisFiQho8:DDD?9pp9.LJ[k1pZ)%Bpν)PJ==BZccι{GK{o46JF{O ""ρpy8>ZkC-J))s}H)_RDDDDDv߷=|]csε;ZE={QmT7z|ngZc "nVJI)sCJ:RO """"뺴k>Ƙs(9Fo(pt#~sps8;\cqRJJ){Rסzzѿ-@_ץ6Xk1ƜsFQ9hl6zՍFßADD3p|[lRRJ_vІp5˰+0U`@yMzaܷSJzZG[QRcιBιZ뽣Qsν7FuQGpv<o5!R޿Z?=bBcu΅rεZ-s(m6G?=g>7pk1xu]}(^DDDDDcBks.szhisFiQho8:DDD?9pp9.LJ[k1p*C):O """"=,4Xks!s{GK{o46JF{O ""ρpy8>ZkC-}]W)%Jס~zѿa)1Z !k;ZE={QmT7z|ngZc "nJ))%PJ#-(@K)1Z\!\km(9Fo(pt#~sps8;\cq}_UJI)y߇RuhADDDDo1F!zXJi:B9ZkkFQ9hl6zՍFßADD3p|[RJJ{>RCk""""1 +!RJc9B9Z[kw4zιFcۨn7 +""888D}uRRJzZG[QRcιBιZ뽣Qsν7FuQGpv<o5!R޿Z?=bBcu΅rεZ-s(m6G?=g>7pk1xu]}(^DDDDDcBks.szhisFiQho8:DDD?9pp9.LJ[k1p*C):O """"=,4Xks!s{GK{o46JF{O ""ρpy8>ZkC-}]W)%Jס~zѿa)1Z !k;ZE={QmT7z|ngZc "nJ))%PJ#-(@K)1Z\!\km(9Fo(pt#~sps8;\cq}_UJI)y߇RuhADDDDo1F!zXJi:B9ZkkFQ9hl6zՍFßADD3p|[RJJ{>RCk""""1 +!RJc9B9Z[kw4zιFcۨn7 +""888D}uRRJzZG[QRcιBιZ뽣Qsν7FuQGpv<o5!R޿Z?=bBcu΅rεZ-s(m6G?=g>7pk1xu]}(^DDDDDcBks.szhin0@f+0Ө + I/68uFo(pt#~sps8;\cqRJJ)`}RסzzѿyZcs1ƜsFQ9hl6zՍFßADD3p|[lRRJ!kR#{/@_u߷㜋1kw4zιFcۨn7 +""888DbkR +!Xk߇u(ADDDDo{!z\1\kQsν7FuQGpv<o5![kRZ>C)"""" !u68b9Zk-s(m6G?=g>7pk1Z+B!|JG^o19c9Z{hisFiQho8:DDD?9pp9.LJ[k1pZ)%B־)PJ==߼Bu]}k1ιcι{GK{o46JF{O ""ρpy8>ZkC-J))}H)_RDDDDDB[kmqsε;ZE={QmT7z|ngZc "nVJI)CJ:RO """"7=|]}Zkcs.Ƙs(9Fo(pt#~sps8;\cqRJJ)`}RסzzѿyZcs1ƜsFQ9hl6zՍFßADD3p|[lRRJ!kR#{/@_u߷㜋1kw4zιFcۨn7 +""888DbkR +!Xk߇u(ADDDDo{!z\1\kQsν7FuQGpv<o5![kRZ>C)"""" !u68b9Zk-s(m6G?=g>7pk1Z+B!|JG^o19c9Z{hisFiQho8:DDD?9pp9.LJ[k1pZ)%B־)PJ==߼Bu]}k1ιcι{GK{o46JF{O ""ρpy8>ZkC-J))}H)_RDDDDDB[kmqsε;ZE={QmT7z|ngZc "nVJI)CJ:RO """"7=|]}Zkcs.Ƙs(9Fo(pt#~sps8;\cqRJJ)`}RסzzѿyZcs1ƜsFQ9hl6zՍFßADD3p|[lRRJ!kR#{/@_u߷㜋1kw4zιFcۨn7 +""888DbkR +!Xk߇u(ADDD_fi6 x,uA @b,zf9$E|("-iKbSUTTHsɯ x$ݫѤi&@KT.ժ(neY㠥QԮFiQho8:<#wa0|?>h۶iNj5zX,2,}Ѥi&@KT.ժ(neY㠥QԮFiQho8:<#wa0|?>h۶iNj5zX,2,}Ѥi&@KT.ժ(neY㠥QԮFiQho8:<#wa0|?>h۶iNj5zX,2,}Ѥi&@KT.ժ(neY㠥QԮFiQho8:<#wa0|?>h۶iNj5zX,2,}Ѥi&@KT.ժ(neY㠥QԮFiQho8:<#wa0|?>h۶iNj5zX,2,}Ѥi&@KT.ժ(neY㠥QԮFiQho8:<#wa0|?>h۶iNj5zX,2,}Ѥi&@KT.ժ(xlۆaX8ZEhl6zՍF>h0m8ϟ?1|? ׯ?8u]UU%S* +Y󾀈h4MB%IT*Zhnw]˲zZE= Fuq):<# Ӗ$IE;Lo8.8ia躮)J,y_@DDDD4i !Ò$U*Zh4nݮeY^- AaFo8NDDDiK$"&7}w]Yt4M0t]WUUɔJBF/ """"4MӄaI*JVk4xlnײ^FQ 0DiQqi""q´%IEﻮA,:cadJR!#rMiB$IJV5 h0mIDQaáb|qDb(1Ffnne9 &M4!zXϟ///oll;;; 0 QmTwi>h0mIDQaáB "f㈉vv{iiyfnnsNMX~‹/P˫gT4ZEA(m6;4MyADD4N$I(a0|#8 0[[[ͷo߮,//ܺu{ݻqѣG>|WP>|@KmTwi +-I(0v< _A` +www1M *Fs13;;[9r """"c!;wOMM=z^|kkk(gǏ;;;hFo8NWh0mIDQa0b +www1H %}vw…'OuD2j͛7޽{=*zkkkgg]F(m6;4My Ӗ$IE~a}noo \Z-UUEy͛7]v+W\|ҥK/^>sΞ={̙ӧOxaB!?ƿCZ/'O={E٢o Ѻ(J/%,4N3LEÁ~CQBH$FD2DuS:\.HBaKK ˭fX޽~:///;;˗ϟ?F?ekhhp8UUU߿/))y-9//뜕ŋ̿~{J!BHZUT+EӖZ/U,d2Ro4gff痖N:*X,Fo޷t_B!.aRfc;;;` +P,,,X,aVV{zz$I{{;bseeeeLsAAA^^^nnnvv6&%!B!.bTsrrP(Xt,jMbзFokk+W** +0xddNF-].FQQx}qqquuusssH B-J]___^^&I /b +<s8;;5LFTd.[__pX䒒7o0W^2r!BI_iFGZѮEEEX,foQh]@ @vuuT*N3Vf9ۍ~EKNNN(틋[F!r~ua0y秧hS +~Z[[`jjZ.d2,֖x: 1渲\ZZZ\\\xxC!BHjE`Ѵ([mss3ZW(~P(4 zxhhhbbbQhu3*-D"X Fo(ptx!r0m8ap 8nooc(1 ЩaN߯RzzzRX,nkkkiixXalqmm-vfWVVVTT`1J!Bc2V+ +5[__E|@E~{{{Qad6gggWVVN|hi5uH$$zՍF}!ia殯///OOO1B b0P\.a٬V`P +S$ay[ZZↆ>p8jƚba !BI7tif(Xtl}}=mnnFߢrѺݫT*ZhC͡WWWn7FKQ׉D"LQho8:_ @Kըk46JNR(ptx!r0m8 +ÇbH$Y H %r9ݎ5z קRX^D.0ʘO>x<,5d72!BI_iFEWQhW,G͢iQRT&u{{{5xdd=<===??NF-{<]3*:zG +B!w ӆa0yD"DZGGGP{ޝ ӉlӉ d4u:RӃ(D"P(LJ!BHS(U*U,`% j[.T*ZEə9ݎBv\͌rp-}rrF]///ۨnOF!r0m9&Ç;;;1"1 |M۽wb6:m=0~G +( +k(KYC$}vKz_e˜}zྞ͍UvyyٳgKKK=kahݻw;whn MS5JUjU޿_l?~}⅊WݻBp8bd2N3LPT*z]-vGu=UXխ2~ŴntFu^M2jrrT*kI4[[[>|X___YYj|ϟ?Fyii韾G"ɓ'*XujVMUߪrպ^^8VGD"qrrNV-JRUѝNGEUj챡V{~4p9]=p8jnn4jT*l6Nd,D"ZՃ-v(~mmMׯ_z˗s)4}6\U 5ǏU;;;_5q4TJNV-Z~VE+ k5mU[4&V<-u]bi6JR,s\&9==M$X,h[vkkkssS ~ʊvXҧLUZ߼yUǮiUP(UdLNV-WzjTjiZuVimx~4pv4yh~q-cm6J-fTl6NRD"aLJ>}ommm {`R᪂ B*7{ѨX%|rr*V +ujhZ-*u]<5b{:إi4AM`0&:lۚZVTb.d2gggZUmׯZ/_hv{{{ZclnoojZVU{X%NUŅBT*zt:^OVQXVu_]]ܥi ZFchZjZ.\.͞jaobf7Fcϟ0` 6Y ul3Ժ*^uW VƵZh̽^O*hd[m[tp[4sv4|v5`0p]WCt:f^WR=ժj[N5\n"!F9_c`a|c5jؠ[UZWūUzXU6n4dղq~9mz2޾2n]:zT FiZIunWөJ\.kUF঍#J%vKmڎ====3U6wսBX,ժXmnɪe5y8*juZmc[tp4v>&^@[8vS m4SjR)Z n֗d4iN6z6ֳеFj#V5ZWkW V7NBV'fV9ۄVK't::]KP;86<ϳb:ԆmiѨjW][nޗq,c9CY[0l{Uj`zXU6V!UjpxVEۜVWmf+~~+ΟvPkhgq4]KSZUmkèZ۪-˥9]kY*e+[UZWūmZj`êbuUdղ<*zb\llvf#8NcC+bj7P-iϰt܆O!Ωm>_UuZju aUxh*gjiml&v.h5v%5 C7aG;k-_X09jΜYUaU3>*z>A>ە1[és92.1 کto9@P~u 6}6UŞ穐>MYQ:9v(Ԓzƅd6km^Ha<)Fui@ ^hjh=Ǿ- Er3Y/n;zXml#Z9ۜ:XWs71sl'>[ +y>yV^03+?h` n&|0^3dx8T كA_#T +endstream +endobj +380 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(159)Tj +0 Tc 0 Tw -20.132 57.06 Td +(persistent )Tj +4.577 0 Td +(relations )Tj +4.189 0 Td +(between )Tj +4.189 0 Td +(entities. )Tj +3.856 0 Td +(Either )Tj +2.966 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.633 0 Td +(will )Tj +2.133 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.02 0 Td +(to )Tj +1.354 0 Td +(cut )Tj +1.854 0 Td +(persistent )Tj +4.577 0 Td +(relations )Tj +4.189 0 Td +(between )Tj +-38.532 -1.44 Td +(entities )Tj +3.561 0 Td +(and )Tj +2.116 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.004 0 Td +(up )Tj +1.616 0 Td +(joins, )Tj +2.839 0 Td +(or )Tj +1.393 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.616 0 Td +(will )Tj +2.116 0 Td +(ha)Tj +1.026 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.004 0 Td +(to )Tj +1.338 0 Td +(take )Tj +2.282 0 Td +(dependencies )Tj +6.451 0 Td +(between )Tj +4.172 0 Td +(components )Tj +5.784 0 Td +(into )Tj +-40.532 -1.44 Td +(consider)Tj +3.656 0 Td +(ation.)Tj +/TT1 1 Tf +12 0 0 12 57 564.4 Tm +(Entity Control Boundary)Tj +/TT0 1 Tf +10 0 0 10 75 542 Tm +(Although )Tj +4.531 0 Td +(most )Tj +2.64 0 Td +(of )Tj +1.418 0 Td +(the )Tj +1.918 0 Td +(J2EE )Tj +2.418 0 Td +(patterns )Tj +3.974 0 Td +(are )Tj +/C2_0 1 Tf +1.917 0 Td +<004B004D0048003D004A005E>Tj +/TT0 1 Tf +(uous )Tj +5.531 0 Td +(\(see )Tj +/TT2 1 Tf +2.251 0 Td +(Real )Tj +2.399 0 Td +(W)Tj +0.907 0 Td +(orld )Tj +2.288 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.084 0 Td +(EE )Tj +1.584 0 Td +(P)Tj +0.464 0 Td +(atterns\227)Tj +-38.33 -1.44 Td +(Rethinking )Tj +5.124 0 Td +(Best )Tj +2.363 0 Td +(Pr)Tj +0.877 0 Td +(actices)Tj +/TT0 1 Tf +(, )Tj +3.771 0 Td +(http://press.adam-bien.com)Tj +(\), )Tj +12.849 0 Td +(a )Tj +1.067 0 Td +(minimal )Tj +4.123 0 Td +(structure )Tj +4.29 0 Td +(does )Tj +/C2_0 1 Tf +2.568 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly )Tj +-37.031 -1.44 Td +(i)Tj +0.329 0 Td +(m)Tj +0.884 0 Td +(p)Tj +0.607 0 Td +(r)Tj +0.384 0 Td +(o)Tj +0.595 0 Td +(v)Tj +0.539 0 Td +(e )Tj +1.303 0 Td +(m)Tj +0.884 0 Td +(a)Tj +0.551 0 Td +(i)Tj +0.329 0 Td +(n)Tj +0.607 0 Td +(t)Tj +0.329 0 Td +(a)Tj +0.551 0 Td +(i)Tj +0.329 0 Td +(n)Tj +0.607 0 Td +(a)Tj +0.551 0 Td +(b)Tj +0.607 0 Td +(i)Tj +0.329 0 Td +(l)Tj +0.329 0 Td +(i)Tj +0.329 0 Td +(t)Tj +0.329 0 Td +(y)Tj +0.459 0 Td +(. )Tj +1.007 0 Td +(T)Tj +0.562 0 Td +(h)Tj +0.607 0 Td +(e )Tj +1.303 0 Td +(E)Tj +0.551 0 Td +(n)Tj +0.607 0 Td +(t)Tj +0.329 0 Td +(i)Tj +0.329 0 Td +(t)Tj +0.329 0 Td +(y )Tj +1.303 0 Td +(C)Tj +0.718 0 Td +(o)Tj +0.607 0 Td +(n)Tj +0.607 0 Td +(t)Tj +0.329 0 Td +(r)Tj +0.384 0 Td +(o)Tj +0.607 0 Td +(l )Tj +1.081 0 Td +(B)Tj +0.662 0 Td +(o)Tj +0.607 0 Td +(u)Tj +0.607 0 Td +(n)Tj +0.607 0 Td +(d)Tj +0.607 0 Td +(a)Tj +0.551 0 Td +(r)Tj +0.384 0 Td +(y )Tj +1.303 0 Td +(\()Tj +0.329 0 Td +(E)Tj +0.551 0 Td +(C)Tj +0.718 0 Td +(B)Tj +0.662 0 Td +(\) )Tj +1.081 0 Td +(p)Tj +0.607 0 Td +(a)Tj +0.551 0 Td +(t)Tj +0.329 0 Td +(t)Tj +0.329 0 Td +(e)Tj +0.551 0 Td +(r)Tj +0.384 0 Td +(n )Tj +1.359 0 Td +(i)Tj +0.329 0 Td +(s )Tj +1.192 0 Td +(s)Tj +0.44 0 Td +(i)Tj +0.329 0 Td +(m)Tj +0.884 0 Td +(i)Tj +0.329 0 Td +(l)Tj +0.329 0 Td +(a)Tj +0.551 0 Td +(r )Tj +1.136 0 Td +(t)Tj +0.329 0 Td +(o)Tj +( )Tj +-41.644 -1.44 Td +(Model)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(V)Tj +4.009 0 Td +(iew)Tj +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +(Controller )Tj +6.978 0 Td +(\(MVC\), )Tj +3.544 0 Td +(but )Tj +1.877 0 Td +(it )Tj +1.043 0 Td +(is )Tj +1.154 0 Td +(not )Tj +1.877 0 Td +(applicable )Tj +4.989 0 Td +(only )Tj +2.377 0 Td +(for )Tj +1.654 0 Td +(the )Tj +1.821 0 Td +(UI )Tj +1.543 0 Td +(\()Tj +(http://epf.eclipse.org/)Tj +-32.862 -1.44 Td +(w)Tj +0.828 0 Td +(i)Tj +0.328 0 Td +(k)Tj +0.55 0 Td +(i)Tj +0.328 0 Td +(s)Tj +0.439 0 Td +(/)Tj +0.328 0 Td +(o)Tj +0.606 0 Td +(p)Tj +0.606 0 Td +(e)Tj +0.55 0 Td +(n)Tj +0.606 0 Td +(u)Tj +0.606 0 Td +(p)Tj +0.606 0 Td +(p)Tj +0.606 0 Td +(t)Tj +0.328 0 Td +(/)Tj +0.328 0 Td +(o)Tj +0.606 0 Td +(p)Tj +0.606 0 Td +(e)Tj +0.55 0 Td +(n)Tj +0.606 0 Td +(u)Tj +0.606 0 Td +(p)Tj +0.606 0 Td +(_)Tj +0.55 0 Td +(b)Tj +0.606 0 Td +(a)Tj +0.55 0 Td +(s)Tj +0.439 0 Td +(i)Tj +0.328 0 Td +(c)Tj +0.55 0 Td +(/)Tj +0.328 0 Td +(g)Tj +0.55 0 Td +(u)Tj +0.606 0 Td +(i)Tj +0.328 0 Td +(d)Tj +0.606 0 Td +(a)Tj +0.55 0 Td +(n)Tj +0.606 0 Td +(c)Tj +0.55 0 Td +(e)Tj +0.55 0 Td +(s)Tj +0.439 0 Td +(/)Tj +0.328 0 Td +(c)Tj +0.55 0 Td +(o)Tj +0.606 0 Td +(n)Tj +0.606 0 Td +(c)Tj +0.55 0 Td +(e)Tj +0.55 0 Td +(p)Tj +0.606 0 Td +(t)Tj +0.328 0 Td +(s)Tj +0.439 0 Td +(/)Tj +0.328 0 Td +(e)Tj +0.55 0 Td +(n)Tj +0.606 0 Td +(t)Tj +0.328 0 Td +(i)Tj +0.328 0 Td +(t)Tj +0.328 0 Td +(y)Tj +0.55 0 Td +(_)Tj +0.55 0 Td +(c)Tj +0.55 0 Td +(o)Tj +0.606 0 Td +(n)Tj +0.606 0 Td +(t)Tj +0.328 0 Td +(r)Tj +0.383 0 Td +(o)Tj +0.606 0 Td +(l)Tj +0.328 0 Td +(_)Tj +0.55 0 Td +(b)Tj +0.606 0 Td +(o)Tj +0.606 0 Td +(u)Tj +0.606 0 Td +(n)Tj +0.606 0 Td +(d)Tj +0.606 0 Td +(a)Tj +0.55 0 Td +(r)Tj +0.383 0 Td +(y)Tj +0.55 0 Td +(_)Tj +0.55 0 Td +(p)Tj +0.606 0 Td +(a)Tj +0.55 0 Td +(t)Tj +0.328 0 Td +(t)Tj +0.328 0 Td +(e)Tj +0.55 0 Td +(r)Tj +0.383 0 Td +(n)Tj +0.606 0 Td +(,)Tj +0.328 0 Td +(_)Tj +0.55 0 Td +(u)Tj +0.606 0 Td +(F)Tj +0.55 0 Td +(-)Tj +-41.867 -1.44 Td +(QYEAhEdq_UJTvM1DM2Q)Tj +11.868 0 Td +(.html)Tj +(\). )Tj +3.081 0 Td +(ECB )Tj +2.08 0 Td +(is )Tj +0.969 0 Td +(older )Tj +2.525 0 Td +(than )Tj +2.192 0 Td +(the )Tj +/C2_0 1 Tf +1.636 0 Td +<003100460041005D>Tj +/TT0 1 Tf +(ed )Tj +3.526 0 Td +(Modeling )Tj +4.415 0 Td +(Language )Tj +4.414 0 Td +(\(UML\) )Tj +3.025 0 Td +(and )Tj +1.914 0 Td +(it)Tj +( )Tj +-41.644 -1.44 Td +(is )Tj +0.994 0 Td +(supported )Tj +4.607 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.827 0 Td +(most )Tj +2.383 0 Td +(design )Tj +3.106 0 Td +(tools. )Tj +2.662 0 Td +(Eac)Tj +1.482 0 Td +(h )Tj +0.883 0 Td +(element )Tj +3.772 0 Td +(of )Tj +1.161 0 Td +(the )Tj +1.661 0 Td +(ECB )Tj +2.105 0 Td +(pattern )Tj +3.328 0 Td +(comes )Tj +3.105 0 Td +(with )Tj +2.217 0 Td +(its )Tj +1.272 0 Td +(o)Tj +0.544 0 Td +(wn )Tj +1.661 0 Td +(icon )Tj +2.217 0 Td +(\(see)Tj +( )Tj +-40.533 -1.44 Td +(F)Tj +0.482 0 Td +(igure 9\).)Tj +ET +q +376.4392395 0 0 141.9999847 75 259.8000031 cm +/Im0 Do +Q +BT +/TT0 1 Tf +10 0 0 10 75 240.4001 Tm +(F)Tj +0.482 0 Td +(igure 9: Structure of the ECB P)Tj +12.913 0 Td +(attern)Tj +-13.395 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.488 0 Td +(ECB )Tj +2.21 0 Td +(pattern )Tj +3.433 0 Td +(is )Tj +1.099 0 Td +(used )Tj +2.433 0 Td +(for )Tj +1.599 0 Td +(the )Tj +1.766 0 Td +(creation )Tj +3.933 0 Td +(of )Tj +1.266 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(ers )Tj +1.654 0 Td +(inside )Tj +2.989 0 Td +(the )Tj +1.766 0 Td +(business )Tj +4.045 0 Td +(component )Tj +5.323 0 Td +(with )Tj +2.322 0 Td +(the)Tj +( )Tj +-40.866 -1.44 Td +(same )Tj +2.928 0 Td +(name. )Tj +3.373 0 Td +(Ev)Tj +0.988 0 Td +(ery )Tj +2.039 0 Td +(component )Tj +5.597 0 Td +(contains )Tj +4.319 0 Td +(boundary)Tj +4.021 0 Td +(, )Tj +0.984 0 Td +(control)Tj +/TT4 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +4.013 0 Td +(and )Tj +2.318 0 Td +(entity )Tj +3.096 0 Td +(subpac)Tj +3.039 0 Td +(kages. )Tj +3.336 0 Td +(At )Tj +1.651 0 Td +(a )Tj +-41.7 -1.44 Td +(minimum, )Tj +4.91 0 Td +(the )Tj +1.799 0 Td +(boundary )Tj +4.578 0 Td +(pac)Tj +1.538 0 Td +(kage )Tj +2.465 0 Td +(is )Tj +1.132 0 Td +(required. )Tj +4.355 0 Td +(CRUD )Tj +3.299 0 Td +(functionality )Tj +5.857 0 Td +(can )Tj +2.021 0 Td +(be )Tj +1.521 0 Td +(realized )Tj +3.91 0 Td +(with )Tj +2.355 0 Td +(just )Tj +1.966 0 Td +(a )Tj +-41.7 -1.44 Td +(boundary )Tj +4.494 0 Td +(and )Tj +1.993 0 Td +(entity )Tj +2.771 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(ers. )Tj +1.881 0 Td +(Realization )Tj +5.216 0 Td +(of )Tj +1.215 0 Td +(more )Tj +2.603 0 Td +(sophisticated )Tj +5.995 0 Td +(business )Tj +3.994 0 Td +(logic )Tj +2.493 0 Td +(usually )Tj +3.438 0 Td +(requires )Tj +3.826 0 Td +(all)Tj +( )Tj +-41.144 -1.44 Td +(three la)Tj +3.193 0 Td +(y)Tj +0.482 0 Td +(ers.)Tj +/TT1 1 Tf +12 0 0 12 57 124.0001 Tm +(Boundary)Tj +/TT0 1 Tf +10 0 0 10 75 101.6001 Tm +(Boundary )Tj +4.614 0 Td +(exposes )Tj +3.836 0 Td +(the )Tj +1.78 0 Td +(implementation )Tj +7.226 0 Td +(of )Tj +1.28 0 Td +(a )Tj +0.946 0 Td +(business )Tj +4.059 0 Td +(component )Tj +5.337 0 Td +(to )Tj +1.28 0 Td +(the )Tj +1.78 0 Td +(outside )Tj +3.559 0 Td +(w)Tj +0.766 0 Td +(orld. )Tj +2.373 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(main )Tj +2.539 0 Td +(responsibility )Tj +6.097 0 Td +(is )Tj +1.039 0 Td +(to )Tj +1.206 0 Td +(pro)Tj +1.433 0 Td +(vide, )Tj +2.484 0 Td +(as )Tj +1.261 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(eniently )Tj +3.818 0 Td +(as )Tj +1.261 0 Td +(possible, )Tj +4.152 0 Td +(access )Tj +3.15 0 Td +(to )Tj +1.206 0 Td +(the )Tj +1.706 0 Td +(functionality )Tj +5.764 0 Td +(hidden )Tj +ET + +endstream +endobj +381 0 obj<>stream +HeT ̀tҡ"" t (]C%C8C*!4P*-H R}F޻rus}@mD~>Z<yF @ +"/'}N@ A|*;fcCAB`{[ 16Tk lw̝w&}eB^_{1>*/(> !=:K/%pl$<>> +m $+Rd +jKGO '~`;cDPBhq ))Y8)e4:6!$'S k4g7/O*1@MSDĬS$%geesςsF(/4(\QU9uIU\C=DB2Jn>݁kFg w&f,\|,o;ghdv}`Pph$;˧Էo6`;]{A += ׈)%9]M&>MJG$'fcҳ321O LZ*;1'.76/.?)YJAz"t1yVI KtiԲ +7*$|-C7XUr5u5U4gĽf~CS{g@/wxPfzh~1gڱR/Wf8g6vb Җ\|Rf.Q#`Sjs~+}[{{.nrwكÔ#yx}<%4KU2SAJmD ,])cs(":;cˆW/\PDUPd4X3>}iA=@3gI+(]0Ut@)I9WVKmP}LcZsAkI{ҕūs:_tG p8~SYyEJ7mmSNY.ٮYn[I^q8$ |Uۭ=w~74~xhPhOXبn1汚q ĹGCImҴϠw$ckgoqqQAs/_*%]&R^{=[S:MpC:z cow.M +-[[ۖ;z:J3{>(qCq]>|422Z982qi}r{Kt،WY9073߼fIykJjΆfg~ӯCÙ翽$&$'7GRP/Ж1203g9OpZq}J TpH[Ty1^qSx&MAYS3g/8)>QRRzNɡŧ-|:u qsrqspr3Y][[Y9ls9;{]]ݚo5Wyzz!ss} x^cPU/CBSz[FhFJFDo17qDGI(JAz\hZ5%YOC0,l\<| _?'{4UbYPskJ75ur oKQԛɛ[F߷ۣ:;-4%z{z{*qfC'}|hz9161%kWYu ŠoKJ+}jY ZP!Iy=n^~/kG + kHP udW@ZZH0>y @z4PxPJ@?`L f Z` p* O!r J#"#!.#^% &!ME""%KCEKM!@B1EL G cTTԂ'ODܧ9 #Kg/`8hɸ~22K+?k;;If/NAsK_-+!oayȇSED0\z'qmML>^4l>âɲ*:&6.>!ͱЩ޹eO=~x{Y +92' 24*z^̡| f I{Sޥ)GfL<͛ [AHb7O:jpnt׷dd;g/v{{C䧗_~H7~i 2 j  m 62`xQј11q&kT*2]dˬ|1K>Zw{X汽ecÊcNO\\\mW}Ɨw?@k2!f){ED>iϐX- Cjt fL9%"E/)){pRU VVEE+\[GYF6(=C;Fی'XZ||`u#v;t|ͅU=ȣs>_ujg }1d}j&MKuL+O_2K-;-gE|+:%=c+TUoծ[ܸ֠YemiNS=޽'&t. ^X\Taٕ~ƌ[9ݱuW}T9| 'O[:K쾶[SL7G|z.2u}~ROQWC㟍AAA!!0a !30>d`2``j`Zt:ss3V,,,XγNb&ǖݟ}'79_89Wsqqes6S7'~GCC 3O9" Gl *IyRrdee?ȭTPWxX)AY^B45=G5jkhh9@B?@Ð;gԘ&y[(Z +ZXiǎٞA9ɥu~'<^fI>=[n Tr ;edOTSoq _&$M!*sC^Bw!e+L*Vk׬ӯtXmoZ{?u‡ISXN.?c,V[mQ뗧T\l͆u 6ilazoޝw|QcN85Lɹ /;n;~YOzͱw?t}*/?8@/sf^jnKfqANb%>"@nN)>! K*@$ .. v2>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 383 0 R>>endobj +383 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(160)Tj +0 Tc 0 Tw -20.132 57.06 Td +(behind )Tj +3.366 0 Td +(the )Tj +1.698 0 Td +(boundary)Tj +4.021 0 Td +(. )Tj +0.605 0 Td +(A )Tj +1.031 0 Td +(boundary )Tj +4.477 0 Td +(is )Tj +1.031 0 Td +(coarse )Tj +3.142 0 Td +(gr)Tj +0.821 0 Td +(ained, )Tj +3.032 0 Td +(and )Tj +1.976 0 Td +(makes )Tj +3.086 0 Td +(\223business )Tj +4.421 0 Td +(sense\224 )Tj +3.142 0 Td +(to )Tj +1.198 0 Td +(its )Tj +1.309 0 Td +(user)Tj +1.704 0 Td +(. )Tj +0.568 0 Td +(T)Tj +0.511 0 Td +(he)Tj +( )Tj +-41.144 -1.44 Td +(c)Tj +0.544 0 Td +(l)Tj +0.322 0 Td +(a)Tj +0.544 0 Td +(s)Tj +0.433 0 Td +(s )Tj +/TT1 1 Tf +1.189 0 Td +(c)Tj +0.644 0 Td +(o)Tj +0.644 0 Td +(m)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(a)Tj +0.644 0 Td +(b)Tj +0.644 0 Td +(i)Tj +0.644 0 Td +(e)Tj +0.644 0 Td +(n)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(x)Tj +0.644 0 Td +(r)Tj +0.644 0 Td +(a)Tj +0.644 0 Td +(y)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(b)Tj +0.644 0 Td +(u)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(i)Tj +0.644 0 Td +(n)Tj +0.644 0 Td +(e)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(t)Tj +0.644 0 Td +(o)Tj +0.644 0 Td +(r)Tj +0.644 0 Td +(e)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(b)Tj +0.644 0 Td +(o)Tj +0.644 0 Td +(u)Tj +0.644 0 Td +(n)Tj +0.644 0 Td +(d)Tj +0.644 0 Td +(a)Tj +0.644 0 Td +(r)Tj +0.644 0 Td +(y)Tj +0.644 0 Td +(.)Tj +0.644 0 Td +(H)Tj +0.644 0 Td +(i)Tj +0.644 0 Td +(t)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(R)Tj +0.644 0 Td +(e)Tj +0.644 0 Td +(s)Tj +0.644 0 Td +(o)Tj +0.644 0 Td +(u)Tj +0.644 0 Td +(r)Tj +0.644 0 Td +(c)Tj +0.644 0 Td +(e)Tj +/TT0 1 Tf +( )Tj +1.4 0 Td +(e)Tj +0.544 0 Td +(x)Tj +0.544 0 Td +(p)Tj +0.6 0 Td +(o)Tj +0.6 0 Td +(s)Tj +0.433 0 Td +(e)Tj +0.544 0 Td +(s )Tj +1.189 0 Td +(a)Tj +0.544 0 Td +(n )Tj +-41.644 -1.44 Td +(easy)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(to)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +(use REST interface and does not rev)Tj +19.25 0 Td +(eal an)Tj +2.594 0 Td +(y details about its implementation:)Tj +/TT1 1 Tf +-21.844 -1.79 Td +( @PUT)Tj +0 -1.79 TD +( @Consumes\({MediaType.TEXT_PLAIN}\))Tj +T* +( public Response updateStatistics\(@Context HttpHeaders httpHeaders, \ )Tj +0 -0.99 TD +(String url\) {)Tj +0 -1.79 TD +(})Tj +/TT0 1 Tf +1.8 -2.24 Td +(E)Tj +0.789 0 Td +(x)Tj +0.789 0 Td +(t)Tj +0.567 0 Td +(r)Tj +0.61 0 Td +(a)Tj +0.789 0 Td +(c)Tj +0.789 0 Td +(t)Tj +0.567 0 Td +(i)Tj +0.567 0 Td +(o)Tj +0.845 0 Td +(n)Tj +0.845 0 Td +(, )Tj +/C2_0 1 Tf +1.224 0 Td +<005D>Tj +/TT0 1 Tf +0.845 0 Td +(l)Tj +0.567 0 Td +(t)Tj +0.567 0 Td +(e)Tj +0.789 0 Td +(r)Tj +0.622 0 Td +(i)Tj +0.567 0 Td +(n)Tj +0.845 0 Td +(g)Tj +0.789 0 Td +(, )Tj +1.224 0 Td +(a)Tj +0.789 0 Td +(n)Tj +0.845 0 Td +(d )Tj +1.502 0 Td +(s)Tj +0.678 0 Td +(t)Tj +0.567 0 Td +(o)Tj +0.845 0 Td +(r)Tj +0.61 0 Td +(a)Tj +0.789 0 Td +(g)Tj +0.789 0 Td +(e )Tj +1.446 0 Td +(a)Tj +0.789 0 Td +(r)Tj +0.622 0 Td +(e )Tj +1.446 0 Td +(i)Tj +0.567 0 Td +(m)Tj +1.122 0 Td +(p)Tj +0.845 0 Td +(l)Tj +0.567 0 Td +(e)Tj +0.789 0 Td +(m)Tj +1.122 0 Td +(e)Tj +0.789 0 Td +(n)Tj +0.845 0 Td +(t)Tj +0.567 0 Td +(e)Tj +0.789 0 Td +(d )Tj +1.502 0 Td +(i)Tj +0.567 0 Td +(n )Tj +1.502 0 Td +(t)Tj +0.567 0 Td +(h)Tj +0.845 0 Td +(e )Tj +/TT1 1 Tf +-41.7 -1.44 Td +(com.abien.xray.business.store.boundary.Hits)Tj +/TT0 1 Tf +( )Tj +26.199 0 Td +(class, )Tj +2.729 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.951 0 Td +(is )Tj +1.062 0 Td +(independent )Tj +5.787 0 Td +(of )Tj +1.229 0 Td +(REST)Tj +( )Tj +-40.033 -1.44 Td +(and )Tj +2.352 0 Td +(HTTP)Tj +2.317 0 Td +(. )Tj +0.944 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.796 0 Td +(protocol-agnostic )Tj +8.243 0 Td +(method )Tj +/TT1 1 Tf +4.019 0 Td +(Hits#updateStatistics)Tj +/TT0 1 Tf +( )Tj +13.342 0 Td +(is )Tj +1.407 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.852 0 Td +(b)Tj +0.538 0 Td +(y )Tj +1.24 0 Td +(the )Tj +/TT1 1 Tf +-40.866 -1.44 Td +(HitsResource)Tj +/TT0 1 Tf +( EJB bean:)Tj +/TT1 1 Tf +1.8 -2.12 Td +(public void updateStatistics\(String uri, String referer, )Tj +-1.8 -1.32 Td +(Map headerMap\) {})Tj +/TT0 1 Tf +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +/TT1 1 Tf +1.557 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.901 0 Td +(EJB )Tj +1.89 0 Td +(bean )Tj +2.613 0 Td +(or)Tj +0.877 0 Td +(c)Tj +0.482 0 Td +(hestr)Tj +2.044 0 Td +(ates )Tj +2.168 0 Td +(controls, )Tj +4.225 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.057 0 Td +(as )Tj +/TT1 1 Tf +1.39 0 Td +(HitsCache)Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +6.18 0 Td +(PersistentHitStore)Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +-31.12 -1.44 Td +(PersistentRefererStore)Tj +/TT0 1 Tf +(, )Tj +13.886 0 Td +(or )Tj +/TT1 1 Tf +1.295 0 Td +(TitleFetcher)Tj +/TT0 1 Tf +(, )Tj +7.886 0 Td +(to )Tj +1.24 0 Td +(implement )Tj +5.018 0 Td +(the )Tj +1.74 0 Td +(exposed )Tj +3.963 0 Td +(functionality)Tj +5.3 0 Td +(. )Tj +0.647 0 Td +(All )Tj +-40.977 -1.44 Td +(controls )Tj +4.046 0 Td +(were )Tj +2.711 0 Td +(introduced )Tj +5.269 0 Td +(afterw)Tj +2.649 0 Td +(ards )Tj +2.378 0 Td +(to )Tj +1.434 0 Td +(decrease )Tj +4.378 0 Td +(the )Tj +1.934 0 Td +(boundary )Tj +4.713 0 Td +(complexity )Tj +5.379 0 Td +(and )Tj +2.212 0 Td +(increase )Tj +4.156 0 Td +(its )Tj +-41.255 -1.44 Td +(cohesion. )Tj +1.8 -2.24 Td +(T)Tj +0.511 0 Td +(he )Tj +1.548 0 Td +(boundary )Tj +4.605 0 Td +(in )Tj +1.326 0 Td +(the )Tj +/TT1 1 Tf +1.826 0 Td +(storage)Tj +/TT0 1 Tf +( )Tj +4.693 0 Td +(business )Tj +4.105 0 Td +(component )Tj +5.383 0 Td +(consists )Tj +3.827 0 Td +(of )Tj +1.326 0 Td +(tw)Tj +1.044 0 Td +(o )Tj +1.048 0 Td +(parts: )Tj +2.826 0 Td +(the )Tj +/TT1 1 Tf +1.826 0 Td +(Hits)Tj +/TT0 1 Tf +( )Tj +2.893 0 Td +(and )Tj +/TT1 1 Tf +-40.588 -1.44 Td +(HitsResource)Tj +/TT0 1 Tf +( )Tj +7.534 0 Td +(classes. )Tj +/TT1 1 Tf +3.556 0 Td +(HitResource)Tj +/TT0 1 Tf +( )Tj +6.934 0 Td +(is )Tj +1 0 Td +(hea)Tj +1.526 0 Td +(vily )Tj +1.889 0 Td +(J)Tj +0.26 0 Td +(AX-RS )Tj +3.055 0 Td +(dependent, )Tj +5.169 0 Td +(but )Tj +1.723 0 Td +(it )Tj +0.889 0 Td +(does )Tj +2.334 0 Td +(not )Tj +1.723 0 Td +(implement )Tj +-37.588 -1.44 Td +(an)Tj +1.038 0 Td +(y )Tj +0.864 0 Td +(business )Tj +3.977 0 Td +(logic. )Tj +2.68 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.42 0 Td +(EJB )Tj +1.753 0 Td +(bean )Tj +/TT1 1 Tf +2.476 0 Td +(Hits)Tj +/TT0 1 Tf +(, )Tj +3.042 0 Td +(on )Tj +1.476 0 Td +(the )Tj +1.698 0 Td +(other )Tj +2.587 0 Td +(hand, )Tj +2.81 0 Td +(is )Tj +1.031 0 Td +(only )Tj +2.254 0 Td +(responsible )Tj +5.255 0 Td +(for )Tj +1.531 0 Td +(pro)Tj +1.433 0 Td +(viding )Tj +3.032 0 Td +(the )Tj +-40.866 -1.44 Td +(exposed )Tj +4.034 0 Td +(functionality )Tj +5.869 0 Td +(and )Tj +2.089 0 Td +(it )Tj +1.033 0 Td +(is )Tj +1.144 0 Td +(highly )Tj +3.145 0 Td +(protocol )Tj +4.09 0 Td +(agnostic. )Tj +4.312 0 Td +(Splitting )Tj +3.979 0 Td +(a )Tj +0.977 0 Td +(boundary )Tj +4.59 0 Td +(into )Tj +2.145 0 Td +(tw)Tj +1.044 0 Td +(o )Tj +1.033 0 Td +(halv)Tj +1.822 0 Td +(es )Tj +-41.311 -1.44 Td +(increases )Tj +4.27 0 Td +(testability )Tj +4.438 0 Td +(and )Tj +1.937 0 Td +(makes )Tj +3.047 0 Td +(the )Tj +1.659 0 Td +(business )Tj +3.938 0 Td +(logic )Tj +2.437 0 Td +(protocol )Tj +3.938 0 Td +(agnostic. )Tj +4.16 0 Td +(Consequently)Tj +5.8 0 Td +(, )Tj +0.603 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.437 0 Td +(will )Tj +1.937 0 Td +(need)Tj +( )Tj +-40.088 -1.44 Td +(a )Tj +0.88 0 Td +(dedicated )Tj +4.604 0 Td +(\223protocol )Tj +4.437 0 Td +(boundary\224 )Tj +4.937 0 Td +(for )Tj +1.547 0 Td +(eac)Tj +1.482 0 Td +(h )Tj +0.936 0 Td +(exposed )Tj +3.937 0 Td +(protocol, )Tj +4.271 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +0.936 0 Td +(as )Tj +1.269 0 Td +(Hessian, )Tj +4.048 0 Td +(SO)Tj +1.296 0 Td +(AP)Tj +1.094 0 Td +(, )Tj +0.658 0 Td +(or )Tj +1.269 0 Td +(Google )Tj +-39.032 -1.44 Td +(W)Tj +0.963 0 Td +(eb )Tj +1.419 0 Td +(T)Tj +0.456 0 Td +(oolkit )Tj +2.883 0 Td +(Remote )Tj +3.715 0 Td +(Procedure )Tj +4.827 0 Td +(Call )Tj +2.16 0 Td +(\(GWT )Tj +3.049 0 Td +(RPC\). )Tj +2.753 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.493 0 Td +(protocol-agnostic )Tj +7.94 0 Td +(part )Tj +2.104 0 Td +(should )Tj +3.328 0 Td +(be )Tj +1.493 0 Td +(able )Tj +2.271 0 Td +(to )Tj +-41.366 -1.44 Td +(handle all protocols without an)Tj +13.434 0 Td +(y c)Tj +1.26 0 Td +(hange. )Tj +/TT2 1 Tf +12 0 0 12 57 194.1001 Tm +(Control)Tj +/TT0 1 Tf +10 0 0 10 75 171.7001 Tm +(A )Tj +0.984 0 Td +(control )Tj +3.374 0 Td +(implements )Tj +5.318 0 Td +(parts )Tj +2.373 0 Td +(of )Tj +1.151 0 Td +(business )Tj +3.93 0 Td +(logic )Tj +2.429 0 Td +(that )Tj +1.929 0 Td +(are )Tj +1.65 0 Td +(coordinated )Tj +5.486 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.817 0 Td +(a )Tj +0.817 0 Td +(boundary)Tj +4.021 0 Td +(. )Tj +0.558 0 Td +(A )Tj +0.984 0 Td +(control )Tj +3.374 0 Td +(is )Tj +-41.533 -1.44 Td +(usually )Tj +/C2_0 1 Tf +3.541 0 Td +<005D>Tj +/TT0 1 Tf +(ner )Tj +2.429 0 Td +(than )Tj +2.374 0 Td +(a )Tj +0.984 0 Td +(boundary )Tj +4.597 0 Td +(and )Tj +2.096 0 Td +(does )Tj +2.485 0 Td +(not )Tj +1.874 0 Td +(appear )Tj +3.429 0 Td +(as )Tj +1.373 0 Td +(a )Tj +0.984 0 Td +(standalone )Tj +5.153 0 Td +(use )Tj +1.929 0 Td +(case. )Tj +2.614 0 Td +(A )Tj +1.151 0 Td +(control )Tj +3.541 0 Td +(is )Tj +1.151 0 Td +(a)Tj +( )Tj +-41.7 -1.44 Td +(product )Tj +3.677 0 Td +(of )Tj +1.176 0 Td +(refactoring )Tj +4.954 0 Td +(and, )Tj +2.232 0 Td +(in )Tj +1.176 0 Td +(particular)Tj +4.038 0 Td +(, )Tj +0.62 0 Td +(\223Separ)Tj +2.821 0 Td +(ation )Tj +2.51 0 Td +(of )Tj +1.176 0 Td +(Concerns)Tj +/TT3 1 Tf +(.)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 343.8414 142.9001 Tm +(\224 )Tj +0.749 0 Td +(A )Tj +1.009 0 Td +(control )Tj +3.399 0 Td +(represents )Tj +4.676 0 Td +(a )Tj +0.842 0 Td +(part )Tj +2.009 0 Td +(of )Tj +-41.366 -1.44 Td +(the business logic realized b)Tj +12.154 0 Td +(y a boundary and is)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( therefore)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( less interesting for external use.)Tj +-10.354 -2.24 Td +(In )Tj +1.353 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.019 0 Td +(EE )Tj +1.519 0 Td +(6)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.325 0 Td +(a )Tj +1.019 0 Td +(control )Tj +3.576 0 Td +(is )Tj +1.186 0 Td +(an )Tj +1.575 0 Td +(optional )Tj +4.077 0 Td +(artifact. )Tj +3.742 0 Td +(Simple )Tj +3.464 0 Td +(CRUD )Tj +3.353 0 Td +(cases )Tj +2.797 0 Td +(can )Tj +2.075 0 Td +(be )Tj +1.575 0 Td +(con)Tj +1.6 0 Td +(v)Tj +0.488 0 Td +(eniently )Tj +-38.754 -1.44 Td +(implemented )Tj +6.226 0 Td +(with )Tj +2.448 0 Td +(a )Tj +1.058 0 Td +(boundary )Tj +4.671 0 Td +(\(with )Tj +2.726 0 Td +(injected )Tj +/TT1 1 Tf +4.004 0 Td +(EntityManager)Tj +/TT0 1 Tf +(\) )Tj +8.638 0 Td +(and )Tj +2.17 0 Td +(an )Tj +1.614 0 Td +(entity)Tj +2.298 0 Td +(. )Tj +0.836 0 Td +(Control )Tj +3.782 0 Td +(is )Tj +1.225 0 Td +(a )Tj +-41.7 -1.44 Td +(product of refactoring and)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +( in particular)Tj +16.905 0 Td +(, the \223di)Tj +3.428 0 Td +(vide and conquer\224 idea )Tj +ET + +endstream +endobj +384 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 386 0 R>>endobj +385 0 obj<>endobj +386 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(161)Tj +0 Tc 0 Tw -20.132 57.06 Td +(\()Tj +0.291 0 Td +(h)Tj +0.569 0 Td +(t)Tj +0.291 0 Td +(t)Tj +0.291 0 Td +(p)Tj +0.569 0 Td +(:)Tj +0.291 0 Td +(/)Tj +0.291 0 Td +(/)Tj +0.291 0 Td +(e)Tj +0.513 0 Td +(n)Tj +0.569 0 Td +(.)Tj +0.291 0 Td +(w)Tj +0.791 0 Td +(i)Tj +0.291 0 Td +(k)Tj +0.513 0 Td +(i)Tj +0.291 0 Td +(p)Tj +0.569 0 Td +(e)Tj +0.513 0 Td +(d)Tj +0.569 0 Td +(i)Tj +0.291 0 Td +(a)Tj +0.513 0 Td +(.)Tj +0.291 0 Td +(o)Tj +0.569 0 Td +(r)Tj +0.346 0 Td +(g)Tj +0.513 0 Td +(/)Tj +0.291 0 Td +(w)Tj +0.791 0 Td +(i)Tj +0.291 0 Td +(k)Tj +0.513 0 Td +(i)Tj +0.291 0 Td +(/)Tj +0.291 0 Td +(D)Tj +0.791 0 Td +(i)Tj +0.273 0 Td +(v)Tj +0.513 0 Td +(i)Tj +0.291 0 Td +(d)Tj +0.569 0 Td +(e)Tj +0.513 0 Td +(_)Tj +0.513 0 Td +(a)Tj +0.513 0 Td +(n)Tj +0.569 0 Td +(d)Tj +0.569 0 Td +(_)Tj +0.513 0 Td +(c)Tj +0.513 0 Td +(o)Tj +0.569 0 Td +(n)Tj +0.569 0 Td +(q)Tj +0.569 0 Td +(u)Tj +0.569 0 Td +(e)Tj +0.513 0 Td +(r)Tj +0.346 0 Td +(_)Tj +0.513 0 Td +(a)Tj +0.513 0 Td +(l)Tj +0.291 0 Td +(g)Tj +0.513 0 Td +(o)Tj +0.569 0 Td +(r)Tj +0.346 0 Td +(i)Tj +0.291 0 Td +(t)Tj +0.291 0 Td +(h)Tj +0.569 0 Td +(m)Tj +0.846 0 Td +(\))Tj +0.291 0 Td +(. )Tj +1.062 0 Td +(I)Tj +0.291 0 Td +(n )Tj +1.34 0 Td +(t)Tj +0.291 0 Td +(h)Tj +0.569 0 Td +(e )Tj +1.284 0 Td +(b)Tj +0.569 0 Td +(o)Tj +0.569 0 Td +(t)Tj +0.291 0 Td +(t)Tj +0.291 0 Td +(o)Tj +0.569 0 Td +(m)Tj +0.846 0 Td +(-)Tj +0.346 0 Td +(u)Tj +0.569 0 Td +(p )Tj +1.34 0 Td +(J)Tj +0.279 0 Td +(a)Tj +0.483 0 Td +(v)Tj +0.489 0 Td +(a )Tj +1.284 0 Td +(E)Tj +0.513 0 Td +(E )Tj +1.284 0 Td +(6 )Tj +-41.644 -1.44 Td +(approac)Tj +3.483 0 Td +(h)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +1.436 0 Td +(controls )Tj +4.076 0 Td +(are )Tj +1.963 0 Td +(created )Tj +3.797 0 Td +(after )Tj +2.519 0 Td +(a )Tj +1.13 0 Td +(few )Tj +2.186 0 Td +(iter)Tj +1.377 0 Td +(ations. )Tj +3.428 0 Td +(A )Tj +1.297 0 Td +(boundary )Tj +4.743 0 Td +(gro)Tj +1.377 0 Td +(ws )Tj +1.797 0 Td +(until )Tj +2.576 0 Td +(it )Tj +1.186 0 Td +(becomes )Tj +-38.366 -1.44 Td +(unmanageable )Tj +6.804 0 Td +(and )Tj +2.081 0 Td +(is )Tj +1.136 0 Td +(no )Tj +1.581 0 Td +(longer )Tj +3.192 0 Td +(cohesi)Tj +2.761 0 Td +(v)Tj +0.488 0 Td +(e. )Tj +1.247 0 Td +(P)Tj +0.464 0 Td +(art )Tj +1.58 0 Td +(of )Tj +1.303 0 Td +(the )Tj +1.803 0 Td +(functionality )Tj +5.861 0 Td +(is )Tj +1.136 0 Td +(factored )Tj +3.97 0 Td +(out )Tj +1.859 0 Td +(into )Tj +2.137 0 Td +(a )Tj +0.969 0 Td +(new )Tj +-40.366 -1.44 Td +(control )Tj +3.619 0 Td +(and, )Tj +2.452 0 Td +(thus, )Tj +2.619 0 Td +(the )Tj +1.896 0 Td +(next )Tj +2.396 0 Td +(la)Tj +0.748 0 Td +(y)Tj +0.482 0 Td +(er)Tj +0.759 0 Td +(. )Tj +0.803 0 Td +(All )Tj +1.785 0 Td +(controls )Tj +4.008 0 Td +(from )Tj +2.562 0 Td +(the )Tj +/TT2 1 Tf +1.896 0 Td +(storage)Tj +/TT0 1 Tf +( )Tj +4.763 0 Td +(component )Tj +5.453 0 Td +(\()Tj +/TT2 1 Tf +(HitsCache)Tj +/TT0 1 Tf +(, )Tj +/TT2 1 Tf +-36.243 -1.44 Td +(InMemoryTitleCache)Tj +/TT0 1 Tf +(, )Tj +/TT2 1 Tf +11.538 0 Td +(HttpHeaderFilter)Tj +/TT0 1 Tf +(, )Tj +10.338 0 Td +(and )Tj +2.07 0 Td +(so )Tj +1.403 0 Td +(on\) )Tj +1.848 0 Td +(were )Tj +2.569 0 Td +(created )Tj +3.625 0 Td +(during )Tj +3.237 0 Td +(a )Tj +0.958 0 Td +(refactoring )Tj +-37.588 -1.44 Td +(phase.)Tj +1.8 -2.24 Td +(A )Tj +0.999 0 Td +(control )Tj +3.389 0 Td +(nev)Tj +1.544 0 Td +(er )Tj +1.165 0 Td +(starts )Tj +2.499 0 Td +(a )Tj +0.832 0 Td +(new )Tj +2.166 0 Td +(tr)Tj +0.599 0 Td +(ansaction. )Tj +4.723 0 Td +(It )Tj +0.888 0 Td +(is )Tj +0.999 0 Td +(alw)Tj +1.538 0 Td +(a)Tj +0.47 0 Td +(ys )Tj +1.221 0 Td +(in)Tj +0.822 0 Td +(v)Tj +0.482 0 Td +(oked )Tj +2.444 0 Td +(b)Tj +0.538 0 Td +(y )Tj +0.832 0 Td +(a )Tj +0.832 0 Td +(boundary )Tj +4.445 0 Td +(within )Tj +3.056 0 Td +(an )Tj +1.388 0 Td +(acti)Tj +1.538 0 Td +(v)Tj +0.488 0 Td +(e )Tj +-41.7 -1.44 Td +(tr)Tj +0.599 0 Td +(ansaction context.)Tj +/TT3 1 Tf +12 0 0 12 57 484.4 Tm +(Entity)Tj +/TT0 1 Tf +10 0 0 10 75 462 Tm +(An )Tj +1.666 0 Td +(entity )Tj +2.833 0 Td +(is )Tj +1.11 0 Td +(just )Tj +1.944 0 Td +(an )Tj +1.499 0 Td +(object )Tj +3.111 0 Td +(with )Tj +2.333 0 Td +(persistent )Tj +4.5 0 Td +(state. )Tj +2.629 0 Td +(An )Tj +1.666 0 Td +(object )Tj +3.111 0 Td +(is )Tj +/C2_0 1 Tf +1.11 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(ned )Tj +3.667 0 Td +(as )Tj +1.332 0 Td +(follo)Tj +1.934 0 Td +(ws: )Tj +1.888 0 Td +(\223)Tj +/TT4 1 Tf +(\205In )Tj +2.721 0 Td +(the )Tj +-40.848 -1.44 Td +(domain )Tj +3.759 0 Td +(of )Tj +1.333 0 Td +(object-oriented )Tj +7.018 0 Td +(progr)Tj +2.284 0 Td +(amming)Tj +( )Tj +3.962 0 Td +(an )Tj +1.555 0 Td +(object )Tj +3.166 0 Td +(is )Tj +1.129 0 Td +(usually )Tj +3.482 0 Td +(taken )Tj +2.851 0 Td +(to )Tj +1.351 0 Td +(mean )Tj +2.888 0 Td +(a )Tj +0.999 0 Td +(compilation )Tj +5.593 0 Td +(of )Tj +-41.366 -1.44 Td +(a)Tj +0.513 0 Td +(t)Tj +0.309 0 Td +(t)Tj +0.309 0 Td +(r)Tj +0.346 0 Td +(i)Tj +0.254 0 Td +(b)Tj +0.587 0 Td +(u)Tj +0.569 0 Td +(t)Tj +0.309 0 Td +(e)Tj +0.513 0 Td +(s )Tj +1.174 0 Td +(\()Tj +0.402 0 Td +(o)Tj +0.569 0 Td +(b)Tj +0.587 0 Td +(j)Tj +0.254 0 Td +(e)Tj +0.513 0 Td +(c)Tj +0.513 0 Td +(t )Tj +1.081 0 Td +(e)Tj +0.513 0 Td +(l)Tj +0.254 0 Td +(e)Tj +0.513 0 Td +(m)Tj +0.846 0 Td +(e)Tj +0.513 0 Td +(n)Tj +0.569 0 Td +(t)Tj +0.309 0 Td +(s)Tj +0.402 0 Td +(\) )Tj +1.174 0 Td +(a)Tj +0.513 0 Td +(n)Tj +0.569 0 Td +(d )Tj +1.359 0 Td +(b)Tj +0.587 0 Td +(e)Tj +0.513 0 Td +(h)Tj +0.569 0 Td +(a)Tj +0.483 0 Td +(v)Tj +0.513 0 Td +(i)Tj +0.254 0 Td +(o)Tj +0.569 0 Td +(r)Tj +0.346 0 Td +(s )Tj +1.174 0 Td +(\()Tj +0.402 0 Td +(m)Tj +0.846 0 Td +(e)Tj +0.513 0 Td +(t)Tj +0.309 0 Td +(h)Tj +0.569 0 Td +(o)Tj +0.569 0 Td +(d)Tj +0.587 0 Td +(s )Tj +1.174 0 Td +(o)Tj +0.569 0 Td +(r )Tj +1.118 0 Td +(s)Tj +0.402 0 Td +(u)Tj +0.569 0 Td +(b)Tj +0.587 0 Td +(r)Tj +0.346 0 Td +(o)Tj +0.569 0 Td +(u)Tj +0.569 0 Td +(t)Tj +0.309 0 Td +(i)Tj +0.254 0 Td +(n)Tj +0.569 0 Td +(e)Tj +0.513 0 Td +(s)Tj +0.402 0 Td +(\) )Tj +1.174 0 Td +(e)Tj +0.513 0 Td +(n)Tj +0.569 0 Td +(c)Tj +0.513 0 Td +(a)Tj +0.513 0 Td +(p)Tj +0.587 0 Td +(s)Tj +0.402 0 Td +(u)Tj +0.569 0 Td +(l)Tj +0.254 0 Td +(a)Tj +0.513 0 Td +(t)Tj +0.309 0 Td +(i)Tj +0.254 0 Td +(n)Tj +0.569 0 Td +(g)Tj +( )Tj +1.285 0 Td +(a)Tj +0.513 0 Td +(n )Tj +-41.644 -1.44 Td +(entity\205)Tj +/TT0 1 Tf +(\224 )Tj +4.405 0 Td +(\()Tj +(http://en.wikipedia.org/wiki/Object_\(computer_science\))Tj +(\). )Tj +25.285 0 Td +(T)Tj +0.511 0 Td +(his )Tj +/C2_0 1 Tf +1.795 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(nition )Tj +4.686 0 Td +(perfectly )Tj +/C2_0 1 Tf +4.295 0 Td +<005D>Tj +/TT0 1 Tf +(ts )Tj +-40.977 -1.44 Td +(the description of an entity)Tj +11.414 0 Td +(.)Tj +-9.614 -2.24 Td +(Because )Tj +4.1 0 Td +(we )Tj +1.822 0 Td +(tend )Tj +2.434 0 Td +(to )Tj +1.378 0 Td +(use )Tj +1.989 0 Td +(the )Tj +1.878 0 Td +(name )Tj +2.933 0 Td +(\223object\224 )Tj +4.1 0 Td +(for )Tj +1.711 0 Td +(things )Tj +3.101 0 Td +(that )Tj +2.156 0 Td +(are )Tj +1.877 0 Td +(actually )Tj +3.934 0 Td +(not )Tj +1.934 0 Td +(objects, )Tj +3.879 0 Td +(for )Tj +-41.033 -1.44 Td +(example, data structures without beha)Tj +16.365 0 Td +(vior suc)Tj +3.372 0 Td +(h as DT)Tj +3.298 0 Td +(O )Tj +-23.035 -1.44 Td +(\()Tj +(http://en.wikipedia.org/wiki/Data_tr)Tj +15.55 0 Td +(ansfer_object)Tj +(\), )Tj +6.871 0 Td +(or )Tj +1.48 0 Td +(procedures )Tj +5.37 0 Td +(without )Tj +3.871 0 Td +(state, )Tj +2.814 0 Td +(suc)Tj +1.427 0 Td +(h )Tj +1.147 0 Td +(as )Tj +1.48 0 Td +(D)Tj +0.723 0 Td +(A)Tj +0.637 0 Td +(O )Tj +-41.367 -1.44 Td +(http://en.wikipedia.org/wiki/Data_access_object)Tj +(\), )Tj +21.531 0 Td +(a )Tj +0.856 0 Td +(\223ric)Tj +1.537 0 Td +(h )Tj +0.912 0 Td +(domain )Tj +3.635 0 Td +(object\224 )Tj +3.468 0 Td +(is )Tj +1.023 0 Td +(a )Tj +0.856 0 Td +(far )Tj +1.467 0 Td +(better )Tj +/C2_0 1 Tf +2.801 0 Td +<003C003D005D>Tj +/TT0 1 Tf +(nition )Tj +-38.086 -1.44 Td +(for an entity)Tj +5.077 0 Td +(. )Tj +-3.277 -2.24 Td +(An )Tj +1.614 0 Td +(entity )Tj +2.781 0 Td +(maintains )Tj +4.559 0 Td +(state, )Tj +2.614 0 Td +(w)Tj +0.76 0 Td +(hic)Tj +1.316 0 Td +(h )Tj +0.947 0 Td +(is )Tj +1.058 0 Td +(usually )Tj +3.448 0 Td +(persistent. )Tj +4.726 0 Td +(P)Tj +0.511 0 Td +(ersistent )Tj +3.892 0 Td +(entities )Tj +3.448 0 Td +(in )Tj +1.225 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.891 0 Td +(EE )Tj +1.391 0 Td +(6 )Tj +0.947 0 Td +(usually )Tj +-39.143 -1.44 Td +(rely )Tj +2.15 0 Td +(on )Tj +1.651 0 Td +(the )Tj +1.873 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.206 0 Td +(2 )Tj +/C2_0 1 Tf +1.095 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cation )Tj +5.986 0 Td +(for )Tj +1.706 0 Td +(mapping )Tj +4.318 0 Td +(their )Tj +2.484 0 Td +(state )Tj +2.484 0 Td +(to )Tj +1.373 0 Td +(a )Tj +1.039 0 Td +(database )Tj +4.318 0 Td +(table. )Tj +2.929 0 Td +(Because )Tj +4.095 0 Td +(of )Tj +1.373 0 Td +(the )Tj +-40.866 -1.44 Td +(l)Tj +0.33 0 Td +(i)Tj +0.33 0 Td +(m)Tj +0.885 0 Td +(i)Tj +ET +BT +/TT0 1 Tf +10 0 0 10 75.7358 273.2001 Tm +(t)Tj +0.33 0 Td +(a)Tj +0.552 0 Td +(t)Tj +0.33 0 Td +(i)Tj +0.33 0 Td +(o)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(s )Tj +1.193 0 Td +(i)Tj +0.33 0 Td +(n )Tj +1.36 0 Td +(C)Tj +0.719 0 Td +(o)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(t)Tj +0.33 0 Td +(a)Tj +0.552 0 Td +(i)Tj +0.33 0 Td +(n)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(r)Tj +0.33 0 Td +(-)Tj +0.385 0 Td +(M)Tj +0.941 0 Td +(a)Tj +0.552 0 Td +(n)Tj +0.608 0 Td +(a)Tj +0.552 0 Td +(g)Tj +0.552 0 Td +(e)Tj +0.552 0 Td +(d )Tj +1.36 0 Td +(P)Tj +0.563 0 Td +(e)Tj +0.552 0 Td +(r)Tj +0.385 0 Td +(s)Tj +0.441 0 Td +(i)Tj +0.33 0 Td +(s)Tj +0.441 0 Td +(t)Tj +0.33 0 Td +(e)Tj +0.552 0 Td +(n)Tj +0.608 0 Td +(c)Tj +0.552 0 Td +(e )Tj +1.304 0 Td +(\()Tj +0.33 0 Td +(C)Tj +0.719 0 Td +(M)Tj +0.941 0 Td +(P)Tj +0.608 0 Td +(\) )Tj +1.082 0 Td +(\()Tj +0.33 0 Td +(h)Tj +0.608 0 Td +(t)Tj +0.33 0 Td +(t)Tj +0.33 0 Td +(p)Tj +0.608 0 Td +(:)Tj +0.33 0 Td +(/)Tj +0.33 0 Td +(/)Tj +0.33 0 Td +(j)Tj +0.33 0 Td +(a)Tj +0.522 0 Td +(v)Tj +0.528 0 Td +(a)Tj +0.552 0 Td +(.)Tj +0.33 0 Td +(s)Tj +0.441 0 Td +(u)Tj +0.608 0 Td +(n)Tj +0.608 0 Td +(.)Tj +0.33 0 Td +(c)Tj +0.552 0 Td +(o)Tj +0.608 0 Td +(m)Tj +0.885 0 Td +(/)Tj +0.33 0 Td +(d)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(v)Tj +0.54 0 Td +(e)Tj +0.552 0 Td +(l)Tj +0.33 0 Td +(o)Tj +0.608 0 Td +(p)Tj +0.608 0 Td +(e)Tj +0.552 0 Td +(r)Tj +0.385 0 Td +(/)Tj +-41.922 -1.44 Td +(tec)Tj +1.26 0 Td +(hnicalArticles/ebeans/EJB20CMP/)Tj +(\) )Tj +15.167 0 Td +(in )Tj +1.384 0 Td +(J2EE, )Tj +2.662 0 Td +(as )Tj +1.439 0 Td +(well )Tj +2.384 0 Td +(as )Tj +1.439 0 Td +(J2EE\222)Tj +2.02 0 Td +(s )Tj +0.939 0 Td +(intrusi)Tj +2.65 0 Td +(v)Tj +0.488 0 Td +(e )Tj +1.05 0 Td +(progr)Tj +2.266 0 Td +(amming )Tj +4.05 0 Td +(model, )Tj +-39.199 -1.44 Td +(entities )Tj +3.637 0 Td +(in )Tj +1.414 0 Td +(J2EE )Tj +2.414 0 Td +(were )Tj +2.691 0 Td +(mostly )Tj +3.414 0 Td +(anemic. )Tj +3.988 0 Td +(W)Tj +0.982 0 Td +(ithout )Tj +3.082 0 Td +(support )Tj +3.804 0 Td +(for )Tj +1.747 0 Td +(inheritance )Tj +5.415 0 Td +(and )Tj +2.192 0 Td +(the )Tj +1.914 0 Td +(polymorphic )Tj +-36.698 -1.44 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(, )Tj +0.644 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.866 0 Td +(implementation )Tj +7.146 0 Td +(of )Tj +1.2 0 Td +(business )Tj +3.979 0 Td +(logic )Tj +2.478 0 Td +(inside )Tj +2.923 0 Td +(entities )Tj +3.423 0 Td +(had )Tj +1.978 0 Td +(only )Tj +2.256 0 Td +(dr)Tj +0.877 0 Td +(a)Tj +0.482 0 Td +(wbac)Tj +2.316 0 Td +(ks. )Tj +1.441 0 Td +(Y)Tj +0.482 0 Td +(ou )Tj +1.478 0 Td +(couldn\222)Tj +3.243 0 Td +(t )Tj +-41.922 -1.44 Td +(lev)Tj +1.266 0 Td +(er)Tj +0.821 0 Td +(age the full po)Tj +6.158 0 Td +(wer of objects, and y)Tj +8.986 0 Td +(our logic w)Tj +4.873 0 Td +(as dependent on the CMP infr)Tj +12.828 0 Td +(astructure. )Tj +-33.132 -2.24 Td +(In )Tj +1.302 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.968 0 Td +(EE )Tj +1.468 0 Td +(6, )Tj +1.302 0 Td +(the )Tj +1.802 0 Td +(opposite )Tj +4.137 0 Td +(is )Tj +1.135 0 Td +(best )Tj +2.191 0 Td +(pr)Tj +0.877 0 Td +(actice. )Tj +3.302 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.135 0 Td +(2 )Tj +1.024 0 Td +(entities )Tj +3.525 0 Td +(are )Tj +1.801 0 Td +(domain )Tj +3.747 0 Td +(objects )Tj +3.525 0 Td +(that )Tj +2.08 0 Td +(can )Tj +2.024 0 Td +(be )Tj +-41.144 -1.44 Td +(persisted )Tj +4.201 0 Td +(with )Tj +2.312 0 Td +(just )Tj +1.923 0 Td +(a )Tj +0.922 0 Td +(few )Tj +1.978 0 Td +(annotations )Tj +5.425 0 Td +(and )Tj +2.034 0 Td +(without )Tj +3.702 0 Td +(an)Tj +1.038 0 Td +(y )Tj +0.922 0 Td +(further )Tj +3.256 0 Td +(dependenc)Tj +4.756 0 Td +(y )Tj +0.922 0 Td +(on )Tj +1.534 0 Td +(the )Tj +1.756 0 Td +(JP)Tj +0.779 0 Td +(A )Tj +1.052 0 Td +(API. )Tj +2.127 0 Td +(T)Tj +0.511 0 Td +(he )Tj +-41.144 -1.44 Td +(persistent )Tj +4.534 0 Td +(entity )Tj +/TT2 1 Tf +2.867 0 Td +(Hit)Tj +/TT0 1 Tf +( )Tj +2.277 0 Td +(implements )Tj +5.478 0 Td +(formatting, )Tj +5.145 0 Td +(and )Tj +2.089 0 Td +(the )Tj +1.811 0 Td +(tr)Tj +0.599 0 Td +(ansient )Tj +/TT2 1 Tf +3.534 0 Td +(Post)Tj +/TT0 1 Tf +( )Tj +2.877 0 Td +(entity )Tj +2.867 0 Td +(shortens )Tj +4.034 0 Td +(titles )Tj +2.478 0 Td +(and )Tj +-40.588 -1.44 Td +(implements the )Tj +/TT2 1 Tf +(java.lang.Comparable )Tj +/TT0 1 Tf +(interface \(see Listing 85\).)Tj +/TT2 1 Tf +0 -1.79 TD +(@Entity)Tj +0 -1.79 TD +(public class Hit {)Tj +0 -1.79 TD +( //\205)Tj +ET +q +52 72 432 569 re +W n +BT +/TT2 1 Tf +10 0 0 10 57 78.4001 Tm +( public String getActionId\(\) {)Tj +ET +Q + +endstream +endobj +387 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 388 0 R>>endobj +388 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(162)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( if\(actionId == null\){)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( return null;)Tj +0 -1.79 TD +( })Tj +T* +( if\(actionId.startsWith\("/entry"\)\){)Tj +T* +( return trimTrailingSlash\(actionId\);)Tj +T* +( })Tj +0 -3.58 TD +( return actionId;)Tj +0 -1.79 TD +( })Tj +T* +( )Tj +T* +( public final String trimTrailingSlash\(String actionId\) {)Tj +T* +( if\(actionId != null && actionId.endsWith\("/"\)\){)Tj +T* +( return actionId.substring\(0, actionId.length\(\)-1\);)Tj +0 -1.79 TD +( })Tj +0 -1.79 TD +( return actionId;)Tj +T* +( })Tj +T* +(})Tj +T* +(public class Post implements Comparable{)Tj +T* +(//\205)Tj +T* +( public String getShortenedTitle\(int totalLength\){)Tj +T* +( if\(title == null\){)Tj +T* +( return null;)Tj +T* +( })Tj +T* +( int length = title.length\(\);)Tj +T* +( if\(length < totalLength\){)Tj +T* +( return title;)Tj +T* +( })Tj +T* +( String shortened = title.substring\(0, totalLength - 5\);)Tj +T* +( return shortened + "[...]";)Tj +T* +( })Tj +ET + +endstream +endobj +389 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 390 0 R>>endobj +390 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(163)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( @Override)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( public int compareTo\(Post other\) {)Tj +0 -1.79 TD +( if\(numberOfHits == other.numberOfHits\){)Tj +T* +( return 0;)Tj +T* +( })Tj +T* +( if\(numberOfHits > other.numberOfHits\){)Tj +T* +( return 1;)Tj +T* +( })Tj +T* +( return -1;)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 85: Entities with Domain Logic)Tj +1.8 -2.24 Td +(Ev)Tj +0.988 0 Td +(en )Tj +1.514 0 Td +(this )Tj +1.959 0 Td +(simplistic )Tj +4.515 0 Td +(case )Tj +/C2_0 1 Tf +2.347 0 Td +<004B0041003F00460041005D>Tj +/TT0 1 Tf +(cantly )Tj +5.627 0 Td +(impro)Tj +2.544 0 Td +(v)Tj +0.488 0 Td +(es )Tj +1.347 0 Td +(the )Tj +1.792 0 Td +(maintainability )Tj +6.905 0 Td +(and )Tj +2.07 0 Td +(decreases )Tj +4.625 0 Td +(the )Tj +1.792 0 Td +(total )Tj +-40.31 -1.44 Td +(amount )Tj +3.579 0 Td +(of )Tj +1.134 0 Td +(code. )Tj +2.616 0 Td +(T)Tj +0.511 0 Td +(he )Tj +1.356 0 Td +(entities )Tj +3.357 0 Td +(are )Tj +1.633 0 Td +(more )Tj +2.522 0 Td +(testable, )Tj +3.857 0 Td +(the )Tj +1.634 0 Td +(business )Tj +3.913 0 Td +(logic )Tj +2.412 0 Td +(is )Tj +0.967 0 Td +(encapsulated, )Tj +6.247 0 Td +(and )Tj +1.912 0 Td +(there )Tj +2.467 0 Td +(is )Tj +0.967 0 Td +(no )Tj +-41.088 -1.44 Td +(need )Tj +2.63 0 Td +(to )Tj +1.352 0 Td +(introduce )Tj +4.631 0 Td +(another )Tj +3.797 0 Td +(session )Tj +3.575 0 Td +(bean )Tj +2.63 0 Td +(\(control\) )Tj +4.131 0 Td +(to )Tj +1.352 0 Td +(implement )Tj +5.13 0 Td +(business )Tj +4.131 0 Td +(logic. )Tj +2.908 0 Td +(In )Tj +1.352 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +1.018 0 Td +(EE )Tj +1.518 0 Td +(6,)Tj +( )Tj +-41.366 -1.44 Td +(\223)Tj +0.389 0 Td +(Anemic Domain Models\224 are not only considered to be potentially \223c\ ode smell\224 )Tj +-0.389 -1.44 Td +(\()Tj +(http://en.wikipedia.org/wiki/Code_smell)Tj +(\), )Tj +18.723 0 Td +(as )Tj +1.604 0 Td +(Martin )Tj +3.549 0 Td +(F)Tj +0.455 0 Td +(o)Tj +0.544 0 Td +(wler )Tj +2.604 0 Td +(states: )Tj +3.327 0 Td +(\223)Tj +/TT2 1 Tf +(\205In )Tj +2.993 0 Td +(gener)Tj +2.377 0 Td +(al, )Tj +1.734 0 Td +(the )Tj +2.067 0 Td +(more )Tj +-39.978 -1.44 Td +(beha)Tj +2.1 0 Td +(vior )Tj +1.951 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +/C2_1 1 Tf +1.433 0 Td +<003F>Tj +/TT2 1 Tf +(nd )Tj +1.969 0 Td +(in )Tj +1.118 0 Td +(the )Tj +1.673 0 Td +(services, )Tj +3.951 0 Td +(the )Tj +1.673 0 Td +(more )Tj +2.543 0 Td +(likely )Tj +2.544 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.433 0 Td +(are )Tj +1.654 0 Td +(to )Tj +1.173 0 Td +(be )Tj +1.395 0 Td +(robbing )Tj +3.655 0 Td +(y)Tj +0.482 0 Td +(ourself )Tj +3.174 0 Td +(of )Tj +1.155 0 Td +(the )Tj +/C2_1 1 Tf +1.673 0 Td +<0024002700300027003F>Tj +/TT2 1 Tf +(ts )Tj +3.654 0 Td +(of )Tj +-41.366 -1.44 Td +(a domain model. If all y)Tj +10.152 0 Td +(our logic is in services, y)Tj +10.412 0 Td +(ou'v)Tj +1.878 0 Td +(e robbed y)Tj +4.649 0 Td +(ourself blind)Tj +/TT0 1 Tf +(\224 )Tj +-27.091 -1.44 Td +(\()Tj +(http://www)Tj +5.04 0 Td +(.martinfo)Tj +3.878 0 Td +(wler)Tj +1.815 0 Td +(.com/bliki/AnemicDomainModel.html)Tj +(\).)Tj +ET + +endstream +endobj +391 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 392 0 R>>endobj +392 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(164)Tj +ET + +endstream +endobj +393 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 395 0 R>>endobj +394 0 obj[/ICCBased 445 0 R]endobj +395 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(165)Tj +ET +/CS1 cs 0.749 0.749 0.749 scn +57 367 1 38.8 re +f +58 404.8 201 1 re +f +259 367 1 38.8 re +f +58 367 201 1 re +f +259 367 1 38.8 re +f +260 404.8 189 1 re +f +449 367 1 38.8 re +f +260 367 189 1 re +f +57 328.7 1 38.8 re +f +58 366.5 201 1 re +f +259 328.7 1 38.8 re +f +58 328.7 201 1 re +f +259 328.7 1 38.8 re +f +260 366.5 189 1 re +f +449 328.7 1 38.8 re +f +260 328.7 189 1 re +f +57 262.1 1 67.6 re +f +58 328.7 201 1 re +f +259 262.1 1 67.6 re +f +58 262.1 201 1 re +f +259 262.1 1 67.6 re +f +260 328.7 189 1 re +f +449 262.1 1 67.6 re +f +260 262.1 189 1 re +f +57 224.3 1 38.8 re +f +58 262.1 201 1 re +f +259 224.3 1 38.8 re +f +58 224.3 201 1 re +f +259 224.3 1 38.8 re +f +260 262.1 189 1 re +f +449 224.3 1 38.8 re +f +260 224.3 189 1 re +f +57 172.1 1 53.2 re +f +58 224.3 201 1 re +f +259 172.1 1 53.2 re +f +58 172.1 201 1 re +f +259 172.1 1 53.2 re +f +260 224.3 189 1 re +f +449 172.1 1 53.2 re +f +260 172.1 189 1 re +f +57 148.7 1 24.4 re +f +58 172.1 201 1 re +f +259 148.7 1 24.4 re +f +58 148.7 201 1 re +f +259 148.7 1 24.4 re +f +260 172.1 189 1 re +f +449 148.7 1 24.4 re +f +260 148.7 189 1 re +f +57 110.9 1 38.8 re +f +58 148.7 201 1 re +f +259 110.9 1 38.8 re +f +58 110.9 201 1 re +f +259 110.9 1 38.8 re +f +260 148.7 189 1 re +f +449 110.9 1 38.8 re +f +260 110.9 189 1 re +f +q +52 72 432 569 re +W n +BT +/CS0 cs 0 scn +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 630 Tm +(Some Statistics)Tj +ET +Q +BT +/CS0 cs 0 scn +/TT1 1 Tf +0 Tc 0 Tw 64 0 0 64 443.416 552.8 Tm +(9)Tj +/TT0 1 Tf +10 0 0 10 75 474.4 Tm +(In )Tj +1.232 0 Td +(this )Tj +1.899 0 Td +(c)Tj +0.482 0 Td +(hapter)Tj +2.649 0 Td +(, )Tj +0.676 0 Td +(I )Tj +0.676 0 Td +(w)Tj +0.766 0 Td +(ould )Tj +2.344 0 Td +(like )Tj +1.954 0 Td +(to )Tj +1.232 0 Td +(share )Tj +2.676 0 Td +(some )Tj +2.676 0 Td +(unrelated )Tj +4.455 0 Td +(x-r)Tj +1.154 0 Td +(a)Tj +0.47 0 Td +(y )Tj +0.898 0 Td +(services )Tj +3.787 0 Td +(statistics )Tj +3.955 0 Td +(to )Tj +1.232 0 Td +(gi)Tj +0.76 0 Td +(v)Tj +0.488 0 Td +(e )Tj +0.898 0 Td +(y)Tj +0.482 0 Td +(ou )Tj +1.51 0 Td +(an )Tj +-41.144 -1.44 Td +(idea )Tj +2.117 0 Td +(about )Tj +2.729 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.783 0 Td +(EE )Tj +1.283 0 Td +(6 )Tj +0.839 0 Td +(beha)Tj +2.082 0 Td +(vior)Tj +1.593 0 Td +(, )Tj +0.561 0 Td +(deplo)Tj +2.434 0 Td +(yment )Tj +2.95 0 Td +(requirements, )Tj +6.173 0 Td +(and )Tj +1.895 0 Td +(runtime )Tj +3.617 0 Td +(\223o)Tj +0.988 0 Td +(v)Tj +0.488 0 Td +(erhead.)Tj +3.168 0 Td +(\224 )Tj +0.727 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.783 0 Td +(EE )Tj +1.283 0 Td +(6 )Tj +0.839 0 Td +(is )Tj +0.95 0 Td +(still)Tj +( )Tj +-40.699 -1.44 Td +(judged )Tj +3.27 0 Td +(with )Tj +2.214 0 Td +(the )Tj +1.658 0 Td +(experience )Tj +5.047 0 Td +(in )Tj +1.158 0 Td +(mind )Tj +2.547 0 Td +(from )Tj +2.324 0 Td +(its )Tj +1.269 0 Td +(8-y)Tj +1.371 0 Td +(ear)Tj +1.278 0 Td +(-old )Tj +2.047 0 Td +(predecessor)Tj +5.038 0 Td +(, )Tj +0.602 0 Td +(J2EE )Tj +2.158 0 Td +(1.4. )Tj +1.992 0 Td +(In )Tj +1.158 0 Td +(pr)Tj +0.877 0 Td +(actice, )Tj +3.158 0 Td +(J)Tj +0.266 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a )Tj +0.824 0 Td +(EE)Tj +( )Tj +-41.2 -1.44 Td +(6 is ev)Tj +2.767 0 Td +(en leaner than its \223competitors.)Tj +13.394 0 Td +(\224)Tj +-12.561 -2.24 Td +( )Tj +-2.97 -2.34 Td +(S)Tj +0.561 0 Td +(i)Tj +0.339 0 Td +(z)Tj +0.561 0 Td +(e )Tj +1.308 0 Td +(o)Tj +0.617 0 Td +(f )Tj +1.086 0 Td +(t)Tj +0.339 0 Td +(h)Tj +0.617 0 Td +(e )Tj +1.308 0 Td +(d)Tj +0.617 0 Td +(e)Tj +0.561 0 Td +(p)Tj +0.617 0 Td +(l)Tj +0.339 0 Td +(o)Tj +0.605 0 Td +(y)Tj +0.561 0 Td +(m)Tj +0.894 0 Td +(e)Tj +0.561 0 Td +(n)Tj +0.617 0 Td +(t )Tj +1.086 0 Td +(a)Tj +0.561 0 Td +(r)Tj +0.382 0 Td +(c)Tj +0.543 0 Td +(h)Tj +0.617 0 Td +(i)Tj +0.321 0 Td +(v)Tj +0.549 0 Td +(e )Tj +1.308 0 Td +(\()Tj +/TT2 1 Tf +0.339 0 Td +(x)Tj +0.661 0 Td +(-)Tj +-18.5 -1.44 Td +(ray.war)Tj +/TT0 1 Tf +( = )Tj +/TT2 1 Tf +(x-ray-services)Tj +/TT0 1 Tf +(\))Tj +20.23 1.44 Td +(76 KB)Tj +-20.2 -3.83 Td +(Size of the x-r)Tj +5.934 0 Td +(a)Tj +0.47 0 Td +(y probe Roller plug-in \(REST )Tj +-6.434 -1.44 Td +(client and Roller integr)Tj +9.825 0 Td +(ation\))Tj +10.405 1.44 Td +(28 KB )Tj +-20.2 -3.78 Td +(Size of the Roller 4 deplo)Tj +10.882 0 Td +(yment ar)Tj +3.766 0 Td +(c)Tj +0.482 0 Td +(hi)Tj +0.816 0 Td +(v)Tj +0.488 0 Td +(e )Tj +-16.464 -1.44 Td +(\()Tj +/TT2 1 Tf +(roller.war)Tj +/TT0 1 Tf +(\); ev)Tj +8.101 0 Td +(erything is bundled with )Tj +-8.101 -1.44 Td +(the )Tj +1.575 0 Td +(W)Tj +/C2_0 1 Tf +0.955 0 Td +<001D002E0001005D>Tj +/TT0 1 Tf +(le; no J)Tj +5.102 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE 6 functionality )Tj +-8.578 -1.44 Td +(\(suc)Tj +1.705 0 Td +(h as JP)Tj +2.78 0 Td +(A, EJB)Tj +2.588 0 Td +(, and so\) on is used)Tj +13.157 4.32 Td +(24 MB)Tj +-20.2 -6.66 Td +(Dur)Tj +1.655 0 Td +(ation of a full deplo)Tj +8.438 0 Td +(yment on GlassF)Tj +7.151 0 Td +(ish )Tj +-17.274 -1.44 Td +(3.1 \()Tj +/TT2 1 Tf +(asadmin)Tj +/TT0 1 Tf +( from the command line\))Tj +20.23 1.44 Td +(3.2 seconds)Tj +-20.2 -3.78 Td +(Dur)Tj +1.655 0 Td +(ation of a full domain installation with )Tj +-1.685 -1.44 Td +(resour)Tj +2.655 0 Td +(ces \()Tj +/TT2 1 Tf +(asadmin)Tj +/TT0 1 Tf +( from the command )Tj +-2.655 -1.44 Td +(line\))Tj +20.23 1.44 Td +(26 seconds)Tj +-20.2 -3.78 Td +(Dur)Tj +1.655 0 Td +(ation of full Ma)Tj +6.585 0 Td +(v)Tj +0.488 0 Td +(en 3 build with Scala)Tj +11.472 0 Td +(26 seconds)Tj +-20.2 -2.34 Td +(Dur)Tj +1.655 0 Td +(ation of full Ma)Tj +6.585 0 Td +(v)Tj +0.488 0 Td +(en 3 build without )Tj +-8.758 -1.44 Td +(Scala)Tj +20.23 0.72 Td +(5 seconds)Tj +ET + +endstream +endobj +396 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 397 0 R>>endobj +397 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(166)Tj +ET +/CS1 cs 0.749 0.749 0.749 scn +57 587.8 1 53.2 re +f +58 640 201 1 re +f +259 587.8 1 53.2 re +f +58 587.8 201 1 re +f +259 587.8 1 53.2 re +f +260 640 189 1 re +f +449 587.8 1 53.2 re +f +260 587.8 189 1 re +f +57 550 1 38.8 re +f +58 587.8 201 1 re +f +259 550 1 38.8 re +f +58 550 201 1 re +f +259 550 1 38.8 re +f +260 587.8 189 1 re +f +449 550 1 38.8 re +f +260 550 189 1 re +f +57 511.7 1 38.8 re +f +58 549.5 202 1 re +f +260 511.7 1 38.8 re +f +58 511.7 202 1 re +f +260 511.7 1 38.8 re +f +261 549.5 189 1 re +f +450 511.7 1 38.8 re +f +261 511.7 189 1 re +f +57 488.3 1 24.4 re +f +58 511.7 202 1 re +f +260 488.3 1 24.4 re +f +58 488.3 202 1 re +f +260 488.3 1 24.4 re +f +261 511.7 189 1 re +f +450 488.3 1 24.4 re +f +261 488.3 189 1 re +f +57 450.5 1 38.8 re +f +58 488.3 202 1 re +f +260 450.5 1 38.8 re +f +58 450.5 202 1 re +f +260 450.5 1 38.8 re +f +261 488.3 189 1 re +f +450 450.5 1 38.8 re +f +261 450.5 189 1 re +f +57 427.1 1 24.4 re +f +58 450.5 202 1 re +f +260 427.1 1 24.4 re +f +58 427.1 202 1 re +f +260 427.1 1 24.4 re +f +261 450.5 189 1 re +f +450 427.1 1 24.4 re +f +261 427.1 189 1 re +f +57 403.7 1 24.4 re +f +58 427.1 202 1 re +f +260 403.7 1 24.4 re +f +58 403.7 202 1 re +f +260 403.7 1 24.4 re +f +261 427.1 189 1 re +f +450 403.7 1 24.4 re +f +261 403.7 189 1 re +f +57 365.9 1 38.8 re +f +58 403.7 202 1 re +f +260 365.9 1 38.8 re +f +58 365.9 202 1 re +f +260 365.9 1 38.8 re +f +261 403.7 189 1 re +f +450 365.9 1 38.8 re +f +261 365.9 189 1 re +f +57 328.1 1 38.8 re +f +58 365.9 202 1 re +f +260 328.1 1 38.8 re +f +58 328.1 202 1 re +f +260 328.1 1 38.8 re +f +261 365.9 189 1 re +f +450 328.1 1 38.8 re +f +261 328.1 189 1 re +f +57 304.7 1 24.4 re +f +58 328.1 202 1 re +f +260 304.7 1 24.4 re +f +58 304.7 202 1 re +f +260 304.7 1 24.4 re +f +261 328.1 189 1 re +f +450 304.7 1 24.4 re +f +261 304.7 189 1 re +f +57 179.7 1 126 re +f +58 304.7 202 1 re +f +260 179.7 1 126 re +f +58 179.7 202 1 re +f +260 179.7 1 126 re +f +261 304.7 189 1 re +f +450 179.7 1 126 re +f +261 179.7 189 1 re +f +57 155.3 1 24.4 re +f +58 178.7 202 1 re +f +260 155.3 1 24.4 re +f +58 155.3 202 1 re +f +260 155.3 1 24.4 re +f +261 178.7 189 1 re +f +450 155.3 1 24.4 re +f +261 155.3 189 1 re +f +57 131.9 1 24.4 re +f +58 155.3 202 1 re +f +260 131.9 1 24.4 re +f +58 131.9 202 1 re +f +260 131.9 1 24.4 re +f +261 155.3 189 1 re +f +450 131.9 1 24.4 re +f +261 131.9 189 1 re +f +57 108.5 1 24.4 re +f +58 131.9 202 1 re +f +260 108.5 1 24.4 re +f +58 108.5 202 1 re +f +260 108.5 1 24.4 re +f +261 131.9 189 1 re +f +450 108.5 1 24.4 re +f +261 108.5 189 1 re +f +57 85.1 1 24.4 re +f +58 108.5 202 1 re +f +260 85.1 1 24.4 re +f +58 85.1 202 1 re +f +260 85.1 1 24.4 re +f +261 108.5 189 1 re +f +450 85.1 1 24.4 re +f +261 85.1 189 1 re +f +BT +/CS0 cs 0 scn +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 63.3 620.6 Tm +(Max number of tr)Tj +7.49 0 Td +(ansactions per second )Tj +-7.52 -1.44 Td +(\(TX\), w)Tj +3.039 0 Td +(hic)Tj +1.316 0 Td +(h is writes/hits, on a single node, )Tj +-4.355 -1.44 Td +(without an)Tj +4.596 0 Td +(y optimization)Tj +15.634 1.44 Td +(1.400 )Tj +2.706 0 Td +(TX)Tj +-22.906 -3.78 Td +(Max number of tr)Tj +7.49 0 Td +(ansaction per da)Tj +7.084 0 Td +(y \(writes/)Tj +-14.604 -1.44 Td +(hits\))Tj +20.23 0.72 Td +(120.960.000 )Tj +5.764 0 Td +(TX)Tj +-25.964 -3.11 Td +(Number of hits in 24 hours \(w)Tj +12.933 0 Td +(as handled in )Tj +-12.963 -1.44 Td +(~10 seconds during a load test\))Tj +20.33 0.72 Td +(10.000 )Tj +/C2_0 1 Tf +<0002>Tj +/TT0 1 Tf +( 20.000)Tj +-20.3 -3.06 Td +(A)Tj +0.612 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age number of cac)Tj +7.984 0 Td +(hed referers )Tj +10.395 0 Td +(65.000)Tj +-20.3 -2.34 Td +(A)Tj +0.612 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age number of dirty referers \(60 )Tj +-1.951 -1.44 Td +(seconds\))Tj +20.33 0.72 Td +(~5000)Tj +-20.3 -3.06 Td +(A)Tj +0.612 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age number of cac)Tj +7.984 0 Td +(hed hits)Tj +10.395 0 Td +(3500)Tj +-20.3 -2.34 Td +(A)Tj +0.612 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age number of dirty hits \(60 seconds\))Tj +18.379 0 Td +(~10)Tj +-20.3 -2.34 Td +(Slo)Tj +1.322 0 Td +(west x-r)Tj +3.377 0 Td +(a)Tj +0.47 0 Td +(y response time \(o)Tj +7.824 0 Td +(v)Tj +0.488 0 Td +(er REST/)Tj +-13.511 -1.44 Td +(HTTP\))Tj +20.33 0.72 Td +(820 ms)Tj +-20.3 -3.06 Td +(A)Tj +0.612 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age x-r)Tj +2.932 0 Td +(a)Tj +0.47 0 Td +(y response time \(o)Tj +7.824 0 Td +(v)Tj +0.488 0 Td +(er REST/)Tj +-13.665 -1.44 Td +(HTTP\))Tj +20.33 0.72 Td +(1-10 ms)Tj +-20.3 -3.06 Td +(Slo)Tj +1.322 0 Td +(west method in)Tj +6.602 0 Td +(v)Tj +0.482 0 Td +(ocation)Tj +11.894 0 Td +(1254 ms)Tj +-20.3 -7.42 Td +(T)Tj +/C2_1 1 Tf +0.456 0 Td +<004700480001005D>Tj +/TT0 1 Tf +(v)Tj +2.434 0 Td +(e slo)Tj +1.989 0 Td +(west methods)Tj +/TT1 1 Tf +15.421 5.32 Td +(Hits.persistReferersCache)Tj +/TT0 1 Tf +( [1254 )Tj +-0.03 -1.2 Td +(ms])Tj +/TT1 1 Tf +0 -1.1 TD +(PersistentStore.store)Tj +0 -1.2 TD +(\(java.util.Map\))Tj +/TT0 1 Tf +( [1252 ms])Tj +/TT1 1 Tf +0 -1.1 TD +(PersistentRefererStore.getRef)Tj +0 -1.2 TD +(erers\(\))Tj +/TT0 1 Tf +( [927 ms])Tj +/TT1 1 Tf +0 -1.1 TD +(MostPopular.totalHitsAsString)Tj +0 -1.2 TD +(\(int\))Tj +/TT0 1 Tf +( [735 ms])Tj +/TT1 1 Tf +0.03 -1.1 Td +(PersistentHitStore.getMostPop)Tj +-0.03 -1.2 Td +(ularPosts\(int\))Tj +/TT0 1 Tf +( [734 ms])Tj +-20.27 -2.44 Td +(A)Tj +0.612 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age RAM consumption)Tj +18.379 0 Td +(115 MB)Tj +-20.3 -2.34 Td +(A)Tj +0.612 0 Td +(v)Tj +0.488 0 Td +(er)Tj +0.821 0 Td +(age number of threads)Tj +18.379 0 Td +(73)Tj +-20.3 -2.34 Td +(P)Tj +0.511 0 Td +(eak number of threads)Tj +19.789 0 Td +(92)Tj +-20.3 -2.34 Td +(T)Tj +0.456 0 Td +(otal number of classes \(production + test\))Tj +19.844 0 Td +(58)Tj +ET + +endstream +endobj +398 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 399 0 R>>endobj +399 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(167)Tj +ET +/CS1 cs 0.749 0.749 0.749 scn +57 616.6 1 24.4 re +f +58 640 202 1 re +f +260 616.6 1 24.4 re +f +58 616.6 202 1 re +f +260 616.6 1 24.4 re +f +261 640 189 1 re +f +450 616.6 1 24.4 re +f +261 616.6 189 1 re +f +57 541.6 1 76 re +f +58 616.6 202 1 re +f +260 541.6 1 76 re +f +58 541.6 202 1 re +f +260 541.6 1 76 re +f +261 616.6 189 1 re +f +450 541.6 1 76 re +f +261 541.6 189 1 re +f +57 503.8 1 38.8 re +f +58 541.6 202 1 re +f +260 503.8 1 38.8 re +f +58 503.8 202 1 re +f +260 503.8 1 38.8 re +f +261 541.6 189 1 re +f +450 503.8 1 38.8 re +f +261 503.8 189 1 re +f +57 466 1 38.8 re +f +58 503.8 202 1 re +f +260 466 1 38.8 re +f +58 466 202 1 re +f +260 466 1 38.8 re +f +261 503.8 189 1 re +f +450 466 1 38.8 re +f +261 466 189 1 re +f +57 442.6 1 24.4 re +f +58 466 202 1 re +f +260 442.6 1 24.4 re +f +58 442.6 202 1 re +f +260 442.6 1 24.4 re +f +261 466 189 1 re +f +450 442.6 1 24.4 re +f +261 442.6 189 1 re +f +57 404.8 1 38.8 re +f +58 442.6 202 1 re +f +260 404.8 1 38.8 re +f +58 404.8 202 1 re +f +260 404.8 1 38.8 re +f +261 442.6 189 1 re +f +450 404.8 1 38.8 re +f +261 404.8 189 1 re +f +57 367 1 38.8 re +f +58 404.8 202 1 re +f +260 367 1 38.8 re +f +58 367 202 1 re +f +260 367 1 38.8 re +f +261 404.8 189 1 re +f +450 367 1 38.8 re +f +261 367 189 1 re +f +57 329.2 1 38.8 re +f +58 367 202 1 re +f +260 329.2 1 38.8 re +f +58 329.2 202 1 re +f +260 329.2 1 38.8 re +f +261 367 189 1 re +f +450 329.2 1 38.8 re +f +261 329.2 189 1 re +f +57 305.8 1 24.4 re +f +58 329.2 202 1 re +f +260 305.8 1 24.4 re +f +58 305.8 202 1 re +f +260 305.8 1 24.4 re +f +261 329.2 189 1 re +f +450 305.8 1 24.4 re +f +261 305.8 189 1 re +f +57 282.4 1 24.4 re +f +58 305.8 202 1 re +f +260 282.4 1 24.4 re +f +58 282.4 202 1 re +f +260 282.4 1 24.4 re +f +261 305.8 189 1 re +f +450 282.4 1 24.4 re +f +261 282.4 189 1 re +f +BT +/CS0 cs 0 scn +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 63.3 620.6 Tm +(Number of interfaces)Tj +20.3 0 Td +(5)Tj +-20.3 -4.92 Td +(Interfaces)Tj +/TT1 1 Tf +20.3 2.7 Td +(XRayMonitoringMBean)Tj +-0.03 -1.32 Td +(XRayLogger)Tj +0 -1.32 TD +(ConfigurationProvider)Tj +0 -1.32 TD +(MonitoringResourceMXBean)Tj +0 -1.32 TD +(TitleCache)Tj +/C2_0 1 Tf +-20.27 -3.06 Td +<002A004D0045003A003D004A00010047003E00010034002900280001005D>Tj +/TT0 1 Tf +(les)Tj +20.3 0.72 Td +(2 \()Tj +/TT1 1 Tf +(beans.xml)Tj +/TT0 1 Tf +( and )Tj +/TT1 1 Tf +-0.03 -1.44 Td +(persistence.xml)Tj +/TT0 1 Tf +(\))Tj +-20.27 -3.06 Td +(Number of XML lines of code)Tj +20.3 0.72 Td +(14 \()Tj +/TT1 1 Tf +(persistence.xml)Tj +/TT0 1 Tf +(\) + 1 )Tj +-0.03 -1.44 Td +(\()Tj +/TT1 1 Tf +(beans.xml)Tj +/TT0 1 Tf +(\) = 15)Tj +-20.27 -2.34 Td +(T)Tj +0.456 0 Td +(otal lines of code)Tj +19.844 0 Td +(2645)Tj +-20.3 -2.34 Td +(Number of production classes \()Tj +/TT1 1 Tf +(src/main/)Tj +-0.03 -1.44 Td +(java)Tj +/TT0 1 Tf +(\))Tj +20.33 0.72 Td +(46)Tj +-20.3 -3.06 Td +(Lines of code of production classes \()Tj +/TT1 1 Tf +(src/)Tj +-0.03 -1.44 Td +(main/java)Tj +/TT0 1 Tf +(\))Tj +20.33 0.72 Td +(551)Tj +-20.3 -3.78 Td +(Estimated man-da)Tj +7.638 0 Td +(ys)Tj +12.662 0.72 Td +(3\2265 da)Tj +/C2_0 1 Tf +2.916 0 Td +<0051004B0001004C0047004C0039004400180001005D>Tj +/TT0 1 Tf +(rst \223production release\224 )Tj +-2.946 -1.44 Td +(took 1 da)Tj +4.028 0 Td +(y)Tj +-24.298 -2.34 Td +(Number of GlassF)Tj +/C2_0 1 Tf +7.762 0 Td +<0041004B0040000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +(c dependencies)Tj +12.538 0 Td +(0)Tj +-20.3 -2.34 Td +(Fun factor \(1\22610\))Tj +20.3 0 Td +(11 :-\))Tj +ET + +endstream +endobj +400 0 obj<>endobj +401 0 obj<>stream +HW]L>wcc3s|߹K_%H3Ӌo[3+a/EBgΛWٹ|"@97;}nD1(} +c n/|9wqfZ&/Aˋp /LϾ0!ŋ/-o}:/͚㯼o3K&+{_KJ-xJ+٨TJ|\ʨ\xGURBTE(JTG1j&j8P+%髍u:)Ei=M=ziii(~:@|MWy1lҫ DgRN?NLg[g[_[ȉS-<{!Eźh.^? >O]%y:=sY-? 4gsرp;Z..`1Id'k#H.iL6k$reϫ6lmBİr 6`"f\JtMT[gd*R>F]g`T rETj#7cQxZpZ+o?a y4$7|[Nskun6صe"> /܆@dǸD[{;ΝnNpeVY$ `߸! M"a +1#;Ꝣ*ZY_`Ԅ҇n%.\M\ܿ2s<ȼ24}Z]kG'{snM|n2.0V/:[=LNj6*O/ ĎϬ쟼:3ix8{\89TLlm&CAG2F۾xޤ7J)Fws=Sw8λ,`B3ÊQӿY‚'}D߂W jƊ1Rxt'Eȝ+ЎjgG NyY*5ȷ!?[2Bc0%;ҩX4bnDڸ FZZx~n}ʮ7LLE WR8±Kaʶpe6 +vϒ +dH58RҟIK7o}&HuM)F!U#uԑRAJ=hV4| ;N@D {K'_^2r:_{h艋Õ2_=x'38*KP WXh7 JJٮy»K +?Wlf1wYrf 1ˍV^a.{Ѫlhaz'E% }U6eub㦣㽪 /2GƱFAxj5%b}h:Bw\Gѱûσ$ |: +(((((U\Ut,TXSaM5TXSaM5TXSaM5mk*OuzYzC1GZeī@hvsbZX`(~YfdUFPeUFPeUFPeUFPeUeYm6?1bYe^yMR'΅dG^g/c(?wt EYOM&No65 :2{e+ݵNhG`KI&LSrB5́ΉDkW wꎸ@\7.zZ opζ:U"r RigM(usa+] +Wl1m%, lᎢtԍ _ڥoFߓnu +X9~V1+2"xmWx䈧=Aeΐr_#.e6 ~$| dzDx]BgsZ@h_+A*i d*m ?q«"JJ#eBwcN"VU. 'FLXJju&0u'v=СCܨ0[.WOjVtc ?srPPo}nN:ٿjq;Y*[݇o5N324+w1 + PS;p$SN $ tH$̛*^ϻ/}cx /݄ʟs~&(lC" $#a} 0tpr)c3Ƣ&u:ul8[=^+}#vYd3'd374A6d3A6d3A6d3A6d3A6d3A6d3A6sB&Lʹ1Xr:3H-#)K^|7ٵkz.Rhz9v.ukt0Uw2F(ȃVe}{VlZsa#6ηҩr"r…kЄĿ&,ס`BVD xҹS(4ո 0])Ol qodJ+v%Af{PxFS ⋈"DEx;ğG|L埃7 :0HۙPt*yޣ'TR᜗竁WjT#:WҶ/tES~"[&1@.cocwtn}:]:;꼸Lb  %tg#ȼO 4a~Lm +tPNËPW**J*J*J*J*JN +2 i'GAld2 w3*]෶gESCf􆚼DEM϶)aG'vSoGUFnIP,[•Ʈx긬31p[4&Fv@c]BVOJiRD%V+ +j +j +j +j +j +jʤ +jXwO "}=zq "("! ~xq=/ `0f6788<3`aCoL-bw~f,"C<:{@C\6?Ƚ j/7{pu]p`s}@޹:]A!nAӟ;Wt#;9^~<.j[?R 3z˅‰[/~-\66b7S/n~# U6?)on_x$p\.fάr~.e}s(W)RjcÝW?t +s+WZTAI .QD9E_C[i4fD"M,$4^s417pӄ{&L"ND&R|Q9YrF!>`:_kcHFqvgT^R"hM{Oa՗ 7ѥh(qT^G /7!z'͗8CKMQ>{;5C;xKmKz,\K#:йmTgW騆Mӎ4vϡgg=X{?gzLO|:Wx +dH;. +WO{HQ`}&$.řD&3Hh5DCGBq|q/&S VHL1d3AL1d3AL1dFaa䉅nbY"5eȪ롏_CĀV!b@ 20D h!b`"!bt10D c2DH߃& ]LI +Kw;- +VKQeV@T yPVs~-Yd͘]^,tlfarP6 lw1nSUl7HXl^$T;w&nu$M+K~> KkS3D}`#U),E]ِ89\ 䰃vr|q=gwf׳x/vˬw}oډǹ4v$i Ms*R(*HT &^$PBT?gfgl'NC$D=r +r +r +r ýMb GtAwC " " " "8" "  um#;Ĥ~l݂:0]vw#<Ԯ\ݼLH7gN\:?ULjuo@WcOO?%|'kB$fNHBD\u!++ë߾Vqg:X o +jt+ ܢ> +y2x͞@ym*T U^gZ:uUX7pFH@RutoB!u((h(h(h(hRoVN7 fcu2hJ'9 EUi#cUT-k7ʹ\w ?Lv}yT'HFH7Vl<\tk<$O4I~PUpUuɃ*vh(v7j$WtZCuc ɝdN9'Ds>-|ܟ掱 "uS qkvolHV' HESy5(`PnC(؈1o$S,,0-‚,,‚,,‚,,‚,,‚,,‚,,rdĖYXBA'ْ.h m]/.v߂g&S! 6(I,~6iXOPͤ*y#/؋{ T]`(+SNW;.byq +=oQ~ ؅'|"Өj>*ulH O$}g\_qwOJS~e; l2ibսd{+(~w ^%}7۔ I>"r&=MI{ecմ:{H=N V!>}X )!j[z[FdG6L/Bf0{9pxM}B?FԚÙFXptkD= 4TA]5>6F) +U+.&Uށ.,twL$#Sxhm۹ad"tnlnT9^s{W ¦ajgs<X<#Nԝ)ihTp|9{rlOU[Hl3 xfsF3'Gp߽\FY4?a٭INO=Ejܨd70@O`C@eWRi!HuwDuJèځ;m}MgJJӣ64vb]ӌkI>Yzii||) 7kDmHg?:Y.|xSw~rg/\;"].:UJKLAo|$ @G{ We0灶-[}@O (P/h܊I +$+☷( Rq0N q03b,;U;?0c,*iHs?cgs,׏8x!;ۇ_zExv_.)Ja)Nrz6JNb֩&IEI{rPqANA(:VXS`u +N):VXX{X"ƞ<8uƞ(ƞ3D~D*Q,Q=Q=Q=Q=Q=Q=Q=Q(''''=M<݉&1L4 m{ˌ.m_۵˟?|N؞} t_>|}WzG^xQo DI! WRm:N!0R!S/*])tZs"ӫ;&0)%BLLQ=:1ΆS$4 N pjS855N pjSstowjq⺊ + m35K;hUedӽIKEQo#gڳ崧^cl|gTQ mBC8p(Pӆ:Fƒ^m1net.{v|_{>xb >ɳ-^=9eg](5fϷ6bOx`T y(FgOFH;`!-61} [.-o} [@з-o}Et=R?_ǁO% +au+Q%<6y=-; 3SŸodwnW˥>abhxgUl mX&sMn}һG&{*d!"6vwu(8-T䮥"kjg+}h&iS7^-лtxAG3qI%1 +⇧w( O3K~1X>Xbݍ8^e86ǥ8.]DW0:(3MT *s snbޝA+S;eA*=VDQ{XR{%]{j~|[p:F|>6>%Ũ?}o٭#)^8H.#F# *$< +ȧzB +}Oa +siQaSRa)RaSXºuw9Y@0jF@%97^o y"Ά'Xժ!- +fR0ɔ 'W;1hr +OF?hx \kn&0rϽ%셋/~G?Y~{ r慷~ t|%: o>u>q +EOBРBSp2ۨdQQX^C$ K%\S F@l Y8άu#9x7L(MT=k K8.ӑF%ڍ 9GҰ+ }3S" C' 4` ;h @.]& +I2g.;wm׀..=v$0*zT{ +-*< +Y*d=g:28-"Du1gFX,qZ-[X"u?QHa-D)UYjmEe{+~ҹ V>q|".\!o0ew2 :Iݠp}.\:>ک8\/4鶽9k}vi-Rཹk&vQpLZDwEa"LZI0i&-¤Ea"LZI0i5Ma"Lz>gry1NVU7`*8"`*"`*yUl[EVU7`nBUp<^ZA z,e쌝#9ede̶'F)V7X_i-hVYNFH@ԭjgmk+U-71&bcRx<Ud1r/B/O x |Av +7z9(U}A4t +8E&U"#IUv/PI(pj@%*ɅJB%tYT$@%* PIJߔ$@%*ɅjtW6F騀I +S@GtT@GtT@GtT@GtT@GtT@GtT@Gť&Qat`Dn^4Jzl;Q P$?3EuW׍DϗNatSC桸󅫩T5|cYS|(Wz{f)&aYw̒"A0] \DxRwB8v]U耎h6h6h6h6h6h6hqt:ڈ=b6A p b[m6@1@1@1@1@b b KMoPR0-\` +9HKjrvFk5%)PcA͟HYsl"ֹfi_o0%q2<6jbH7g38DZ'ęN/'MӸ)1ݶl=l9 @8,Z!qY.HWj q -q\-ݔ7I_iDyyy.ĸ1.gZ<`^>A#ٵ୥RL-hI}dxvRU!g)е+Tj +f` +f` +f` +f` +f` +f` +f.Mf`*Z{upqZ>3ߙgzKFRǥOQ_)d75sKJ9-rv=uGik_8R{K^hTm׹2ͱԵ ^p'%-90L@";!V #:20A :`t0A :`]Mt{7(Lt f 0A03A03A03A03qD3A03A0% _ N%TXMѮߗқ_۸eVw_m_-dbex]i&UTK3;׾ed35Y,JYʆiؚ@! *Bx5It r#yuGQG x2qsؓ>@gP">^(Z:XͬPiPƤ/>|hK<2޻pLO]-^.;YEFQCiA9l{|k ]b&JdÉ1v_b1c' "mbjS`wv og(R5}m;c4[8:$]6nq +y󧫳6,S`9(S8)C + mp;n3Pb lt:Ngt:Ng :NgtM8ٲ󘑗q}|lj3$&6S)3E5ܭzERER;_(v}*_mݻU3s]vWK C `hA0qUfu}J3}x"[ K(+X ځgǩǢ/)ϳqU̥\o {JW36STIrp2Xfg\)J|3$q7=G[8$!cH8$!cH8$!C3$q2MES +P4Mh*@S +Tp h*@S +T\4MM) Q..pgaLރ\9tF{vV~뗤ȇڷݯ\їvi ¥{K М2MZLBZΠvm 3c5jWI$Namݖ@^xc@|H#s3 bAK]=AemfXa?I/6+ 'YI34zz^^5& GF:#h1oTP9S7(ndH硴M]o1>+ᬉJ^dinr>X*ZQeS,-6'kA֔}V܉cB\4Y.,䍢Zmk)CQ2q9>)&=I\x9l<ʼ毋X{w*DUC^$e! +h:[7)+HZ4XH4XH4XH4XH4XH4XH4XA›i7UmQ +#b%-UDrbPk[r@=Kc[?.rNq}nB$jsyMX=3;<kȐpe yXH{2*g(xH +UvoGh|%-/&곧d]19ª?C  UV# ND + H9 +3$DUM (`5d],xqy{I[RiNd FNkbRZNMTT)% Kjzj EKf ~s?]UrK7o4$o/^mJRK7.P?P^MzO S +%JGS:PI#qJ):$t" ^%&tV>QuE$<>˳ZגB*OJF[L1r9KzR$is}OQڳyM`Nm,IWS9φ} ,d)>GP>\2@f} P F$8]uڌ^wu !XX_jĩh)eTy(.[^*;{Q|u}vc&a:"H}}Q˅4 i2U`:|W2w cE/fh~'@L_\]qE*E#a]:bDf9XIL tc Orݩo}cҞ:k]޼5O2X/߿1qҴL,./>J%܅>=oh .5,^  +{ / <`/(2tQ!Np]~KSȏK\P/C2< !C2< !C26b b/ዬ[me-=k5jz˃G$Xf1"ІAu~VWs-#4+~||3cBox֏cT'^ 7}>*CU>.=;6Xsf@~g7!a|s +9 6")NEm'<Yϊ0+g Hgqx@4!XnmD+C2M%bWa89Lqt=_.&g$m2b1[bEIDEk0@J?T(H +`l +h`B0$ ƕq#D,\ʸn\ ϛT,{}{~78 + _E+f#=|1dZbTΥڵoiBOGEH2njAteUR#v+yRq2|}5eY-˄R.K,}:BY 6(ĩ(a#T :[j7% }Lڊq7z+&N&p{PY|SZeeE?;;(kR6 + ݟ9@ s=>J^betj,y9ڴ`ܼiViGaaE_à!cܖLy' esaɳAKblmsɾx_8brƕve{RE߽ޚk_o7<{JR;Gdžb0{|y+ +e[96>/Y87f6d>xi]SqEX5 T#GӸ)t. DbHD陞iN6EqC8MN(MQGqZ\_>L[2qWC%W/`$:͈&DFDԏ7_+ {%wt` +endstream +endobj +402 0 obj[404 0 R]endobj +403 0 obj<>stream +H\ˊ0F~ +-gm4!+d M6W1Sh -|"еʿ}} :]3[NvYUL鷾VCm +CwB?4>˪O5˿M^~m*?އOnRZ.Uq/ao&>o[!(Dp:Uw ٢ZgjL2ޡh-vCDfs҉2.F Y@Cº$<ޡ5`V)S0x +f3E"YOhPӧРOAM4f3Lcf13Y f3CK^ ;4Ӱn7ωűGvűhBM>f^E??KӒȓHHI$$$y jQ=P1^Igy.|LC?8 +0  +endstream +endobj +404 0 obj<>endobj +405 0 obj<>endobj +406 0 obj<>endobj +407 0 obj<>stream +HV[li>;o_b;dqbI4Isiڤ[ݰM˶͖nnyXVVEɈiiB(J}CXm%J6=vZKqrƗ~F 7_zm`ѭyʍ7]Yo|ڼ~#|"*ӗs<$}L6'Y'JzSƾQ74s$9=P'Fg.L 8pbXlM.J9[FϯIVLF >Y&*j2<#5T+pb#Z'ʵt%EgjkJw){q߬قmfE@J<ڽj5XE' 3j:)Gƥ --PGe *UHFK@ ]fLdwIJv(s⮘mfwnoOv*}*lRA)$ta /,+faږ'ezoÄeT`mUx켂]^_iP,DžOU@ 5 Z쥫WΞZYY[9 1 +_+Ԏ?"gJ_i Wt̽!ۺ;TumjMiL6E#PgzĔqӷ~-4l_A +Wпn+7zy"Gߟ "|$-`ނ}vsNOX&,m;+m/||_6z?XFxA^ R`m>^'`ᜏ)ZvR.V,A1һN$13Hm&vk]h_ +T-h@KZ*R[h@KEGGlTmDV,a}Xv:m'?;ZGvxnc9_<}sRiycnՅt,\wwl~&(cı'RL%`/8^%`/M.$#VwɎ |urmsqs7wH$ wXrظ\$XQdc,_,%r>k#] ;ߝ5.coLݙڔ(,*UƠw8)g{{{{{T@Gi:~ҏ;`09ve&f9 DO6h09iGiGA|GA|ߥT#{,gϠXQیܝ{ rCYષv)C14C14C14C14C14C14C14[$cIQÔ">٠a6v +I fm-Y})5vncnojߧ +HӇhMdiN8["Cp&]vFiIx[gWx߱Q!(JoDO o,շ*5^,̾m8z3溻3` +/ͫܡ>r+_Y& +?ؓ٤ b. cȏϟ|Ky +P;7g7,AUAɻdٕDݮ+gZ+zvr3Q`B@ɔ((_Y,'.:(@{&Y6dQS{A;A;A;A;Zc=Uӑ1´+bsN( @-       PRγ'i*h)0%Ϧ\IDG@-}G2QG_H']VY-|*KRXOFM.;5ss g&ʒhtJVRKIt%2^kWl:z3|/t}$\4mA(2^"9Y'W|/&̚Z&/eY䵤n,k-yei-YRڕlɟ1Ď4%ac i`2i Pf荏09z`a zd.P80~8p91;Z?ҮvC=wkk n7T,TN74q,3EsLmp_\He9ޞ1jv%EXEIyfry^?[x؍w6o;Zz WT'Cyn=ݲUT l~tKӯ ~'wBsp;,k#m17@T D@T DC" +>%xXŀU*f/恌Kzru~M4{hyؚ02竸IioXl`C<6x l`<6x@uPT BD[3*5K [njN+Eľ'Tw~tn3#dS\y|~si}먷+uDmsgGLfp{ei:DeZFeZFe2F!c4QuLOM{l"&lPϫG :wq~#q7Ƒ8G~o#q7o.NMD݋:.f2jd s~ yyt ;Oϝq<3=jE +-/!&z Gā8{`kk +kikX/c ba~;?b˽"\C̈́|(HCI_$h*AJPOz*S +TB=POz*SObd&skיq3OfqWɒdnmSPZlQhaMhW+ʪKtUVoH<-BH V(myex#q-ǡX<'_n1=9F?$!3'Kb{|Orz^.9` f` f` f` f`` f` z^B겔?a0O8<px8<px' ~9WW,XD'Q7'?AYa?Ĉ }ٶ/5eQ*nLLmlor,Yn7=EeE&rI-(~:\E1!g$˒~nv+r"!e*QNYGNrʺA8zXs>V.[c_$rX)}Xۇ`Â}X a>,f> -b}#UdQ4WϞh{g=iJ7Rpyi<ƢqZANzYM9EK[^#^S5 ]QW1 + +c*0cq <ɥJEW,,.;)*L 04PAJ5^}n2R-Ȑb:]L{s zE=Bo?@v%zcD1111@o ;w))W E\& q2|qZX@N @N @N @N @N @N @N 8G?$fdgm?:֥}V37wEɱR ԽGfz| + "aS 5.QanPByPB5UN`\x229!k0[2JҒ~ɜ&2ZRzk}|ֶ˧҅47 =59] ٻK҉}޸7qK~^Ww4GүǎX  +HPu8:Pp@~AM(eL PYH?"8#;j'2Hm6?gls~6nn4!@ ̳]av~kB7 3L$Ҭ 2Hy^~AI(d3"?z{#'$I3\AEI)&|q㵙yE˷~ӭwV/ &$Im|7} w>+J"s'`.cPb x%wsTi&1$fJbIL3i&1$4,@j2LChIdEjPm*C +q! +P!O<Xt9ԏS^~Ra|=.{KZgm1UXxa/,[r6UO"Eq1UM37$ [20%L)ͧ\ǎ v 8JW,{`_2JL§St*hiө`:LT0 +Z0jј`SCP^LR PJ59TjD3Á)TP>QIaR{` +bO&eR&ńbZLX k1a-&ńbŸLO oRdJaYYYԁ; F:b F: F:b,,:!&;0 +b' \s!3zG]x5Xⶅޅ;:ۍ3/u_:kw ޺䬴TҷvPjQi{}/~qm@X@{{컅rh90#pxPIB a)Y\qWzJ\+=pǔltZP3b4aHbD S.!eArPxGۇ|oC}ȷ!>ۇF?${(ZFLf,"QNL\ZNϞu?q3?)xy~>,_,jujS|5SbaXi z$".𨺎93RGZ}(/OUY#1_6m\GǕoZri)K-ђ96-Mm'p\H _ +4=4R R\S׺=—E +(A"vI[0O58qo3#x51 f5@jP36 fWC:&;4Xk) `SIuMi*$MTw0+cލR65#4W1ط?QM7PYkx$]AQPEaPEaPEaPƨjiąZE``!r웰N@ 6 @&3#f7`(XjCq`49rY!CH*Z驐 B2TH +P!*$Cd B2TH +QLI; "#!éd)*ks&ˡMEM7޼y3Vz$ NrVn|t[x+s[9woTA, \hx[`P)tةI}&Fژ:yȑ9b=SL"Yr̎9(`SG,;H=.DGvovwE)+m׍c_ct}yY޺}K_xҗ9LDٺ|!@1֑F^nבuuEYz-M=b@ҕ.5)EEzY"iS*^CE«^ױGvD]) _Q$Hq.9ܱaⲡ'IU#h 0>42:컰~+cǰOaAzNI!Xśy*K*K* LY8z UBPe,T UBPe,T 'eX2ReR5&TI|qYn\7c]f^ШK;pKU6Zx.rSU)%Qؔ6U۟=h5gYczaTM9eэcŅT0O+*h;rB?eod{*,m**AW@1&{Ԅ:҆We7vPt@v]p&rPAuqPAuqPAuqPA\;&\=tx=M t54У: iNu@4PX4P: i@WN Aڞ^_t$?³6%S&KҵV1Knf7}ّ%EF3"K~$jrz~.v3W/.8;v6b{ߤϿ>ץ!3SsO(U/ (&0 (L@a +P&0 (L@a,S5&Y Mv4h\_3_.ϷJz#yq:T(ZNգ9'*y}r,SXP\_?٪|m0k=hNL>3 00 3 00 00) sP<B\( sx.υ%FDьVGrڤ .3 Ͽu#ӯh^Rp\h9Vȱ7&p G8"q?G9"iHsD#xHsD#pis٢#[tdlё-:EG٢#[tdlё-:EG"&$H9]w)*+T=)O1eԲ2Gx#^VϜ+r-'*ɄZbShZO]Y ܕC?-?Z~Z°h;5Y>uDmv׿a_h>YrZ\x ͌ {Z'"rsA8sA8'< +VM* -ƃNLj iP0Ry? @ mcV&`e3x0pg 1pg1pL:&+=%Qb]0Rx[T$xA$ 6HA mhD$ 6H-p|g[l{6&>5/\ɨE ^ST_ߋSƐ&HU.mK'l9^nXY҃}=o?+=Iuvz]9VRa||iXvK6kz"?Mb?'sEsz@=w܁;B1Bd4˻#_ZiB؁^.Bynqla9r8>q<4w~WӺ>] ~σ;5er*#*"!pT ++tO$K-&HgՄfRtTcLo-#"LxWaBqL8&DŽ`mn^yd^X٧8881_~mdU{fۉvē'mMp[THxBBZ iy@6,ʢ}R\gZzy`9ߌ\ +bӨE$PNQMOOѐ&_(⹓Os}/.'Vt!((xB'@]Ř)0"2uQ ޤD=Z,i űJcA-(%܂[Pr ܂[K&|fDm,&G"8Dp$#HG"8Dp$#2/dlr1Ŵ]ه\C\m⵫<3 7H~D5=eA7͎[nbH1rWUT[7>n[Aow=ۙ+ӍJOXtJۥZa\nY2 V_YTk[לBel?*u{{iM[ȖYMO֋Ǎzq5|1]nh%!k [HWx_Hb'5mILJtFahbF<) C +GfL cڿ*Èp8Kצ A[!وQ RK +0B +E+*Sv);Dәh:MgL43t&Dәh:Dәh:MgsMٹ/BKy +S4|' +cv0Ř1C"Z.^vdV)mJ=PJ&K:]d4iZvx >xOlMA3a?]/N4{}A;UJUu3`] ] ] ]Lrw1'ؙ#4K$l4ӸKHף5RO/i5KU&$(aR HY,y7ဥ'\qpq\qG8~-|e(iseVbp¦-BR7JWQWd*t,Dt*T3=rӏ64tm]o?T{6moK)ϕ:r[ɻud4ɶyw3@yʢ!#p$d‘L8 G2H&Ʉ#p$d‘L8 G2ak l͔f +[Y]OG bzYQ7٨A$ <8s`5mmvx޽(G7=㫻DBt8ufaVI7iwn% G'59*+kΠ6Ѡ#UxfQUq7gq7sSEnM"7U䦊TM"7 [+cEuuut]]Auut]]AuD =|{mD??p2RfC>{LP Jh\E +CJ@P +pCz~dҫj&A7tA7   `Yej&zE1MQP.rˤD.b¸M/wj{'Rނ*a${;Q=PC賗./WZL$8 گn=f[[Zd>uDL莕K/nٽ{v>p#ORKO>+hZ~J6ffZZDN0/Ψꠣ诨(eL_Y5M̦o=Wc\h[J6(ZhszJsݖNґT:x2r(@9P~(T: rq}jJ~oEGS{ǜf sm|OJ58O**P\Q +W*P\HUPUٗd>)5PZJk@i (5MUZCDu\YJ˒:Z:Z:Z:Z:Z:j騖j(.K>"$D!4@ C2 2 z00 2 00 2 00LCLNC/LCLNC$؛N =^܂^{x~gn﬷_e>Z^>=>ٲ:ʞv Z&%wyR1&|zNda 򥹦5kc lɗ Fle/|_6Jco^(X'{[x{<(޼,\owyR<'y q@<8yxgy q$/BJ@ +o̦lchW[Wêf?kx~ceZѢd}kN+YnAG-g+fQ׋nd7nzqxf#k_@l(W61*Ob-V*zzgN:h%ձP>^}(| +߇}}(|_(<}`9I> +If(JP{q%\v ]8/8s8ss%\vPscr/.6 +ϝxݙgf3:c'qh4&)4EUU !R$x(O J%oE*(;;%}g>;sws7NyXx+f;; ; ; ; ; ; q9&A8a8^T&9-5eL+m'UBP$a g`OYWE>WXǪdPwlI1Ϯ=Ei79*:P5fON-Og&+A?9n!/&'N7}[-7Iq:l=k5{I37F@,'#żT"|a+r,,,,,“ZY[! qX{Z~OچBRc C{QΦcOvx6ІZB`LtMREMK,S//޲&οdrⅢSCijUij@DXOMzlS|Ri; *@2Ы *@2^eWO$|A%mm@[6 (Qڀ6 hkmR1&E&s||[Úz +"W]wЛ ^y+x|oB]i^%n|=縬Se]ۨ/6GJ3LI͏'Ɛ+C9Rs2J1e)=bѤV'x5/NiZ{*IC7uI}ScoqeEӝ2Xb`kvXUjj\-ep 2ZW!Wjj9Ng=5fy%;p"=HUvrIc:iS$0B $0Bxfo53r^I\aAbut˯Om"L8?CZ޼sM\f&P2Rѡ U@bXi>Au41 b\L 260: ya05;6~znKćP*'>ON' $ҸyWiR$uv2M_w|ۯZlllldM&nq?ɺ`oas;^.KϜl,Y-+WJP'qڝ  ^B|Na < .*ncBi(kmNJIH糶ҥ2omȳ O?8N-~- +|k}އ+}GOH=!{|7'53ח]7EX*^E<4'=⚔VGGpW"M:egJ~,vQƪ%s0;ݞ \9+iD񮺪ۘDoc;&z {>`/hTavl 4i؊JG0u0uv0u0u0u0u0u0up}t띲:u6qk`s8G/}kgQ>FaBcdV X 8X)۾rB`^$>C.v߃Or.W,t#bDu1Q].FT#ňbDu #WC}18$8SY-CcfE7_` s^ףÃNim"'*i4ezB`@>ذfƭlv"9]ω Rc ZMZgq0E_]."RZ+*6^coh6mS8Eٳw̞.fOEt=]dOEt=]/{;ܲwJI$ YgX/G3,z %Np_W]Ha>m.\sfĒsMI*/&R25.&P +/iYB7u!M0"Ddyw[hWJ99ygM%A֥@]+ S0pU"*g]rY8wG2L^̭TE +gE*^ߋcQc$cQrH,vz(v,;SV1I:-Aw"Nv^ d:@Tg}~f) \tY}LVuCBݘlvFI*e8'JDXe_1@!yICa +t.W0^ of?y2Y*<% ڠpAU7|Fx|V +N&+]!?!!)L1+^զ.)BZ5=4Jjn ?CimӶyd%sH;mi[lcslR>ߵ2*IAzo{&J +OUQQ6_>QK꥚ڪդDRRWT7P73_C7qp5gCGX 5'p̡m%m#,QŐN I4,j ['i`?MFk]ޒξѽ;WvQ5v00I}O46{hW~[z*%'_Ҩ3b]L9Kmh kr5>K+@ +endstream +endobj +408 0 obj<>stream +Hj0 +endstream +endobj +409 0 obj[411 0 R]endobj +410 0 obj<>stream +H\M0 >8:BdzVR6GqJ #'s{i (3 >89.dz}m~$!9Ԇ!9 +7{< +Iɇsw-)!CZÁa&YSzbY*pN"0h*. ͕K __T?ػ]UE]>\^BEJ-r5 +endstream +endobj +411 0 obj<>endobj +412 0 obj<>endobj +413 0 obj<>endobj +414 0 obj<>stream +HSKhQ=o4Rk`1hZ S!i"ئm$S %Fw" +㦤tU(.DL=źƁysιw{o$jQ6r>竍e3.űWe#D21wk;'(TӕY'2)"}f$M0ȿ2w:Ix, s\ҍyB r7H,ў"}C!nEp؆!ZQMb8AD)u"պl7fiցQK&|HZffcHqISé ~1&ڣٲ8l؅X]vϰKn,V:f/k |Uz´,)ͺ]N*JP/ +;urd(^}PgP8BPÌ0D7[GLu`NZ3oٶ-:N<*D<%ng_ӛ@XpH۶}G);:- ޞ^*ß~QO;f +򼜓H4GuUz9W^9K). 9 +nJvѩU^ƜcD["q=DaO%}.V +)K\uec#|*hOO!8Yp IbHa˟2;x$[mhB=|d5؎-̳y0887a +q?LUx#?' +endstream +endobj +415 0 obj<>stream +Hj0 +endstream +endobj +416 0 obj<>endobj +417 0 obj<>stream +HV]lY>w3g]zB!ܞ"ZOԟ/ /YyskDkcb#~.7'eƀK\X8ax^lsэJpvR)"1y+pᢑ >B%u0aꚙ?:q/UhdrƽR0Z ʺS)~o,5ٚMK=,r Ee} ]э{uѣUFǘU6>c<ףA>G(ꨔۖ:8;?J^< V'籒&2ZHǣJ4DJ {1}ܩt[r 1emhLdR޽}bFz /lx18Ŕ-g }0 Qf3z1SO~D|G~D26w4M7Ss0#Uܼ +eD]PeD]nF]Ft?DqDF+P8k> // o,q zO +LH=!øK0}s6~z\RN- {ng侁6}@K'F> LbZ Xҝd?9@nӟ7@8 t[M{of~2j7M>j m`\ +P>4P>s1f IbB)7/2v]8=-QOb_<8)|Gz%]Ј^ٞ)YP<>Ԇw6(CrS2(C2(C2(C2%^V>V/FQWWB Lb.Щ]}JWZ/|fQzasvcZF`,JcVVK+~ץ[Nŭq龜BM|a dewﲾycx_RΑYkVpdGVpdmrdG:GM|&}Ń ]l*6l<<`þ { sۃN o6JA*o4CeU +܇o=2VEXaU8`'``UVEF'b~׃M\vTg*PCv^WH#l2G8=voMD +T%(@IJ*PR +T%(Oa$W&gV]Kd"z*`;+{:RfR +T.E{螟{N HfwlTO=ٮޣc3\؏p蠣Mt]/onp<5 l!xU{|.d7ʰlaO%جnG{6l3#B iO}@4Ч55)5$IC4A[8[\ߨuCg:!>c Š *3޿ =EM[cJ[t^ԶDӑ96lڬKx#T |oń]G' 9^nq\e33;޽{׻Y;ǶiR; %MEjDThS x*qAI H#H忎V +N@a0Jʦ%QNn{"* +çޮu:&mERC<.Ct򵍰&j(e, i'6 +l-uŸF};/LM2gN=<+s Uc hγγ=<_DY Q yQ ! +$D%D(&v ~;3KLpE{HZ^tdhG3NtT舢d?Ei."ˍ LZ`-ml `[-myqINFP^!턀 n'i I9t_i^%Q/OA٭/]6Scrw+͂~\(/7*Go ] J;vT[k57uܭk๽}r%{Nu k$2  H$%su\Qblb\ĸf.́K#k'/`E#㌺S>~!֬:jVݮY5_* {ù>해_!O?[܏7h _3L ( QP J$|B'O>v 0J;{ݽOG޵#hJB3B}QI9S\շ^PNb,DQQ9,c3H(vǻY-ʏ3|?׌OidKc/˽s^Q+f"n6$z]puס/gs޳9<ó9<ó9<ó9>Oףp%BŠOX#awB$lm#+2DP55E<m7&J,-`l`\ 1^1#[cyr;$J)5nWv2X( +Z2ɂӜ°Vp`gG>E?!Sd W4 CB|LLjY9p45ڳ||%WکpRojBՉ1)hgWc 1q3SH>Iʌ[2y~(X[5C5X0Ѧ\+:TvSspNPx. mTDze 1ƈjx'ى=z؞a{"lO퉰='D؞D)yJ'qp7ىxKn*Kz^(`Fx +S<)O(Ox +S{Iz(^]Rg "O&90EgęO[njv&!!DS߹ѷ.>y%+ձz+q#iC]', +] >hp |D9' ÊOGSa5E”O%a!R򈔰p HIL`$$& 0IIL`$#N9%RMd%}SQd?#SƫAT*R +T@*PJJT*RyI2&5>o[a̘9{\ o%k U ~!ZT~su6wۼѝ<7/DÕ&ՍVsjۙf7%R)u𝓌tw24/vˣ/M}lIgC|N0_taVCNЀ*3,>w J%m)L&4 0MiL`&4 0M#N=ĥݦ\ 5&̊<>yMq6T]@`$_.GoEʢ`<- }c)X  +/*BEPŸGn%㒸u#.P 1pɦ=.t@q!'IH',VIX=\{m( >BB'̓0:$t|[l֔VP*W W.p_}ݽoFܪNл3G3+d|,S#Nȕۨ.XRe>7]d9Fڔ!#ac$(GT2r0[=`l~u^:{j7y<}_]X>Sg>Ku%w´yaHCdp$pH|B 9FL0މN4|LȂqhfU^H#A )R$BPXxDQa-cJBz6J1c|6HXwz^0ie/bq∿p/3R +zBCQOh   @cvL@=Vyj>Ox3i@' 96pwZ+ 2e$N( jRX%&>X׽A{yL7I`  IPB%@Ff LUv2SUE'=s _)z m\O5oF?OfѝGt#ؚGyd}YEX X:ygm"͋; H(vjЫjЫjЫjЫjЫjЫjU^5W#z?u :64U& ul",^TЩwZTW==t2/fwO&_T?HS/ܽhϼ0[-t&rAkVڀNWdytgxF&>';ׂiEo*s0j{=a~nN&sD-Z\E1A{9-䄾jIPmU03hX&>Zr*cūeMӢ4;RdX.9P,qC+oYV[4&<^!"MB/ +x + +x +xq߻W&CV"u{,dBp Y̆ẏ8xX!4n>>V9lOW3T3B +exI3QDy[nbc4+M'Fkj^ZE x29T-ENFhU{oNu+)UjsiraX6Q-9Gr&̿2ŽI:"rza:! kyOW09WImKj"dÚ s|DFwX +X±BS`q +,NyM 9߹pهukM8ws5@(&lܧW ҳ6ƂXp ncm,6ƂXp+ϹoM[^E' +lag +q;tAnvAnvAnvAnvq*..nWHg7iI_7A +'ls3!(^g ,gdeUNLRagu7Q3[Oi@& +H_NU=5l2QN$Jqȱȭ+gJ^~?z=m| T!3/ksT1n=⽟83bV8vN`p[Z8fYboM04k:ύ_hz?!ƟYs7zsr7i@qC@0DgMD<x_v \r!999999>&p;kl/kN^Ơw{"Pg=iTe/ .T|yxHdxZfbF*%k3Bp`$qE NFt-}Dux=q/_7*] k]\j9y~]`.|R ̄9̅v;>@E&p``=L~80^͞ ːdsR܇ΦYC/!E2 \s<%)7!9 K$>W"sXy[HbOqC4$6Jԝ7M8MktVrt)JnNz6UJE=g29䆣Q˧7ەư,׶ +c}pDj߼*7nNܳ/>]>|F&pmv?M?Gz;P"UNd@R +T]U]+s> ,Q9EOPMR2/[g|qWjO#0 e-h@Z2h@Z2b> 9 LWl8Y:Z֤Waڠ1-$KW+v[HhzF]4^}JVSL=I 6^9\g ӿ?ǒmOt? QXZ{t$Hȉ?X X X X {JHJHJ,$;2/2ZF^ 1e_vu1~v}&LSCƟf!a%>"#83 &b &]1@LJX0HX Sdss}p\ n j^0=`s{0=`ŵ`VfAZp-y -kVZ,͵?py Boij`m sn0TWG(u^bvX~JcwRIOT֏{\VQ燖(z4ޭFyL .5B)lA[قb'"lòeHA:iA? ?}|Z dXM A bcjpɬ)'_P%|aw1D&dRB:S(nƬ?DyK-A(H nSkc/wЗP\{?%w`]&ov+rRQjQ*4JFuBThvEl]vEl7"p'$MxSx;)Nv +S.ΩsjEg6|_@]hE/^d=e<ӷ lIZHj$rԞQ>ׇH!>ׇȫ!>ׇ/$TYI|PphY-5=h-{)yjK4Ūk/֮~' M+vJҪȔR_.?n[W&%)QzQP##x؉d1l 7Y0M Z͢]hEm7m:37]EEnZwIqƬb0ɺ99f娖jRdJq>UWrlV-V|r:Qh ;-1%զ;oX`sϕ v^dk4ȹL7 +AP1! ^f琝%x˿0#2AFXwԝ ;N BaݹD+LRG;y#|䝏w>Ǒ|䝏w>ΏD{H>|]M(Zj>RdY[ cHe9Q`n֛ Ԣh5ҬlU[BVR4m۟!`{,-/w]%ĻET+7fBD3ӹ, ɜj:B09+FeCXHT U bbPŀ*Go{a0Ch PJ.܈o#͆P^cQŲ*żE;TGM96oEW~q+w޹Q#W7ϟy9`=ٙ+Gg>:s(MMO4!%1ѿ={{ ۴uMESRE+Oh婚V>wek?{rpn|qmc>~{tDHTޠFBئvB8GsQX%.Y\Ìi: βK8SSgjItl VMNBʊdm年 + +sO5-ťTْLehO2Ҝ +Z?{lTS APl:_!8m[zὖqUظgg͟Y*dB! ŹYǭ!ksLNKW`|o݇?ypG~xy<%?1°9fR}9z 1cP=cP=cP=LI* a + n%I>۠rT%)*L%i*L'*$M*l&*$T8!`Ca2h8y\Ewa.Xva.LÅi0 4\\ pa.LÅipymd*4w_@ΒU[H.;tdKHMaSa<)#AϗJP4 ^ɫ-qf.+N/]s8d>[oVc[ɏ8\z!;WsS }yakI'֭-WNhkokQFޝ5rj.6LjeKedVC:7b̯D̷|+f[@oV<zZG%r` +k'CbjrBV<8yp<Q+p༘.Q{H/}S⿄#&dKT:k[9˜fvz]-׬r43蝈pv:ʩP)߾q"D>l6j^0Oo_XI]6%CT27Y߬FʘϦ3m'z?\^xxxv\s7loaS5ʟ?c]JJR*TA`V +(UPLdPOl@g +1<# <#<#<#<#<~GTyDGTyD8"NjЂV0-:OCqDc1au:FX#Vc1&Odr}\/;xX< +xmw0+Eama_YZy57 {:ow=Λg\xo^G1yge`f6!ͣU6 h13kf40m먒)&7c*i:V&XPFĸ +a1FMDEX%"(AJDP"DDP"DQ;"jNjP*رIRb"&l%&(1A JLPb%&(1cNH"L}?c ?9oQ  r XqJ(N&v]/?Joܵ{ͼ=A˱Rb;㜹巇c4)$Hؒ˙j6yMo}-n bvڪZ=Uq;KsrЮ,q+@= tvϘp`y3 }*B +e*d=֩>_zrWdF!s؆+E/1 eޞTᮠq=S0?ҫ&6 733;?gb/YDZ8MS;_(i*zJJ{#$={# q%E$T07?Q܄<;;ϫK:'w,C7U.6jg70Yip0_] 07Nc7x>-ukʽ2m{fO|L8, +X) &pS@l&|8qq@ k I`Z`Z`Z`ZL L >M"nB-"m&2TH@rFٖg$K^Dyrma "hYMa3M" +V޴exnI\zkLD_Y\qH^,k!" `צaQܠ)#f[I'Z UB-B'Љk\~NEuQ@2t| ^eAB&w{v\H 4h_*tuk.ַO>'V,I$MbWI:H%$ Q$if :@N)'ݳe819uƼ* .0z94c3Lm\Us N|a\uv>9sfylJaUxլG]>;[<}:Wq@Fر|G|:#ut RQ*Lf&%UgwH&,F=2Äw4x';ѵkK'Ԥp=JdH7eid[,Spi'mg6srFͩRp' +EMbC27QZtDgPuvGtT[UYfQ GQefiG,p( X|Ȭ&Cl=Cl=Cl=Kb!^ hsiPHy +S3k#NkD{8g +,% +,*xI-81SOɆ0JE?]&"F,:Qn9rf1أ,EIU,@ԬD5ۛlym +}+7w6mB?%wo{ńtZ_oж~2XZ&N jӚwT {kiWݽqQ#r NImzcp6XuaAQJs,}cYmUKmK݇t$3ypj@rGX 3P*:$䠂Jx &`hT4 +hO7F|x>g'DX)aJDD)aJDD),}-y8P`ퟘo7E*zOs]wEϯd]ړ3|wxq٧f"Xb`$ǩ&xgDHKL)`[)`Ѡ05wÿhxJZ>ɍAtPF>i0kدa09}0r6dQ!LVܜ7Ce;aClRh۬%7  + + JimKcNRA>q.>F>N-_^zGށ*WJ|[/MF^a.C6/:*J>c сH(rEGS%R(J O\.QJbXa8]0+9llj m>endobj +419 0 obj<>stream +H\U tMWϹx#7n^H$QPRɍwV.BzV=VUkyX&*P3 ̨*X cvYosgNX E^+^-'̞³-y1ϗ_lX`WOdjgr ;zŵi@nt\g y*(9۔ ^)8)=oޢ-;q|ߟ+1D!h77=B_]8АKdZ5hgؓL2Wt ZlAK2 +{X>8Qs,@؀ 鸁+C.Ic~B= K>z _0$TҎW*!7m 2Ȥ=!.c4Ox .HI֩&68[:}1˱8AH'$)gW[fu&V b$K +SaV`v'%KJvRijƠ-FdDFЭL5-f8qI[zS7s#غ@W c6^︪)Umzۯj6}ۥ\ݨ$1Fb]e |Y)kR.Pjl&_ +E+uc +oګQi&1UwNlS'%H؋W <6%pUC$3RuC֝zK5*.}m]N,NnqW,wIGta䱛&yx %X~YQμ?Qw;WI΅^Į[$+ rTʏADz4"b:Ω[fW_`Y;v]8sf:ݧmf?@yׁfKH@{2]B؃ۉĽ8B ;_(f7szIK !b!2^ +@ޖ,jmd/'e^&VbULT5H %U1SlPDStWO.}Ho%Z=V:av !G GG$zǎ['NsssԊZy2njQ/µ^"#X1;Ok\]'m:C=2R}.u FUPݴpu[wSUӔ#>m5<y7J BG؛岽Y˺2w/} +U)F[(d?=RiXqCտ侬j~VzUur*Si2 >y|'١ˤz҅Gq)gt%F58NN"TohIb `*wKMPMNKca@Pj}Uc(:h,Fg.EZyfL~*T$$JeyZS 1#T,ŝU8+d2PKxXc ,W`3[37GV~WN뗞?g󔆮]nW2twPcю .OxA/9.?cvA''N IGEHuhܾ + )5 +T(ԪGRtwz_G{NKx?ܽ ո &ߑwքqA"dYiئ;~=׹8o y5C 6m:!#$;*R^B%K>]U6Pn҆V+Q7i4<$ؤiEM 4sGG&#펲oyF+wyIo%M5PJ}'nFQax 6w11攛],!i8"eݙ + hTSm*h$r\W˗zj7E:-!IggJf8ʱi`;#hFzvԑOC+(!5Srv7lYSS _RKe=}DK7 ׳ bob_3O+`HiCnAvg=~^yYEǕ0KK"Bo52yp_2q'Wrt.@bw9?L|9 _ :{޽`HQ-.@.d^N`cp<)$/Y2;,@~ߒEn߿?{;OIО8}cOW܏߰%(kN\LM@FQچja=(^ϳOs7FJnNeWBbz_""C +$"'M bLEU : + әJs'S_o vtxCF)jVo ̆ `跈M!i9:}vm;K?XO3Etkqכf(@I]d`t +f$0q*hez^8G  ~QszBЫ(z~W *Bg|??^߄v,*E_tU*_74?HWƭkԟ--~GWBL_.!1}c&$;2yO"IM">xf60f<`TѓjXv}DE+C5iۈwۓ'[2u*\Ho&1?O1rc@u9i̴3ՊOvt e^s]8~]H l3zA^uQTQٶ;-nҖ7% #΂,N%ۥ pwI$J FbD * fgٖFF| Fxs$}1Ξ{wϹ3s_?[|[sxl=SW+Dkj>C;8#s;B<kNw9"UQBTz&*-Jqb0c!qG#R!fH:Bԯ ׮$s"c9.,mvYJp +0;qϱn]XE,X.xfo\gBGi w 9:~2.Mbȿ!#14O<OcX)"?b=(t~z f=`Yz3!;x E\"GkaҦ&H֗2>w"+v{(A:=uB4=_d3Sy&A72KL,zRqA!i^ g@;%_OMF [U}|(d\MvQ+|ϩ^|ԣf|B?аi{ ݎF^ok;bbH +W+?./ h(K13.PPmV0?d#?7W[-f^k9bX)bX& +" 3?FtڮWxEa?nNQقfۮ&wnbs\ t; _=xqv/=Or5d {;ukjWfJPcvoqdٱu-[aWܚv9I'ovg9eLvD$3dL<2J)JQtH + c1!B0y0d8fՌk"QNPbh$ɵk(i=j8Ly4pxEE ΂FQe(ĐO^ۖ5>6ྵw{}m%9Z\߂v{MmՒKfqȝTK7'rȐ%#ɸHHCsuluR1{M1eS.rEx.{S DNd1skBU%Ɛkٽ/աƩ2*q՘+5%Nr@ܿ:8gJlUct,3 o ڍ t͸Ǒ-Dyv#sJ g@۝I:# O:<: o>$4u[p +endstream +endobj +420 0 obj<>endobj +421 0 obj<>stream +HViTU9=p1Ç80`D 'qiDkRXMΠfYFZőb2McmtWҘ.}J;{9>߷>wYEHP_:w9xBL ZQX:ɸuU &hfhhgVhMQh/1h耎qg肮H@7tG$'WH;w + }Ґ~瑁x11C1 Ñ`reQ?X`֠%߭x{ XrVɕ3K21U(j.X*hK|eJJOY.#]OVT5%^0sב цr|HE$Y=.gr̜$jq_8v}q mIA?fa=XߣRTľArB|k`a56#|"R_""U.N:';Ne f,Hi+}H=RWt>h; e-VanV*Ke}dx>ܒI^*Kd*3:p2'D0#jl&;p'qhbJ򺬔drOgZWisϩvuk2ÜAw>rY*S'8]v=e2Q79+̅p9/(i #^&e'$DU*+?p؉p:kr{ž ۝뤑1(Ō cqS_!pKk! K3BWYW3 vJ !`3[9A@b!FO5fJeHHJL2rD|r&j:Njs4=WՇEon|&dc^qMB=n$0>)p;r;ǝj f?Yc&Vn=r-R[ZAw&=!yRV$S"#c9&匜rS(z3 U!IQC?}SYq?M}(a:fԥ]]\]']uuG=Y?.D:nRt1adz$TrE!zJSkmvGTcPUabtdATK;cӲEfMD4n԰Axzu넅v~~Oyx32j| +${(Sr?f*5 D3M $!)W{=ȡ&ݛ)gGEq_tO=ϟNsai޴8*B cWkLw?0~Ǐm0 0CbYxQMBDVJZUI)٤NFRR(jJM$alB6VZUvKFfWjs}s=Q,)HYn(.!q ɉt|bg }Ra٠+l4H9_77FZ g3b;$j)BXҫ\ X_bʼn\f2\~ +b7b&-%+DUe~GHg7ρj&Oۗg|*م~ j,Q~]3ϚwsZSYž*{IH.bqD(aa$ia?jd0H sA. rͱXWZMR(9h'ۦ-,|+":1Fr"Y`Pv6E_)0sJE-K29O8 Dι-ζxK']c{ hi6U6Uۼ*t4i!b!]+\QQJJa +7%JIَXuBowwWyj$ X&|^7 (|.?[pFHǵ^1}w}e©_*|H9aVȟ>FJuG^$XR5zHD5 +_jh~DO\AUBU$noUPG'+(uMk#0 {u;XM +}m67{%M~ F>FP'.x]rGcQ}no̎r7HSMXq#$eJ$eزXX*mxh߻.:q6lW6בЪUV:# =C_bmH-PsӕufBΎюYkEјM>!5[ԑGsdCLX͔fry tx$X."V +uzD|h)h@!3xیDxܡn u*޾:;!.Q}0[v0Eپ&Zkz_#nثR-܍?֭_u:j3$ұRJd&zmIR_ͮn'P +ZsN;?1!}},dr+<c"_8%Σ@ +uG+F|HEc-F[uw=m"rhyc@ bBF)K K1wv:rngV(DDKR.F`k4I5uG$$< u)N8Hs0z6v>9'~oĚW o&kaɠfW}R` Th (*PS$ no uH2ɣJJGI3tAF'O '.?XP&N["뗿u#{EbM㢽lM+`;/LM wWBzگg7:-tLoʢ1#)H !넛zUU5-+:(.D9ō/jg`/ +3C=5 4PۊDB?-r\0D*=0UI/ ɖ.b;?߁rF~?Y 11{SLE(]`#مK2c.LIjݸ]jy~fBJzO0ayH|L.w2VN!JpWu쪐(R~Sv)~ۧϼ9ނcSk{lg}ܤ{Z#;\:_Ɖ늾Y6jRXpnV"ᙲSϧN|ZS$EJs^H n:֬XAe|Wap$pZY- 8^X WoF-<ე cFv/v鄠!^C*fc*8ۡg=S ~2Z(D{ ډhATG Zt8lhLQ%$&I{"ZDn_iw@C&Oh\[6nC攘ܖM{,DzRWI]~O!M 4-WV^8]Yړz"ĢL+K&&*i1ASvEf7)<:Z@Q9\t83,(xSuJ-T$CHlcu!OU}¤O"ֹ!K<ڢo2Ekmge~BgG|qD*r|1:-(p#(MpGu +fnFA@XB/#ƘxuźdpFD + @\iuaEX;/ʢ/B˶w c61m9/F~ ߉4_ OǮ2~k.*e*r;mvJ*C/j +F^֖JVbf5ƕU'KqKoܓ>O0?Q/퓉31Zl\<Lmk"?ڇ#!7d6սvlhaC;.pᐌ:pm'ܱܖgem +avycdwiύZ<),Juu/SR?Q֬өL%M1vxkn7hV{@L5 +&%1uW]~eanB¹O>)%,4pX.˵ h" Ӥx`l +\g ˮB3򞡂QԈyW@4W5MCޱ̰a >SuV3I3*&:kmg> +]?Z/Lk dz?fʯTwl{~7hsn8ODуNTDZ&]d&뽼WrmHv-k %H0xQ<#Șe >рI^)Ȫ9RIÉVI^D,&F!P';(V(RXL?ӧU)"oT!O[ECe&?^nUiKMnxċSV4W+ˀԄfSPqXP `FϜ{szsfsˮ̮C+YIv\iIdíJ:I3wJӻ\3n*g4c@.{0L<e+ֻ7GsR>9 fv0\" ?5J s c8n Et9OFSX@ބd`5X4еiS=߰ZuYOlj|u=s ! hFl@ +yl,7%=yyAoSG"} ]*NZ;o̽yV@Hku͘- } `lsi'vv􎪯{_WNx罡:%J +'!pZ85#:!b!DLBEr[oݗwٺ_Y0N_ +ڂKv6q;石>?؎;qb*j* l⧔֊ ֖џUd҆1kin-꘠ЅU*-',>Iyyj +P +jNnb!ɰn_ܷ7H5EK DI"S + NFU,D;VKc5vbI*91iY4bE\ڝVRD u'F7z6m᜷Qg׶fof<{Ͷԟ2[K^:rkO^›94쬁<'PT湟*:B^;l#W J弰EV>0< $d=IՆuټZ[V UC`4#4^ỹfhf(';[j&iޤ=8w6t+^ALgw#1- ͪx":ߓ$w#wJlP_ + !sU0+Ƙ{K~[[C#odM@, (Y'I2($*Lx1=Y1HXFWT PG1jy?<8Gxw2̘JMp_bjIñ^Y+t0e#rGn5\hD"׉% !1Z|}|cszv45"vako{mF=N(<]?}}An+}燼,QIC@nH~Rp2o«x#ѻ~Zf*;Ð>ȯЮL(?zV5C,72 :'a"l\$L +K5FQ?t| '5-+)k5jVG-_YsX=>+y\n^(Y j*"1C"s\( =?icy_R%_֩f|EEq>Lu +բ! H Nōx˵13ohzT侊4+6[83G高B "@˅C,l&tI+6Ō\TE1CT߬)9kRq$T4!XN0D'ȧ vwO{dJKjǹf6ʒsIJpGv>{GǢ9͔j{ᥞom\.su}yÁ'+ό+E&[z:npb9E &,.hA4fƛb.@'bj!-ݼO>j§E#MjW~hnzzX.?!-_ω2̛3\HRmKCΟTeڇl@v"kP N5hr]dXï +'PpGnI W5A'ÝN&+,k{NK("ɞH? %*-A`}kZX-tnֳbۿ\v3v[wgꥺ _p{3M37}ɦI_-cSvxz>Ex:ܦ& ,7$PP! VA86c @ꪢU"Qb髎{ⷫu KkT yJ[zg43B(bD͕8?Xq[(5 4H8PVV_vŐ:FC oк иhl) LLj+ZrF<ׅFH0a*W3l1شB +f#/KkIǪꪩfD#mxxo v<̔H׼_oT&-h9\sɲwUu +Umïs-5-^]^m&Χ1ݎ8|ihl/;b 8RvW<"Y3HVE@gѐ*bߝ83 /RZVPlK +@KRTJvh-+eV=$*mLB궂&Dц~ז%?f2GxBy ,:m<+$g?E?(Wbz4ɽq~[ODgT+9Ċ8lZ;O7gc 0DO"WwnM.!{զJ?l,Fǂ%tudNVp>kF li l,zw@J4di/tdkF Yx +ґ%I̎\e1qD'GmtkgQ=umEx!; d9K؏78Oufc\Uxۜ1R뺧1=]6dfxK3e悾 \OG|^{ ϑMa.lጯY;੢CIysx-b[Q]LHzt+W*'j#k_p^.}Հ@7󀛾xl+UlVī3xtG= SnL_7P Il, +4"FƘ,Z)q]s#+@+Eh)BL)P24`*qݭ)WI`h\#f74I Z*.~wH)%a;${ii9)J1sG`QlЖB6fGS-{"іN$R@4-hmhlӌ~D)Sռ 8ȣ&?Z^WB0B~_tu|^ Efr0(92 ɘDENx Hy/G +S |}} v-T) ,{>u P?F &MLv-^u'VI͊3n2n" cDSw>V{y${Rsȥ1nֹDW6wd4#o}L=p=2·=z?j2J$_ά1#$MOJ/Y qXhN8*=L'\bqan< a~ٰ4PdIln9FƋyBGǚb}i_6HKn*v9K/ +/?oy9|2|.ʬ_%$lKNGp2J [s96wXC֬hYimVn5>|.+:۞lB8@&mzOuzڵ2I^phjhUQ:p $rupXF^ŕϴ+QmO>O44RY: `ˎ܌>`?8n #%̪ ̪:t7VTpt+͟ '\(]0J b6[(r)1t5ZEU^չJ+G8J;FBßlg%a)DS6IR( 1RlANA%dEieʆ ]8PxHJ}^_E4wsHG34"DQ4Lu46O$j`X!Qg +I +NHNW{E\;*>rZ3 ?W,V:>؈.xdEWq=oZKTem nŠ}ۆ bI4 =&:rB6&ǩ1N'"(.څnri.Qul!Ne'!5@w :@ZkZP]F/yi`М74o\iJ3, nO?kzs{M^LySuL'iOlgnxoff?\BF#\FEnRUxPm䁍<8l6%Ƕhucol_*~`m]/:IY}~/>].myL2V~V[!j(ҖfZ&gF^ZY^'}w-5/E[] +ߵjܼ?mxwy}AoՠŋbY|8^tmJOfks7hJfZRJo_a)KꏵHZWa|gU"0R@ ʑ_PgTSU5RyК`qw5ȴsIV$7\Rk%]3WwZ P$ +wz#+!Oxub[ Nn-"!ޅ`5`R(LmG2 +J:_[G@Ň +C+X7blcma*[QҝWx$s {L$[4\OQ^晕]%Shߤ$5 O~;F*?#wͩO eY=X[$co c7f$$kKwۙ?ڎɝ;Ź?obK(VJG16$抪X!6Q4!6+-KT1PEVvU+ViH|lbQsT_#SQ8?h#< FψQFk*.&`0FQ$sO&b9ƫZ۪8jԋHn54-eMCs֛uqN1+܃ѪYMO`0& +q#^\R?@mqdLխcҰJTt^2\T]3*\YqZ|: 6G+5<͕]x|Ź2 CG{뢶ߟhmZ&VF[1(;k*-fz:#1rĊr+7Xvi5d1v0hW+k"3$ +6qjTܥ`ď z|vmurm/tXs,n,&|p'h7Cڸ'gw8LRc&-{`ʬ@pº鋳RO fM-.H +RWg7dwNOIgۯHRϩz4p,84o,J7N@l +a&h;qMqM8fh T:p{F؊ ١ЩՐ10P0A])l5=Vk#Ց*_Ϋ5s}ھ~؎i|L# /a/&6T]-hӴViJUuMC7 mLe֭c*£ +kH7fsQ#sboP* +xT\`9,K̒1q咱5#I[YwQ@}/D:+SD?ew -%#a}NxY&mZm?Xp÷w7WEգU+z!@$dKj~Cy:3.%^gzUmCǐ{} tos35餧k4rJZbe'7-CZ$WlɌfep}ыQ,ELM1C5/P j@zYC`hm +J5')q씥0VUOKEFA)k ٟHNTm^j_:k}_G&-~I*H`PM69mOOa_s'@^6N{%pN?„ Df0 ҋo q }:;7a"ۃ/8FSȂ.˚n6ijCm1Z}V +dx7|?@qF2Sd2x,P l3İL .?-(z<g# +roZgj+M+ycة lap+w>jq[[7}y-ڿwK~Ӓd+O Adjg kڵl~fm,le%JE7 SAH&KHkֈg&ޠ!Pk^ ,60t!kkFLSePeNbq)MA.Yҩ-ƴ˚Lk6tC;2+)Fܳ֕om +g`Z"XvtXe۵S]7vl8 +!wZ-t[&6◿3=اJWv8ѓ?$hdn +9>/mLMְrNt@rI,gIGN:Zj3wL:°oX;Nb$(j*pP #Ψݸ[RJ:VQ'p,?5OX. ( _2<KQi8MnHb&)$'%O%t2J4vZ^>c/ @3ܜ#HƐn݈֧ed8#,KԐ4KcYTň +ܡ`wͰFXWIV"bղ }LA.#xQL +m+χ>A} J_m`6A7fvW!ϣ(uhc^5M\w;c;9l$%WֱAf@Au"UA['ʺ5 `MVZ"UC#YB, 8!v|=%{"W⍅ *ǯF/Ed%Y R@/L[:0Ɓ2m ˁi8]:9;4Tۅ26i!$WVu EžIc=+!J'CIiV5A@nM |$'*`Md:0d"KH[]lb j7t!W۸x)SMҐ/ec:d$J#x0%CiRb"6˶Fۄʱ>7G'%mHG3n=`{ &oީ5A'+-ۑs׀f`ϥ_\)lJOƕsFyQޜTOG0H!OhD8r4Mp.cb 6Kii6 }M_TaU-w:_^w4dE3;1F(%00 +ƒ]Gtx!+f^ʂ-YA*Max|n0G9x [O<`TI\>_;O9Mu0,:RSZLUׂelFS)½*<\h[S+X#0;j/jZTrD3T +ȿ!=5-w +f8 +#6CW7nF14/Qاؗ#pVc'fUq "׷)!xmp~&Ro%Y'V|RqE pXgwMЄ2LWOibT)ьQBlrl;Yɧ'JP0()V :iX%:Ak\K:|nSwU ''_ 'K@rT&G:IIܤ$YT# )H-o T 04n3$ 5*yҔZW8tUWA?;ĉd1:>sDc  +YҸsëp|ƱgO6}sǪZ ^6q&1ñj\>1^åH?0lJrIv!C4fsƎd J$8EdS:1AXuV~ylѯA@'H0B"*8+~\"ܕF<_Xl^lil>Μv.iz Ωi#̷,f~Rgx9%jim5{rG .r0ƲCW^F#Lj(4o/gUGV5t65;+[\!f s[nCV3xڽ]} .P~@qPfLΑ༣7i/'#|=/uDӃL!ҺRX~M0;C7<dzeۢV' +C,claq#"q쁽 +#`.k 9m2=ӮyqI!RkXXKrk[#g jWSbS #RVS5M8 Ga8:"h~aEѠ*T;.;t<}K8Xt[Ww.fDxJ.chټKL{绱h~Ђqi6w%֓ryjb|k~bvue{O牷kmߚ^} _frkoo+a2)`#eɹAi:GYb"zp_ q޸33COC`+=;;Ǵ֗'g3 ~,'ps>ɥHc+ֶ"ŵ<^w4 CzhC\z&@I=`2,ሇ?GsHVwk{}ºbkׇ4_dK"~Jqlz>\8y7BvE%бm &7h8Z'H)t`@""q?| -C؊jگ,|SP~7?὜}?ьV0,H:KkgkxPUt'')nj(]c+dMm͇X)׷*kiES6梹 ]_æ7ʂJX19BLM+-naL$[=99/(%=mh4I|9C{UR.pfY˺u퇼u/Pd%̭6&͛=XTe//ihvVN,X&^0hpaL`*` +SXfSw^0*}{['H.3ݷ Ajjjz( loI +",.ҝƵ\wQMMYt-D۾oݗi߶hRԄޫX\Gʳh"4I9 = +c\,Ruٕ|=WA7TMnz7#7ջ\dN5FZ` wFYEW-zx<(y ,&oOEY +Hf4Hj:Q多uViȞUzyNsD-YF"hmDND‘pXʪ\6*喀w6̙(|mKdڒDUĹ˼@Hx}v +bۭHRTJܨٍk?>aĤ!.0 &)=7ubqACc}{\=cYBZ؉k#1 V~wI? A{S{.aEqXQ^_P=[<k/aFL]^){C%'ӬnH9.L<= Wi:W4f"rfG}Ցs; +NG㪵6Y z 05э.+6>obGkk{;RPr\]]Fb]U\GD H.eY ʑa3(SLe2T,:ag1YO(Hǚ mHB_a tsSS$[lvSiϰyd^;\ju(EkjoUW/1 ڶo#}\-v}ʨ̳TO>B7Pv. ﰤ9ʬa[W]:^pl\{ "X-Y _pyag[.C܄&[AX25 +i88][gust$rP&WOz,r[s]qhc_'BľrHg_Odox-}:'):=˾nh@fx&cVu hhAxoQħG8ip?\D-F}V)OM'+~vV({*"x/`Gyv0v3纘]^Lp. _@˕k&:a&Voh yvg)W=C"{d<"˔쭚eRԮcDRx DM'S:O$tb#T \$ )JA4e^umv>tљ5asdWYS;n̤1 t(?1Df^Pw}R?mҤMv\f]Ȯ~(l4NMo~ a;f͆"’hIIQ4\٥|4clXDFTTJ)!d1,ό3&WP|3%;oYzפ!:>h;\`'P%Q.54|q&9 -r:I8Vlؙgd:=~Y?xO*bgKVD/#F|K28c:囡TmR9&a>jC_$/5]48Z/[5 HMrM;Lt$VO_JG$v: YJjmvWW~+f|EӫΞ8 ;F*p ~^ R2K T+]F\ ~uq{\Y{(;r`}&.KQ}ch%l$rРKI"OKFA!(BܺS24FaXƧ&,Is:J2 +6MgT ;66J0Gd 19VuNZ!vq 4mT%O߁!'`!2bkfu[Lgn 60&ú:QlXqXjfw-U[_m?_ⲑe x=Cg.l?0UZ;s{DCi]$M~yeXuUU ͭGm&sЖjރ%->;afGټ'[_pǂAx沘͌%NA3F1/'m3W4b +QN?ZN4(, Qdrґcw4.,2b2" @&ܩzs>3+E\뻖l[]{ZA;V ټNަ,xfy286j&gnS,U|% zO8S}9hK(UBvRHQQr0[%B!]ܥMA]W4~_=9` "xV݇~ +!W}lSߗ߇a8NmTCS;ZUIhSդjH똀ebՠJ@amҦRlB ٹφ&ABs=^'+f Vpr`D~FLH1Ei #BY`5 N6 ٗe"l@~BI('B 71t;H%HeKQUEQ(TSeh$zj +RM:.9(_y\>"*s89l0H6fĻvJ}|8剒Aߍ2}zr6]PӰ][j. -?oxTb(8F}hp>יn$Gfg_b$ 2݂՛vJ3D$qZ[ !'ȟ  3+$7XH֫ 5Ebn)ە8Ju~皉LU5KmJ/j)HZQ0' +k+-'$(A6bYEEu5ak09+;:4n1.GrC\._p K_쏰H66ގȇϩ"C|$Y +鲙N'M2DӭJXK9J*&ab> k%4<:Mpw9yy.g)be B,4nqɄ&/a1a/8"Aa&Qĥ P8Gqak/pys#(UIomL@ʽz<TM,bg& /ڗ5~0ZtNk4)Sj$]iSl5Lg4dZl8E e՝+'TYhqgP}N>į {X6>n*ʐ,{mnRZ_PځM2dvE)S[G݆UZ'dLiDR L~ .ȟW.V/a`:,S.uWt\ѮUV\Q-j]eˮ]%xqRd,/9UzްW<^\7_*k/&NY5cbm>&!/4}z0)1c((6WO`$=ܝJuRGW'CO;g4iVjrsڤ ߟT Tߛ]oLTdjtKDhSx_\EoQ&fA+:nӒ!īC['Qw;?lh{kRWJ4I25"TԟNhfTѴ5VfjLB6j˓:3e_@EaS>#2mޜ04w{ +ΒyU0LB.9o-Ql?(϶ };+K7i?)Ho%t ;rHRbȂփpm:UXU?bUUwH&C6`0,|_7RV:[aKU:g 9WKSREp ٓ!'qȩ@0~oT8Ŋ!AGC0I5h9zYuUqJ?Ge7ϹN(::/*#+ TpC gx9BO*z$V4'zbY!33wdZ]Ëowo Pp "q6:9'R1'aK.Ņ{hx4(LOH 9ddfBBIw"|3R뫟(P=Ͳ༖|I!L<E=00tK?i}Qra#g G瑞2ñNT RYW1h}@db } 1@bYBZt0>2/c@!;[:ݪ7ߠOUNj\e[3 sggA=֜EN5:$l__!Iӌ~ɏیdJkC?ګ>늟;N8c;/'88}|6BŒв] SU +CI ÐPFB'`4ivt(H2gW5%ڡVx1 +d4QZrd-[REu.WvM䥵no97)e*ί\ci8BؖU2wemp;V 74J SL +MIY?D0I,q(_>|Ml8j||rϲ+*kx)Pr!BdjW'#%”':Ȏ fZ)ׄ٘-UDOILqp#doKgc5$}9d|8qaUCW!|:+3352l˒278okK?;fn@,«Nn)4A\2G&:"cl6cqh0zOO=zno%{)ɻm<Wg8Ǖ;2N_)m٣{VI& +',;g.Z1jsN6c(]|L'o}NYG +J})씮'Tg1c?`ɦ3ޓ. v"M:f ݍ;8h1XY,s oa|oSk $f)KY2+{|/Je36/I2'X>lWbciXMbO4 +<+D"s}Mw9xQ9Ãfxwƺ-? s Ge \m x||Xo=;AOOgKPs't H{#z(0|KCns -΢pX؁"؄u, s*P>}\ 8 l~z)x +X@ %zusӺ7`Z<1by@j7# >M0Y~ݺ:2:m bE7TGg]EYוCW=) ݏx8(cwܣp9S~[Č2sFBRhȼedG(W>$è#>fZ W+QK@XsY +a:FC󑍼C_ y@=l^vkz5=B~Mڄ5TK_q;o"pʂW[y_ ^vJޤ[Pn?fmWE܃: {|hO $a94K^` +ZKzCEJxxVY!UhkTJL +J +£ < +QFq*Я~U` +^I+O1esuKI>1KlQ@;6=^(p +HpFMRIm\Fv+JH IEv2lS8\.eX|HH:L%،lF X%Z+>0p$Q 6>1RR)m) CԷaz~(nL(jҦ$IҬZJ@@dک{P%P8qV.Bv? ʿKx3뒤P{[ϼ7All4J.0`*A_ogga il6aޚCxg gln @΁LI `( d>HfFgvFT@ʤlFlT6JC#%Sē)>S~oSjq颱ۋإ#G qT?썻ܒzd\-"dξ*u! VHi/dVN 𒒗'pe钣+/q9}$lVsCE7a +ZoPCgʫ7o [vQxްvr7DhXm԰KY:Eh}TLyddlR*D jDU0 zhKܼGxXK0q!#)Mg"Op?3'P#F,8}?xu/ A&߿ O +endstream +endobj +422 0 obj<>endobj +423 0 obj<>stream +HV{tWswx%q# Aţ*$4g1zt;Ta˔;dA2Z5wk9{}=޿>7,Ј2=3ovjA̟REdf켩ӫAcNuu&! 9Y/U`w/*DLϟtӧNɜ7f׊dy{6坑9=I8r_w#`ߐYO #VZC(?5P`A]C}  ahhhFhhִ6@[C$ڣшAtE7<]b=[x}c0$" !xCa0QHKmn1МdF kuB'.RnI{{X.ˤi`v==K٬gI߇Jf` 6R~( +FJ6r|R53P!ܑP PAiUCR-a0K=icgJNidr Gau8,1&]lsylvK+:tcDD>xMߺWlw"FF$k)9<0\%ܟԗ6$Uc'݄,LE.fr^ޗX! *AMRH:3gY+|RKH]i)])?O.J6NZn#%ꩆ6uRU:MGu003(,6%OgW>9(wav=dOJ{fC&j0SgsM"-DJ &#";({CrrrL~'ܔBHՅOTjڣ>U'usxY\kH2~sT`g'ijʳiI}%ڌGꔊ&#|Y!pZ7 y4V_K6Uua+rA-*?w#1RZU#_&iy rP0MEfq&NHVErWI&J 8S4,mF#s-ʠX"vȳdFw+y2^w@>%"Bd"~k{%_oTWҽrޡ[L&LJ%[p)&7_MK'*w2.T|ΊU__-yYVn$Kiv%}v\v:X34s#\%g3ԉwz9ݜ('is}sŜ3fcLm}Lo+ub6GuO}.cjZ(=m7e=ᖸ"- 7|rIœ'%֯w,;ަȷv^5sgaTt](&%ϔ45q4gy:OqK gYߗYcl@~U0nmeCߠV OU:!eiI`8^~ 4rQFc +hNLLOV }lD"[%M"Y,V{+j3sbCfrfu lSD~pCINE:)9щNOC+c ++褋/I`ڥůLTJl28ZuP#~a|[S{%3<C9hJECƸr0gt<67̯KjSɕuFy5%.%8$ <zbہ-9K޹!pFM_1pFlT|<>FuAĻA)paL 9MʢRK1 neWJy/INke#$1QWtO*xVstxIAdgAy&| J 7Q7BÈTb?+&4h9fWh^LVƷHZ)Z6=dwSR A uJa(1I̗]UM0YbdJPi\rP ua+~I D|$IclP?-i|z近<`bPoQ5|БAH6|_7O݅mS|$`nf_-XK,Dvn crX":DdUEuU_kNExC+;$ppfw_׬:v^w*ĕE>W#s4w1Y"<)ᳳ-.˸P=(ccʬ>ɴ/`fxۮ/hci3亸cxoWW=\vfK[[ s&/~dOORQ)n>{9y\N'ƈqM[}xiuLĠ9BW.@ppxXq`^OQV}ouk_y S{4%}!+-g#ތRI}ڧ._,F_3LmZUg\+^m'qtq( +luflnf߶i//s?#w^mWE~m^Qȶ_.\3WyjѺ57ָj܈w(##S/IAxc>I _ 3kO{͸":z-1uX0 Pi(D jiemey^1{qCi|pnn,.ۡ&}!Q:ҁPs} 9p;MԄ6f͛XOj>}9`8덄Äx 9=96pr#pܲc{ +o~d]ŝ)j->+|}!giΊYgsszO9A4Ʋy6m_ +_X w>fU4{ mȅd\IAUbؖi?FVnF/.Q4!qi7m"X/P4aYwFqgzhxnc\ P˛V"ٷo~'NC5Fpm C#Z\np~y P¿-R|2DѦ, V6+W۹( C|U<\w# 3oDjb%T?Fjxlx ַ_pq>HD?\/z*s T ̱@y'@pF1Qebmt2:wAZcq ׺ +" +GTϊ + +yDu + +hYpc3[*xjS/Q/S?nG-h DxufU5k[G5 2c0i<6b +gr#GV=Sa=z$ōQ G11l?NG5X3aqQ5N"-ҥz0D +^d)W7SI`*2u۝O`*[(il+v`He*[&0WF8j![RYF/ ᚲԤԡ4L 5{˩@ӛW~/m 9G3h(S%Z 9}A:YZܨ;>X{0Ѥ}죘6/i{ܷ.ݸݵ-q,'6W%5J$f«1jjRrUU?:#^Ǩ=4ps'>K<7v2SIҕ`))dPT2rR i2݋#RMؽZS3=*eeYA~]lIK~eE .Aճfﶹ5| =O494HAIȴ4Oɒkz" ̲~2~ o2}S5)\iάRxoJW½kxmq[LOs]wJ,3:O(jV>$y ,w?w[hL㻨O:b04cáNk +WWEDvG8>Jͱg22VCLb <] } Pl AOC!kj}8e^*bI0YIf |h?_ޮyݢ ^Y|F?E\x={bp5<3C3V> :ߚb{uD7?~wvjo*~}] |bגT/pƇ`jCoh3ZbYj]Z5h}YZ1]+?&-nY +z 5"4gޔrvcvaaTkƩ:ž>ѣ?x k|fp-~Gݗ' !̑c )AkJW#D8yt gz.x/:2^57z~ߚ Skn޵}taóM7$^a@oimx"%i+sozb5ّnGJ +'0rAsw8p͈c34s=|btYf'G&H7rǤI^w]*xPT O趒bhJOF\ɐa3teR= u6d"F8sxJ +&T:kMHDmїꟋNFN*I6._ݨ9Vܢ*zgVwCBCWl#>swvΉ]b8 n|0hB j^#k Z +-4h%*(eiRFF1`V0VD5؏zi`giw} a6 +@A/O>jq5NPb[@_VamZBYSQe^cmPP[TpK%`A^\阂f2S=;*]^*w0׌zoŝ;ϯ[xSn,Ț##k׌ܳiW]zh%CCKz-{>/XxU9_0;uj7}hkuWYfk99>%J3=Jf]UZEvŨ'9$eS)BQPmn6t9J .Dj͋,~Kܢ Z{EmV(X&ȂrJgTYg*ְ+2ljw{wa?O}-s:_r[7oĆ9VzDJIu.[.#<|v} ;ECYܧYc0~vvpP-BIl-Sp**T35#pww>T@Qs.T /L6QQ8O{Pck80OVj6B+D&Z!++O8˓c)L \][q*`橺탧c;G A3G+{O^+ACn=3 + UQ\&cd*VSVm04nh +m3-a-#3)h'Jխ:W>_?/ږٞg^~l5xe0]vB + VJ4Z z|3q0 )ѮiEh ammS } 5<,aVKadì+EҜRlEVU"b`I] #yٹ?gdry+9$N1)KR"rqB{3-񡳽[YVSVY/! tCh0 @( ]7P+]Wru{2/>J44]_u{O|Zwb<7Z?o5=KgzdWv5O2D ?|8y1KF/.w^N>>0|zHN:1ט .\Y{NisM)>3&bY)S5)HOB3#8i]LXNuz=aw[z[xuJTӀzDc6~_ЦI^HZ Z=ugɽ99 6I/[]M^(i*#! R yDT%]I*aJ&A`r{P +_F6ѤhBp0\ NƐ06v=Mm5Ɩ+5MTyƎr>Qr^V?uwTG\Yj5X׾6o>=[S2=$b+e]빐r,m f6(|kBd2ߔ b9/̕D$dD@˸sVŒE@@:Y;)]KecY t?쮿O$ %nފ76+lD*]U.SDSlv͚t+ t+Mt)MtHhtPe`&̤22W``B4$]u@bG*ѿVt Do"f*ZMC#7^1Dwʡoo-{iScd"U/YNZ )C +؝Ӡ>UT7͟(0Fld'4?nhʥX 7PXPbU\lh`EJSY$H&.C`dW7K\ +{^e?N^#[T7IF6٨ 7܁W9+k̩jMŨ*^.oPքW@?Sdz̫6@q3ѷ=ɓ4lʤ|`~}JO2jf-51_FHʗř`byБS##' ǼIF7%nFuD!RݠV~p!ԕڪ.? #YPpr,Kv:PÍ=/A  C3Č6DŽCJOk<NB8p3jЯ&y4Ѿec<ߘْg-@ އZ2J&~7@M A$whN#0q]Mut'<5B&{~'Rip +?m/eyIݮ\q{7Ysz-$|@m-PaU;fmH-3gz'ׯX"V +DVnxq{NlK?}y +yy$ +D2> +jHh-EC^}t>;xQ* %S;)))P#\P6$rP@2`X` h)V ^ʫ +@%V${u#y%?OmS#*)Y@Θ[P-4'\ʵ?Oo- Am.4=ۗ[EUè z"Ҏ =/{/z8WPF/YǬo[~d{ }yEh4zE}H%Ffg:A?`;y㇬t9%[YdW10~` ~ Og󴁕Ŵ'zBf:.kRh g~ +ZsQ2aa~A(;G;XD @i~n ]. sE|o#:}"HuP')Lf @dFlkljqiǓHSkct6EGk]z~@KCQNzz){2ܔI:aLf]M`8=L. a: $,yW-Ft#{bxãAG1=,^( O?L(.vUs(xaJ38:Hÿ{To ky%?{X="\1SƲ]srުVoBBWDBfph8EޥTw; ?H9R~_ w-GaD@2h-t T :p]ӨK}'>B5s,>%yV,bVw/`DutF2Wje 7: ΚÎoýaT,:r0%]"Ի nE6VqGĢEtS:{˹:I\5y/u} y\T-)9U1g5cȝ7C[B +j hB!yNi=g6ԕp& qXH !յ%=N{Ҭ\Ӊ(&`P6eIfk,{VHf0[k;n%O@@\3zAzkWU4up +Hs[oXYHB…bzS{%];ғ5N-)ݎAKK(4Sֽ l߶_ K}CXţ<ȸ1h ibIK^o$!F&y93wqU+i-)e=wWkjek%K~IJu󨓨yxĦ$!6!0 3&Ng$ݺnRH&S()u3m t3 Q8wײݴ3w{ه(`S,GjfXiXZ2r9`c|2@03CF ""1ͶBӦLYE0ub-ͧ'NɩicW_o/ϔ;(ұ|0{-'"`Z7YK #w-Q>6}哱*wu"'H&Y?9H^8p}\?7 s90w +@1 ;g9k `{^ T|0}x\͗P q] +ڇ`y71052RxY(=!p ?vQG%Z?:_M?|O}L51ZQ;{y^Mw"0UFHHf4 ?#R9١鸋_:Wa--rk|cPW@gC˳5{둅藴y5EzMY~&oQF.OdoElM1Wr7eE1ʦBf_X|:mA)@B\i;AfsAb{PbIΈS#I3*-D%2j2`ҢpҘ2aBS}RFLʼjh;~ 1P#08 X2>R:,RRD@EkBy,Uj^% %| -[Ǣu?:1_3gSkVw$r^Yu&bQuR^*y*?F߱X<5fEOϥtw̮iMIlMHFZN(N;Ug*UD--V^db"Jµ?PNZqi5U_$7?ºpJ;FQd?$>>d_6ajS6mYWIër&M%R6$:ɤߚWU:߇x2կ;$b4!,OTM*Г +.PU聆~9OWbSKP4i%QS. +Ea +nPMK4b>/wHt 8e6z%,v3+ZWOW<M֣}Otoodž۴v4~*$ĖQ:F`n1F#b"?L;tȂC]JswyW~/tP:ydk5 4˱ծ-3w mWNXGU/ ;ϥ +S)9tG=?{Kֆp^g #_}Ok + v6q]Yuێ>gI=Z,_*;۔5gW{ٱJSB+8}6lp58E0V-(|08^$A>`{!>)ʾD_9t/Rq\Fp2+(M!LW ib Yb ^: +wG^M]>Co(hXԏ9t Yn;Ծ;pE%`KP xO sѯE0+:y"ig<ɑ4(BnP(Μ4`9yPc:#gN 00b0oSofi/vKں"̻A]W,3[#;Az>,}yI#ۦ&d +J]\p;^f*5aI]4@xְz+R1kl<覹7R,KusS&mõuY\{F5L< 7{H[f¢ L)T/)3i?Tȸ=d*F$.">ژs;>X\u+qwbqtm:ןؾql'}?ұ +a TASUME64i6m?ǟUT ʇSU[2mIFSAcgׁ۟Y=\}zػsZ_+/jPi+762;>D !Hqt#1 +_+煽aeyN\')V*TQ)`FBe+ea%g\TIpv̎Ҝv(ϯ^a,K%N bgshfdIqa&#)BҺrHI 4Q>)>9]EdK|W^ e1(L74ޟBYSL ) EI'ԫU|ř];iHtRҞ!GcE5v N@p^W[q'c&+#V%U!n!,nw+p@~IN>F+E[4UvGt5~D #rbɦ2d+;ŗ T0c&2fq.$֕J +($!inO6[=˵2+qDd7vmߟGur1%ݡCEdJ"IL谂P\B6ʈ* ,ȒDټ|Pe>*sd2s9@A7NIj% +,V%0 d|'}w]ʗl/_aA{w e"M}7sPg< Q'ךV/SkbH`It<_=9gp?oVo L#1| \O^O}3Œ#DowD] Ovt2Wl$#hpFJ*jTSZݘ{i1.6>ɿohiOW ZTKi7 F +}fY0̢YLk5hmP +ZV)$7 Ov}v]@/>^IHV١֏Hcy<%KvJ ZDTOIÎ:p9-D\M2)"m9 %M/XY TG7j^!Lu+֦\ө/P[90hPj\K: ')Qo@3ICI&F4\Η+j," lmRc\ .W&|8 5i4[KsJ::}9DXDMl΢Ffy/ 4[qiչt3^Xᱰx8Ε]`"62N ÌТ1vBc춃hVdݩ0hElv;S'0>,ȲDhq5RtAFamP58!T7 Uuhy r W7E&?>{43 Z͚x5qlo5њ8?a)sZbM5aF7QP23Z( +1ՒSu2b[bwFU o"Zث^n +>x =cGA©ɱ\tTgq+-BuBkvw8~gѳ'im>1r“d] C $ +'awh z(ߥLk>aF]r.^uqTfc\# 3oWӻ/t +9l%[JDz|%=g @?4gpSs Fa": s; l4~s'ܝ[]7C:HkЀO߀_wEM-( p#ګpc*1z$β!O/e_%2 5{h J[UiA/Rˑe;_}JU%5.p( ÒSǍZmގcLT*(6XVvKBO_ u.83 r@&QϘ )[ۨ"~oY׈uEfqKsac8Ee}z>;>7r/5,]!iWE4)qk1(lh+ut*A[S:M*ݦ*2@+T$Ξ٦w{>5WYS'\g<h%bvֹ*ڵlxaeGuyKdm_羖d};++I>`ha<) Z5{y5ZP +bmMܖ9?v^pޢź%ճj~YO˳G4͘AF3\LyM԰6EKw"ӗwb#{UDMu%#4}A>}#A1 >Y DŽUaVpPLzެt,.=P +P E_gqzHw3"ɔh&I8ICMN9gl۶ `8 gb*r{0ەFQjRmN@OMI3@ +Ġ +T)O.'O|no=6.13n̕w/e戄=ndQai6cX9܄&!QJAnؗ$Ml0$>Hf 󐎑.9}Hj=re ,LMc>: Pt@%Iv2~lgmjkXBVHFpeg@SPˣ?u7y45'tkWww~sꡅz,DY.2.` X7`̦d&r~&e监5LxK h^`5>ӆXr> ypMA<*R8D$}dسUvu K; *llm+sĄ Nb7@|Xdq+T̸KVN㫦ʨ`Ɨ_օj}.T}o,6Rx7!5̑XgIs. +=t5" 7ƿ=zyb?b?i?ş +__/nؿJ7U|";m76E6IԟQ{Ww_Lfa%;(><Mo9h,yGDj12 +"2+H{Q/:, cBڤBڤ2zmafGuNV}Uk?`&k[26x$o?+m2i` ?=MQI}Ya7i.dR$!>Q]6W3DNCW?5`Q@Pf?bCLTi\<‰G?{6nؓO 2ySػ{KY| +x )߆{  FoD\2MFdԀX2\MNN@r > ɂۚinm9V{ 7Œf|kQf|Ba0bڄ҈64Мɰ\VFB;@ԀӅҹee%PJ>LDgAv/{gkecWx kGgbT.vX6KLN0aCiU;Pzx>AzU!q͟Ǘ-v$k.r4M7ԑ/lN1zq-FgCSwЭpynLS>>Qno6*h64܊O73qÊՈMPQ#ۨV!oĘXmvTC=X: l&ՁR؞Uo!.dfEu1:DD-{i iVsq4b+?)Cm\r.3!Km(° l`k!ʏQTؔjHEVnw+.fUknhoXR%48/eǃ u~anGZg.?Ў"'(ow!I_t Jyx>Gwt.v v9 +?N6̉d*ijwf9^{_3k]w<;`ϵ 56!@`Z*M"JUJ ELU%M;RB۠&>PS*B*?ZڊR[)+Gm9wfWmsϹ{̝h$ +6@?[Kǐu=&Ohh4H6WD|#~08 tMDŐO\dȗ@cNحbb-Y00nƳ{u Dc5}݁zag;|sғ;Zٽ# p2wj wں䑕lhw6q_=+Skl q:pypPDꃽ8eP i(D +HKf3q#ݑYudՑ͑Ϋ 2 J64]ˆsgF/.ڤAT}(,{5ygԤN]+^Oطy>lSHڐd(eB!dl1H +Iw0Fl[sb釯SH?T}cVFV8bڸ_vCyOn& /nu-{4bYcw+rzˋP]Cui$ߦAu<1X 5fhFP/Exd۱d r +l?!/ppw:!uǤuJ!NyNOw^H/d.t~}/ElʗqP9/eiGG6Ѫ٪0|[*u@&-acwϦr ~a#F$Q1cY[eOvDRvV3C`_LMrCv=Rkk<ۜKHt)5cl*]q4%1ct/L>M{{WJdl>iB/ [}}ְMFkggg﬘xWK,eKln9 2kfG Yi|lٱ];ο| lPLӕu+ H:meBUh6_ZXNB6]3ʴi( 1JҒ}.-?}}>ya`^oXO$SM$ɿ/!qω@-]᜞dI1coDhI&}^6*jfC;&$iP ez-[5p֦jZsla#h0}='6áb7vnyǗ-w_.+=hExНQph9l03żhމ"Foԍ'18~ø}B|ⶥ,{6@еE&٫x +q2I^u]?;bOOX@nqm7y-rAU +`[MH$oSl6MnUkʵr X=$t2MNYGד#Q|\^~ C3ς=MN·߆ǿ]>>+}Gb:!t>qPUyjNMg x>?S r@ ((XEX j.lO/gxpg\=Ѵn;BV%'FI͕QUL@AG(p-g8eAl``=BOE:5KYOA->u񁪮'KKU5jx@S~i[IB)IMd|1dTCwuOŕx.b:x]Y +31)5~rXњҾɨ譄\@8P}ky +B\:MK;:94O^.L<3L0+<#KFv}3G\HmUGVع$b _za+m S)4yX`uЖq}{5DdF|H吙Na +9\3Ǥljӫ`ɣQ+TwyrLZ X7ǐ܄oPaOP)'' @7"ZSzG?"-~Euvl;tU5}ID4ft\Cm.qL\^.ƚ9d$/Ћ +4-(g!nɦ`(OnMA +߃ "JbFH3@_p[X t pk/?*/@+w?zNּ#ъ7o8#Ns^Iڶ )xMm0[Qu-w |iMǸ"IuS5A +թױ\  +cX9.z9ѫ^)W fTRo*rh uY'2bqqRr(;k`@*POY86^[jlƥ!i *b'mzeCk55BTʫjYX=-\'M&pE&OPBM jT0*CaF<j`pq)Xiסe6Kub0Mg:ؚVv +K>u̹;6xF}IZ-iK'=_J&dz)-CBknmI*-rgCE1wywnh`A$,rm0 !:i8C~9>]_edo&ϔ$0QdBPlcǤ\4T{ԝҦ"w5wkwwOnBu,/* Pi7{% +%$LjjEELb|rbrWz*_5+TԖbe|ɒŧ2 +6!X q#"P7lugO?5HDP⺬oQOuCW<>s)ٕ=zuLWWM| +$SH|ִi\RtkK/|jxЅ5ш&7r&rdLƍ /h],l*ؤQVq>/~z4^ \kK?d1c>pn;KձbO֮~Ρ"մZcvA?rkuorw%S^hk˶M m% wQ.246q | x,o։G? YɤR9$"9)r e~(s`:2Z LfN몏3{3;`gf>\vRI쒆Tha~E-` +JS'TMAQ + Ƥ|TPENET-M*v쮱;ݼy3{{1МC?TQ{p:\AS2 䐆X„/T7KU1]*%oUէ0=lϴig61Te%W8q3ݣ֮IuZﵧ)69]HxTEsl4Q!% EΆ.)|$aO92/\|^Z\F8qGuGv#95NYh^2՛h-+'gzmu, ~Q{Q +Y)I3 WU ˟^p@~#KL~hǽaA$W.t+O}e`dǽKO)g3;xVRx|:'UP6oa"/*S0s*,^,j=Ԋɕ˱AC(Ip_+=]W_^]yvS~uݛtm)@DQ|iWTB8wU\%q$@0f [T7*5GA8 !@AA(squ]ӢQ> p4wI`mqu FU"ʺH a0)((kx7hWHoFZ1Mw(RXbrVL ƖK$[9>{7ݖ;#0&\ v&l. o][8R߸0eԷ+U}hSߺ>E?Ϭ|[Էrһ^}X+-Ju4Ɓ@/>ur;Jvylק~@.S;;xoMJlb~pf dJlany}sI7iEH@fMٛ(!yNwSd9xzmdh2z2T&WzF,9O429 öU:>{)PDCBKNI-y_jW3"b/6;b1Zi/M$cG+>eɁ&N%F2X53#`!< 0Q+Kb Gj%s+s)5#/cpJnl2/!!*F, kŰ,1~k,1k +`Xke ,9ҁg;pGGmNbPd0D*t{0*K)ڕڛ:H]HR( iVuC+]>z`v$b !Dѐ$ˋPY^vI`x`Эޙ8eL7[v6T-rq~!j:Aή.ײm6EiuՅ[geu|wtff>PQ0XV +2h^bC/lqٌAv q5٠}[IH BC*9ȧl!?%qt%ᠮ#¨{=T-B8Σ =J"%IYO6WE:bh;y wbVXкQQ|T + O6a?O>!we.ܫ_B:O|6eK(%ЖmV>%'>uPxئ+~{z~K`;I&uh Y (a@jT]cDUW6F*CH,0T2T*HN)!2=?Bj?fww;wαlD Sz9k<'d-29 mNm÷ kzb2+~jU#}du|RU#j_f 1։ pXc`ه*/W^Ռ:ߠgp>\& w:;0#L'>32h; ^X4P9 K}н +`Mv^+= .Wq*ԏöANR4g^57%#( B+t+O9,[l ..u{ x>)KK.m+חWWUcђKS8\4(Awl9Bt}TTkGFKX biZhph6h0},BZ ި0K4`LrwVu)a{X=jv{`P$N*Z>qU[8FI: Ӓ5|YEVCxƻ)2DA44AޤK c+%pa{`ԇV]h+8Ÿ ,2$w`fH Z0`^ef3k%H}.(fb㨮gC–^عcÆw [ԶjF6y4ViAqrU~\*#q:*OY-Y=4QQx)M9IM"R(:J0S[757|رqmuNv*֧6 jʸj)uUwM(7nj4}JON4>S`ZmVm3;ӖtgM}>ĊE>Q>?-M39K}Ls*Nkқ&;+kNqe0$/תQYKzMu3>crPuQ1:\C}`cΥf_CKx}T wu恿ip jpy:i^牘*/h],z}RBԵ)5zi6I(<'q8<" <d}p?<@1!qq8|8|>/c< OӒdpQx_2G>wRߥ+]wJ}.]RߥK}g<#AA p8"p8#7PߡC}GGR?~DԏQ?~$#GԏI#GR?~D?ހ7Y\'A 8$+P0&=~aQ  ?ݏgB<>x|x|<>_<>OOE7A 8$+P0&=~aQ qdEpj̲fzcmu=0Qף`k5aU)PMb0j P;MF!PL@CAGqoRz|{{FDg~\CluY%K,i_v]b9䕪Z"/E^i^Ɏi[C$m>&xvЖs*9 .X-VDauuG9s7~X"1m┕Iv57\cŷPt8;y/c9HkA'ުC+3 T 9 M(+LW`@Ǝ_ Pq +endstream +endobj +424 0 obj<>endobj +425 0 obj<>endobj +426 0 obj<>endobj +427 0 obj<>stream +HWmL[>kbc/ ͍m> @,Hdia4)V!iH!4m5c]F6?RW)՘*m4)e~2MVi֟S=n%ڦ_o`L0~~nv-]"o`Lq@mx#잛xl g_~af%ƚ]~fgsXM_8?k8~Xu<`o4l~$g2w*߭ToUH*cs'g#+y4D@GHɱOkr|yr|,>7srENWt.W65}OM'V*mwR<2#,W0s3 dH镥H%HGWOL\&*o7N5;f{6e%ReӰSW`߆>[¾y;4"V]e^" `{`aӰ9eUػqg$"/푴n[(|N ˼G4c@\\r{;{rΣ;M'Rrbws}&Eˊ9phw{O$g7wJEooxM{ؘlpq'ap{?5 XGGM?Adve-nDem(P22o +pn3 m1MCEw0o/aN<%-P +R!-R!-R!-R!-R!-R!-R3)-R iqnܬG42sz7-<\Kڛn; MݭtOȲJ>/I|񼐄T:=eWaxE9xPt,wNY^LJu^$,\~o+~$t$ɵuִ&4,06-DH8q hQUSHB^^ *sǹ,ښ|a!I ȩ1RG&m{mN M@qx1>| H@Y(X>jls,l1϶Hx̉Ujs~v5W.2@^*lϕD} T5l F`+jCp7.|@]ҥۧȽ^B^$y KA1&Nz:ү Pّ"h1\F븑 +q oPa'XPKtR?AUk(c[elBxD!_% kr,@/5KocX* +ʔ(( +b+( +b+x<XA1VPceL"-yX!( +}S4<]FXTxn@V^gs٥BL\ -nISѨ疈sW*gbꃣgǻ:"((%Q~sw8S* z0ZOmOV)3tnTѵ veɧ6ᨰ;L0b_Ytx)`_b_q:u}`_:@:uo3 ŸqKn$ t,C +)-#s|k,vM}O˔c=yXk䉑 +条P8Q(dOcK/k`*WklrwmD>!:ݬZQIks{d}(N'.Jw0KvP8"rr)!%l ސsAʒzfZrV,ۄd\ _.( +^ksYda@̷ C@9`vޑC*j1{v{$;k+K +7 ^L/n2#6}_R8iFw z.5sLdݦmnY>P8wɉ^u1qTQ mXYe -] +]m)jT(j VmC|h&c4>B4&aGIlMj߹w{Ν=|߈n3V;9:듫sS=Q?Por?0KF_!fcXf/@eyEM{/:ecz}D^ĿBAEIZ9+Vߗe<qf0yg*J"`C@4Zt"$$Y9{O_! k)nEEȴT4-Dri!a!i!i!i!i! ѴM ѴMˍfqZPU2C"*Wi+5wāc3=CgW/Ό<ǻ_YrMmcs^ Wuyu %%+u 3n՜Re-Q^\قD'.!13 6k)E_e)*QhpWJUL] D\ mF mF mF mF mF mF m6MHunmNZK,J1?2<6J18)!..UQ.K`%ZHSJ9f߆f%w2Q(}Ƥ| HaIK1 @@O!u&flsVOArVlNcH!]beh!ÆVFF v.}Oը\9HʌPz+B;ۣ(p 9jh &gw 79>|}=pjZᾱnĺ+'ȸYOkY>:W#6-K' {g`R7lPwD@Z$ +ygwzL9nX4w@y%/ְ}xUij~r<'ļ^ v ^ bScHiXks֏`~ZwÐw]xȽS|xgֶ.թc|^Uw5Ϝe׷ū:^U6.#KVYL w' ҫwX:wK:yG{fNMG_<3rai~;4,4ޑ(cizh.Iz(r,'5q>h+x^ jLPS6Ӱ{!9i +opgFl{$y uB? [e +endstream +endobj +428 0 obj<>stream +Hj0 +endstream +endobj +429 0 obj[424 0 R]endobj +430 0 obj<>stream +H\Kk0 8q `~@j+aqX%[?4hݍE64ޜDU +PZ_e<qhL?6'fXx5oN +Cެ!Kg_ǰM¾&-N1rT8NYUCufhԿK/;x^>GiO* HHFDY +"vt"m",It_I7dG҉Dq9*ϣeI}(e)^R|<:+o΅An.}|W(- +endstream +endobj +431 0 obj<>stream +H\_k0|{lJtv>M.0coPqwO6plCr8WiÒ~U˾f=V?Cpnͳe)t`ujxP x,*ĵw/2[4:fpDךBUBQU24_>endobj +434 0 obj<>endobj +435 0 obj<>endobj +436 0 obj<>stream +HV[lg>2{Ύ=7_ֻl|/cqx&;K&&RPR B< їJUHy0HHDj/HDjVv|3s|k5j$q ƕWCvJlq}"(Gvnm?Wn·8\[ٺQO]_˸ZzeRI$,EZ71{w{n2.;xk$|!K07vE LXb1#ffN-ƶ=m+;uąjء ^2wƫ3sZclWպW-p)n1;)mg|1p~ifV,RlD1; e>ࢺ]?mmXLeT')GLyx82S&N=4HjC)xErPeQ߄ Щ*8SҎ0]dZ-KX8L!N q}*.PKKXg ,V ŒP, ŒP, ŒP, ŒN ŒP, ŒP,QtRB +7-+вP +BAC(h !4P +BAC(hUUN]N yhbYu rT/tK }2G rɆVKM_HgOcx΀a%S<ـM +;]0|z˸|vύ.2ֻ9yת6۩_t'#ՍbLIO wO}BK I15C%P1C%Pɚ EU P#K]Rau; ; #dҿпu5o@FCo H?ե>ȥ>ؤ1Nq? 7k>nt">g GA[ww"& b Nx'mRZ l +Րkkkkkkk^yN'^9tR 5լ/PQš/b[bwxY%r+֦|W:"4McZĒj-hԡvQϵB'v<6!ѩ2#3Fn}NL5&L&ە y{v'+jE`L`D~ݟ?~rf-|2PE'E9n"N(5YI[,w@$uFXzT;Fqk|Q1QJKXc{Ŧ}HR3f}1oq{ ñǩ]A(K? 9_͗l .Yhq:Cn?gW ~)7_iu +>Ӛ[yӪ(Ř6[|Ч}QߟVn ?s"D9w$ݲ릆l*iXlKj싅U֢t.Q B~VzG6ѹzgT$7>˅)6皣pDGe.zD \! 힮\Ʃ1K9m`.`G Ku +>L `GBf_ Bs,3,D`kD)MR4OSsrmk7vֱ'~l8n6N8qޯ(MB>BJT*QUB8WNP'pC*$*-}UR~x7#&I~- +Ǽ 3#﬑>0oŸ>y:A +zd`^Gl@l`Xݕm 170v aԪ*~PNp*S +T8y*S +T:ns&9)2?poUpFd0=n_kqWL Frxg&p_<:?1ZPR͵_DUz ' ^⓽.C }zve&Vs;:&#\B"fE632 fd0#ml3e& +nP$Ҧa* vh+PqD|&",D%"(AJDP"DP"DtP&jMjq. + +(Q@JP(D% +(Q@JPAmX7QS LIPIDfE@EVsHWQ̆t$DҬGC̶GШtzO*57d;<;^vm\=hfj5O%c*NpԃH]}'$.%'f(o-$jOw~tKt&$].xWDoMus<$ѽ|{tMM~nO^ڸq_E-sW7:ƕfooHg%9j +3q^"+?~Y˵.ȗ$ +Li2ǭ~*%҇8:{|:H+?L.{}kNg- ͸7a4['&`OBa?.qH7PcKǻwtt:[oȹIA\<=慟Z.wVZ}o%ov#YXI96AmKM;Ll]u7,f,sON:9[mn7''懍+KZVjC"̑y2h:CΒSd"<ྌ"% Ydsk 0>P H<Q1lDR1q"vG||'E†Kѱ1S +endstream +endobj +437 0 obj<>stream +Hj0 +endstream +endobj +438 0 obj<>endobj +439 0 obj<>endobj +440 0 obj<>endobj +441 0 obj[438 0 R]endobj +442 0 obj<>stream +H\j0 ~ +Cqj-AƲ=c+aS6җAqtfy9.z\޻r&9U]~qμJG4AwKJ8!ei 6선 vj!'akB0?q㜬C4+F!Nm*c{8CY [@x_S ڎ`o +endstream +endobj +443 0 obj<>stream +H\U Pι= Q ? +d$A} ZVwKZM'FDZ q1M6:Io1;˝;{^1 +s->{6%[Alz’Y9SF \iq3fzhZ} ^s<^lQ!@XO.hM>֫śdz\1~7:})sLd×HɑfCYLCʱo m0.$Лl/7ov܇Pjlt@lZ`9Fc'} +ĊlB΋&Xև8TΪ)Agc){z?qzjدռvNEO\N‹yX",@ȟŦ< +Y^tKklG9nQ{K˩OѦB:^@6n.Pj.s0 :e\5R9!(@Qlڅ3AA4S2<_+I1pA03zlLwN.oSE])ri-ޠ]vJ_lKFX'XgC%a"oۃ(SeNp&"M|Dz!^Q 8?`(XX䦗h<+}sg_ߡ'U" +*0'E)Wx :Clͤ1fI:2F%u7/fb$!2K6"_d4cDdO3.ԝh4M|SAWyR-VauAKiYګE8sPG" {f®&|jn81ƥ*Żƿ6J̿,=EYbDʧ4S_N{ }L8t}&~R\">l=+2UAjJR^fZ#[u*C9969:N: sGAQ|\'2lC6+u/q--JelN`:*Y^Nm:]NwBXo ~cDbW;cjK.\4Ra@E&IOvkJ=O/tU؀-&˽Gp+hN3C8 ³]FJW-{٘ +]R:Nj1YΕ` ˤWVz&E*SKH?Ycd, gr+g9)J@BJw[4u +7i|w/0 +2w䀕ޥ4Je/NTwjqpu!2 /]QGIpD:FPNKuuXS 奧E\Nuk`Aj@ϙkPch5VXu0ycNsO+S-::Ĉ4_Ģ]~Xy܍T]fX-Ֆo۸'w]-|!gw:CT +c[WhZHۏ-&-4s|!xُy{ιo0OEŰ{:</j{UM]R֥${"ÁHR])͍- +i*fk2<@-R Ը|Ou+yH:pV|_&HcPўK$%6i뱍lmV[i4>)=>M[Ξϊgg .,%2 9dOW߮:o?w3',e ^컊}2<4#[$ C+&!/#p ^.cO/ |6{(vO~.I3W<\Mf} *8ugzek!_5esy 8 k^f~f[jLw,Ü=.Z/[<*q{*iً "2Na*SgwܝnQx/H)M[n``NsKG/u^?>N%wcjy\£G!!/#֏G%2ؓdNד'ݍ98'M>]'"p! C0 _7̳ +*<)"n,6=Py4BOad{'1" C\p9\}\: [K''QνT{`3G88B^!( r0lƇh0pBL?906yfng +4։~1N(|hADڑS/_Y=H fЁ^ X1Na^:Zpet +q*Yvq1`WBy, `XdFmOZPݵ^o#Y~zWKTK)bʵXDN5Ynw،jlF5X<1~nv [Faxj`ՠO rk), kfs%/JU6@tʤhwB߂}طiV!"O܀̘+MբUՠUh + ۻ6&4U)EmMǚ'gך0ZLy-$J'\~K\\>EF?:uu#u4D)aDJs|9iSchMVs 0HG\vpe%(!Wԯ?RS!~]Mɠg3Y:7Ը.ٓ{@N +#uϥ!IZHnH.]v9_Γe&[dQ&rQ*sW؇bd0iKdR~EAQb!1!s$4{RBVO`HhhB))gj!{&$oF`╔@)!\oN\tɑ^RWx`3D̔_LvL슄sJ4[](NM]}̟7<# +4Q<^k7{X@t %C`}e RٰgnĢ>.O,q\u`^P1@o0%McsW=[qLfE*Yw}%a!ho,۠ hr{`yG +endstream +endobj +444 0 obj<>stream +Hj0 +endstream +endobj +445 0 obj<>stream +HKaǿ(A`f{CHLeD宿شmY컻"^:f=**9R,"t%1)fm-%*t̩vOvSA\\zN=/ E +endstream +endobj +446 0 obj<>/Length 2226>>stream +HW[o8~/0/ini-_{,"msME%=Hd9YtX/szU/ &<1Y-IX1C"u$K£c{tI `=Fq&$ߚcљ͔Q,__KgWЅH!ѥPX93] n>1[t5%eV̂ )6pz=^1Z?'E.RHBcL9UH,B 4nM粝Kq.1HpS`iVdG} XG$Mu[/q4R ބ6n'B6‘.[[l #)8-T=jOGb{0ߒo0P~] 59zӮ//O<5v;bt9([Ө&eE Qv_"K +Co<5sGD)td;VtMU)y$ /X$jTEl)+11y$GF~In]W4UAġ5HhdA,AHm̀lpԒs%`WjI% MFyݣ_8aiƲ}J:#%PdFX Z F(Q)ZT4@hQoI^_"dE^$D!zk汻jI0]"GE)+D lQ1Y2uV]9"YwcypSyhɁjʪf28&e U ˏIp 5="NlX +J ?+@I(s"@p fyDֻuHhZ/t4eX8-oX+dל+N?X~TDMe8)1 ?*.XL%jiwwy$rP#]AJ^Tq،"j:'&*ߜ6}@c/[b挡KIB"!sᲸ`zImq 1iPݔmHs >ҴJ +fg7%)mnMl^5$I X%+$ppE@Ȳ:rO VnyyI޵}&/JVyQ iF2-|8:Z U?1?$a0d}, x6mo)$ۦ= mM޴)7O,B&eie/SȽMgs®0b +5r1 f ZdD_?UVу=yUЫεy+^)hqZS1 l儬*֢_o> /pq"荨ehIpSF搉Eɐ;!T#l .Se$iN!@|5Bzл,0GrLsAUGMVWۺ6Qc0S|cLwkC7Sr3cY twC|mhR$y訁lSC| +o$֧z?:];/sO2|US2&LtZt׬>p@J,ff7t榴]I4n)>T=# +Xav/N[r|Jy&hEO4jw?s +h IN5b +T^*JhύG2*T5KMݦ<0R5KIGj`trKuP-+UӋ0f I3V¸*]gA8ؑh1oMJJ$MG5F[gL20svplW,{iRk&1Xn(B|1[tK*y֯{[t_׮$>Fz~?4!dz(V +5Piô$ؙ⠒L('NO*jC *{`kg2R>8/**F Zn0(koEr0oEB2J)  $:㑉.t#r,<`TLlR(E4nM aw{1x=HZR tIYi藏;1yyӫ +06 +endstream +endobj +447 0 obj<>endobj +448 0 obj<>stream +H0 +endstream +endobj +449 0 obj<>endobj +450 0 obj<>endobj +451 0 obj<>endobj +452 0 obj<>endobj +453 0 obj<>endobj +454 0 obj<>endobj +455 0 obj<>endobj +456 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]>>/Type/Page/Contents 463 0 R>>endobj +457 0 obj<>endobj +458 0 obj<>/F(Lulu.joboptions)>>endobj +459 0 obj<>stream +HkSY[Re*wQAw1B-o}jN-Ey?Lt:vW777?r:"yDl6[,VVV؟>}Z__/Jsssn~ʨVJ%D^v-W'''FǏjcgg-//Wa4MonnJ[NZVl 099(({__k'P$l=Bq a􎱫lFue.Xc VIs@&JXr=%;AP:BzÜNtMgJY$J++)  onn< +̵zT zDU]<޼y$4#̢œ@Ԉ3` 'BBtI#pHl!|BHMwuEm8qeX6;m*;?: y4 =bRYF#wO +/|}! C'# 6Am0wGDG.aM*իWJeff#QS'$=+; +* /t(^]cS8l]ꅰym6Ya&x SHP*\:z*F?ȋ/@)dC*KL{=[\C)ǣAدnk_ sqT{JC~X?.t.766d2jæE (0}J bGBh4G vXHljCkh4UunL!ۗ&ll/A* +_'h ls1O!^_UHBN& =F.,HHKl+*^ ͈ \=. 777҃ۅ!3 C `]vX,֖>),{{{Ը߷R650fsaa!U=ʼ2G7*~ʼԅۋryyh@L^ dV1WYnoo_ KQl"UR>|f65B077drL{-NҨA<&Ek^3mmXeggX 8x^6(";,CVVV@VT* +ji"O*x&_ +endstream +endobj +460 0 obj<>stream + + + + + 2011-04-30T08:32:52Z + Scrivener + 2011-04-30T10:33:29+02:00 + 2011-04-30T10:33:29+02:00 + + + + Adobe Mac PDF Plug-in + + + application/pdf + + + Adam Bien + + + + + x-ray + + + + + uuid:e861431c-77d7-784e-a7dc-7f756ad21027 + uuid:902e3244-9424-124f-8feb-cd9a3524090d + + + + + + + + + + + + + + + + + + + + + + + + + +endstream +endobj +461 0 obj<>endobj +462 0 obj<>endobj +463 0 obj<>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +36 0 0 36 131.488 522.8 Tm +(Real )Tj +2.13 0 Td +(W)Tj +0.963 0 Td +(orld J)Tj +2.267 0 Td +(a)Tj +0.47 0 Td +(v)Tj +0.476 0 Td +(a EE )Tj +-4.923 -1.325 Td +(Night Hac)Tj +4.428 0 Td +(ks)Tj +24 0 0 24 135.388 370.4 Tm +(Dissecting the Business )Tj +10.208 0 Td +(T)Tj +0.482 0 Td +(ier)Tj +16 0 0 16 160.52 239.7 Tm +(Adam Bien \()Tj +(blog.adam-bien.com)Tj +(\))Tj +1.417 -1.569 Td +(http://press.adam-bien.com)Tj +ET + +endstream +endobj +464 0 obj<>endobj +465 0 obj<>stream +HROHQ6Axw + )vuYm[ҢgߺLofOt=ѱCn^.] ԡYwG޼o;}'n(2թi-% ˴?ϏIz.]k=i\등vڊ>stream +HW}l[W?g8v^|ձةۉ6ɒ,ifnҭ҄6M4McV&$#!$ć*TbC2Bn!x R'&U'Q>ڄ}uS1xy9=ܛK/S9%[/W:$>W1,O-<]??@$_;2?wwNt=5·j>riW?~pP軏@xE"Sstc_yr #~b3O, ͱg:B艑Μزs2md`vP63xdPNj1[|fM/ et3#q;i'gm Ϛ`69"ؚJMΎF3Pp,w9]e2%Y)3Gk5;fee +6`"ڜ]fĔ<#[Oe,φR!#TFaQV"S1$D#I؏d&e8I5n yC-ސegO/u:kceŠic|/gBM=Ϣܴ=9*3@ +qYBXY r)k~_L`s = +z8Mj[_ JA. .0J\("B;(Qp <.@ VA[g=j.X:=v;UXHNC +ѹ2ޤaFSva#<^ڣ;%QIZ,/wNڣ$Q-Sˬq0rBR.`n@(B>ێ5 "܂8F)q0c6RTpSMݳJ +6 ;(@̰:*N:r͘hhFhFkx1] B CaahNLep)z +)HRP#4ft@.U"٫ 'I N3Np&Lnix. vk8d!Xcʵ8jz9WAo.>yf/#ډaƗ;2,uu+73ⱀPWF6MzW# ^\JZU:GWon"\pw~!VSo(a?CWwONMs8r]|W}Z2젟23MwaN&Zɍr_ogƄ2bX1!c1!#&d+&6y èW +^A+H{i W + +dn7$m:ܞl8uyyaQm(Dya䵰;%_ʊ^E޾݉dP ȓ6ڡ5O-X=_x 㖉t-h@KZ:ҋh@K7 +'ww̠e3M^m}@7 o}@kr+Q܆Y+7_LLH5vdּͤ=ެ[{יD+chə3v-OF-,B`vcߊK8+ǞHT^({ K^C"w V'ozw߽{k]*$y*ýϿ 0*('q&^,Yȫ0#q%rՁ;n6 ;0j +բ*W +Ux{ޫ^5k+Evk__kƊ(i! ++5؋Xm@5 f S_6mewqc<8=q<3$N6mv-VB.]QЪ{ ఇ6 +p$vˢ;i.Dz4y5`3 iLf0Ӏ4`3 jG$dUX| fc@)SeZo"3 2,1.S퓒j:= Bk\?_wLmt{Yv<˦[S3g㵧_8dY9.pBc DWvo yqY=rZ̪Ox^ut@oZVi/h9*Xű0S +j,Hp5~!1@uĢcvDʥU/+YsTJ.r]N7V?#K:MeK[ɓ2'к㤱,+{cD1111ï'kN`| Zѣ1 _ #8NJcz [-@oz [Xs>H+rCjYЅ6ݾgOƠKc-_K^(rg vV8.6!yJ]R;Ú<֥['JLv˿%sTu'8q3ݎlkKNM xiy5lhh h"i u@kZ3 C{ix)D97tEo7t ݨ7t~o{ +.\:uJH= > +tW7 m CB+@\? q+@\ +W q+!"胄!OH3`w~lGV +\12ɽ\c͚r9W]]Idzε񥙹3^SZMr;[nkW.V[^:d%d[oUŭhiԙ1H?aΡ^zYe^Y/*mez|Fިj.ܿ`k'|"CQ ؔAC!#m4t]Iq~ϑw՞.۶y2W3%<'r}޷6Xd ߃} sI_Π&ZӫŀjT2N2A eP-j8GtE'\+pEH 65;)>{`v*5is"GȾ=qMLCMTTR|5ouo䣣XUmZM&ijUo66Q[Ϝvͱ].fx$F1pj{o86-\,w٭5(1&`f_$'{C;X1&87@TDATD។8yXŁU*f/!;{af1ێf/)F:}mJ7.<.xp \<.r#>HAP"4҆xxùg90F'66-DG=})9lӺ{"[tk};sͫ~~OǾz{J]]uX*0@6,2b*+f BKZR"!Ũ:QL*^r>t/qTTbh +^*+!+!+!+!+!+1ݿsOk{:lauP{A;z%|3T)VЄ1ybrWD9)+k 9ױ(]r@3a;Oa 5Rh}c_|~y?z<>QKJ$PI]b" 䧝?{`\z69upŞg46J񯼀$$ I6HA ldG$ pe{@ꢁI5u +4Q"Mh@(D& +4Q*O֧:hCrcFgP2 O8DOJqRB`+C#E<((P7B٧ǽ8y\jڻUW%T:dPB5k _ZРXp.)ĥpw|&EX +~Q +%:MG֪gqX:η&#4&ꅏtѨc8h}߉bjL{RlQ\y>z'دqgsF!DƂxûjzR+_ +_(G i€& 0 ЄMЄM)]K 3~? 3p? 3Ii'ަ֕ƹxI_ZyY_n-|eA&lm2jtnXZ&'# qmb˗?<ȊH?!g"?ߗ|VD+C\@9Pr"1"9^w/F.Y.'_B.]B.y1{oc{(&DR!N=d!ʶ ,d$àoHx5A29@&DMDMDMDMDMĂMDM@&w'GV"6cC?6cC?6cC?6cC?6cC?6cC?6cC6aN\>楤ʖ+7bTk +{lLe%.J]9qc\{5lO]p{粍|غ Ѿovz,v?y`%;>5 49 tZT|>k]f(j[%jȰF|Fy GRB@C4DOC4DOC4DOC4DOC4DOC4DOC4DOGw'G@pK'O8WrrɁ2(Á2(Á2(Á2(Á2le8Pe8ջW|._ .p¹ .p¹ .p¹ .XWػ \^ !eHF8׭K1'0Pb /@޷$5MՍ ]Ɯ9AT٭Tߋ 0by|8(#(IYnhTTGO! \F48*t +cF =ӥӖ?707Gj Mu }!3! +-v ?ǐ(x}8b6L6h6h6h6he m h18-;Qn=AW̹.8XP8FZ%97!IA@GOm]F)}r!Vqhr +_o]W)A>xt)@ ٘Ɏyrn0a揑RbϼvB;avBX,4 턅vB;av௄yiK?띫|_BmU:UCUCUCU;WTC3bM#&^,3R-xlHwuNuS]uYbbG?o0bTrPY +75b/Odq^ݩzݽý3ͤ66%A.s:YUm.>z~y`HO$1?]0Vrrt¿9/߶+h,!-%˦(۴-r(V,u.v:YxM3lݰP(d)ra; aŐ۹];Æ,ȟY1AE{$9pcʽ{p9qO-Vu` +=(؃=(؃=(؃=(؃vxOf*LAAAqjPم{6}vDa#4^5殀s M:""Ν^trߞk${-QY +dF"P HV(t(I(&{A`G/XB" ~쯰)X؋Q} + q4&W $&xK7_H8I|Z rjGR2G/Gw@} +_ŋ'.?CXOΔBI*JR$JR$JRT(IeJJ/d>H9^ԭG:GK%=`~%vgma{3!|RP)7CXFGQwbkr-^*BZ\ kr-TʵXIC.'7ƒRGF TF 5ߞZX8̣wvp^]A=B,2]4s-quR"]4Etс.| %D3J_Ģ)0p&D + H}>A@BB_}8SȠřn*O6 9Oȓq1hZ_zʹs:3~¶)f-9pz( !U[st/_:YΞ}WIݟvynIo~ǝ[֥]1jۮg@tln9ܙ.y7D0LtD0Lty9&Ș#{BzGًRgD&곉l>&&곉W7Z¾OѳE +Kٿ*fWA|XGv{H"#MGY&Y44feꒈi1-Kep6(JM1ŵWv^??aIRBwW'<JRV0#0G,vADϟЕ|j,#3ed̔22SFfLg̔S>W$S@,ϋllm03fslBa>!:|BtP;=p`s09 w;Ýp09 w&DOMf<0iLa׾zgs6[8Kz:6 Lkˢ %F 4st7SԦ@m +W%HMMMajuo*=a=9h.x(ߍ?) نN}0SH #(?/qbҔ}rq;_tgj孰8XZig:S\* ^rk~yn|[,4FƂYƂIaY'X:T8 *NgTdT +SAv*YMAO棙H |O/)Hx'"HxA&d}(umzMg c@ @ @ @ @ @ @ 9rq9GpqK\: +1Q|N | | | | |Ǿ('JGlaFI.\k cG:cF\~sydL??^x , ć{XJRs.F^҅TOTOTOITTTC _FDQ *Kr~D.jkZV.jZV.#Y'lkZ+5L~?l}-bJ4,>~ ~ +|OX:8V^G,Y:dZ6eZ6eZ6eZ6ekلM ۠RPj+6 v6ڀRxWhQM/9VuRM,"H XE88n%_"r[DnH ɽ;;;;;;;?$Xj;YQxp^.Q]g3>;x xxC c y#!FJTCX (tF$jJU)tצ]uvYUJ%*%?p4?Ϛ"k8QN5Y'g͹#sQ0Sj:453R'kWҥh8L;[Kd=?f<]ƢLqTFD1kE1]S,&};CxlE  &!=p&6Ry.8P@58P@58>0jq+wy|%!jRyLz$]iwH irbzflx1LO'dOj}t(+؈dY +~h^Xξ%uznp7kI~VHM" Q$D(E~ p9<*Hq-VR˟!M9i7[>=CI;āAiׅ8 ']_|<5&t3ۊQX +*nh\'>6Kf,~XP)Uɟ-o*Hȗ*917^ÅZan9OGo<]Iv+Q:ɋ\<I<O-}7^sW~|λgp'yٹԞP*b3 =c'cBGȐy ],;vW +ID}˶~#y +k{kVSv@|'/{]j +'jk?#Sҡ;¬I +ϫUTŷ*<*<<ϹU +ݷ@EU +TT*PQ[*@=b#F ϛW)mxpQH(yù". =k(Y(٭B%g ]}Xǰ`} +Mb +Xs,|UVͬzu: w3pDf`"30 Ld&2̀S&2XgcXW}&V%J]tJ%䈓pK!$Ks +"пKNE1` +&V3K=-5⭹< ,FGD%VQ?5T1Cwڹbx5?0#=D"I4V1=: 0-kXEoIb*$h pvz'̻5MB HS,Slq.kҜTr&u;$t)!n,tc:c:c:c];&EYF4]EWs@z4P: iNu@4آ: iN ZR.4 ԨMZ@AxbIo˦vFoG*lb]7g%3c` ?Ʋ|¿;Gg<߉&wUSW$:<{btzSii(|?eп|O&e)zxZbdB~(t@ +PB:(t@ +PB:]!Kw- +FY1KV[ڊ4"Y7na}PE P@V%kMF]'㦺ABm#q<8؎='v7S'dIӦmfˆ-.eJu_@ !Da,!UxZx}RL.i>s>{5T\ohuVjnsaj<ER_|ۇ9w*7MSh4(OfmS'v;$5| K2O}&u@14G:3 3 00 3 00Bf"GWUCūBP* +ūBP** +%C>5!R벰d[CN+~$G*VCUlO4Dx D<ąpČ#sD#4G9"i;4G9"́ q9!PMdl1-&Db"[Ldl1-&D)g)wC3Ô]J?ʞD9T?r)Dx/1z|~fN e1~LDp sA8sA8X:Gk_~? 3q.7ou%{ܥ5+q?>zٝZ^\ܮό1We^ ؓcszB] =w.܅s8[~gC_Zi"qp z VHG+ Έ%룝 g97{i?;m 8nFMY\KJ cAD3PHҡn+ u+ӺDcŞɪ 3BdF&)NLxᑨd5kia^.*֌dxɧ_=cf`zk60E\2!]'*N`:z !k4&u5S'81N pb!'81$'%ܽ!ԢV6KPA{rY!!F` ےHQ_^GLxr0p{pH21taƩ$9BdH"H]4qvXa9Jn#46܆PrJnCm( %qJnCm(r`Ÿi[QEM/ d 4g`"^;qx@L |Wp+MCN_Po*u)?cyVǰ(NU%[~ڗv=Wֺk'_jN-sڱj;w_]14 ݂sD܎߼WsTW$c3Y_Z.}]NKmwcWԳޮL!Yrj+9ע3Wo^]NBTOkcQ{bU3iMNM'΢04Q+O +38$:fH5 i~=b 5(aWy.5]0uk4`nD6t2#*1NAcĐ#Cn`1V9df3W N N N N NiN N sEg?2ؑy'J=ZnD*h򿢨dxQ6w:Z +6W +J] ?podU5sjakhڹXڪ'Z7VeߪG,18v;Nw:tp;!w:%wDdg/ ph Y[O$ªGV{Hv+J) 2$Fd# o@1h"šc]&~3_aL<EeukZυԏrNh5N)f\SP:yͅ:{w獻ԛO|Ħ3}#Vo+-/z?]GgȐۀ/ү8Y&r$T$$P*@EHI" T$$P*@EHeMeeMeMȲVG,' +Vң U)2־F| 4MQɟ[]WQ\u~ڽ<{w]`l;Dd?_3*$37DV*:Oa{ %2YĢeP92Bkظ&x>f+K]OfbщċմqsamBK .nTu뇗:w;H45.|*!Sd㓐1 +NQlg[T>kӨ9Z~^ Q(lځ`,P 4e4yw|۸ua-d0e=h)%-;Lg&gL qW}E(Zn](u6_&ЭV) +d]vICjI"Φ6.xyl^|w~Ϯ'{doMi7M4ٛڛ&{dod(sّ&;9|bUtQEW*****^3>P>@P>@P>@C"lӧ׾OazW E'__buO|T4Gl|q|+jdFCq5WCq5WCq5Ŋ+:4-EEQ"J[Di(m֦jI[}-Rn*JILe-ld$[&2ɖILer3ld$[&)7UʯJ,[@BH-YM ia4-Ѵ0FhZM j)zERj)*=HZ"sbJ]énrdn>?i[ޭG{oz?{v{|SǛmG79Eڙ%6ScD6s/>Em\8u6V92_M}Mo`ă/<˃/JGOOlC +VI*>i*$$OV:W*RF +ۈ ." ." .# .l#QԽt[(PBa!PBa!PBa!PBaʡBꋤ( +0AK4g1F['V'&0Y57qu\s}w`Sarx>pV}edo]lSlԛ=X5;dwmOS}i7fQGLllCjsz\CҫqC FVP'I#fDG(#~PQr3Y3ӑ@'SL`W@oƪJƪJƪJ>131| c<>1U2VUrEJfxq\%l7^gt[&v!>>>rU9W_$@UNWNp%Z.S0TU.mx󛝻'ݎ򆑭*q4W{ܿ#e2ō~|p|7SU8zvK~93gWp5YmH, +^2g>fՙӹe܂ +7VBBYOvÎb?s?s??s`Q _}axtO:D!%Wd,_{62|zT-t=WW9}ak[՟?+7~lmè~捍S/"sOИGұ'ZȓND/DCZ#W^UЫ +zUA*UEUz5ǵ\+ꢭVmuQ"muVmuVmuc6uRlKJL65#Incĸxc/o3e7!_6ɗMm/"/Hmi'zS_NTʲޞJ+< [e{vg猅堳sګ'V٨jV`ͪ[bמ۷f;foQ5BN8]Ӻq뿾ڈE-֝6T:t^2Wʼ̼Ŭa mXmjV۰چնb vNb3[0K6*;2wtu=ssk  A5_5_5_5_5_5_5_ +/BP0y3y>O+ُ_UɩU.Pt+OC;6B2yEL\S\ݢ-Uvk[J:)b]N9hΔft}ݳk9;_;ZotoG +,l7y878/2-qVϖRk%ާ%s+ט׼II׊iCSԇ>4M}ES1Mhg2{_ Y'0o4r5ᬖѷ'@L@@(0I \RtɉیG1~x{fW?mItN"L gAm-JYSUgUV*UàVKtNh4g ƧW;?أI8+όfG;3vkIZWKlVʒo;%n!$&$͋ !%oŔ>WnqۧЇ֔6M B+;sF- +>3߹|x)9UJևobBz{&!{V##A2(7dH 2dFhx2a97ct) + I1Ri+qZőx4wFy_Th} QpԖsRdn|?Y׹kl1뀝'C>`(~Y1Pވ U2T72!C$`Ƞ DYwÙCrZȣ#[v CUD#jW)5*iJX4bĊ=hd5; hR"jtuG[|BܽӼ V^s8I8kW`/~ [%Vb"Ch#P!o\17` Ѻ dp/\Cr R9{+9${3=X Qox|bPt{owמN5(Yz\>>1s7g Ȏ_1m +$e US:5NMD= tN<>NMI Lb7)2)WpV(iH ":-Ȼ;4+Cȟ! _A3?N.קC_emhO#@inTF+MexZU;}mp4(jD1Z(m(KiE')pg*dR=?΋%OLZвmʥ 3;wj13v$œFR`?>PZ" 81< sY(4LdDbO_";/cap&0&J[o hx|0 fxF"0_ a// ]!! 遌@@ ! /Ea>r2<z]np'۔v$f``````>6ģMtVЩ]i>4n50ES40ES40ES40ES4)nO;.ӅdX N-q bSH}#x钐`K/9̭o?_h 4P8W(%B'gH"$ UMpWs##_=?<;EZS2/U7~!>j\`/>RIMI"HdHa@xz }P/ 3 Ք=tLw PwPA& ^&L TW'L|]ؕ]ؕ]ؕ]ؕ]ؕ]E,)_̝$nͻ3tNlkTG~-sC.cpq_,U*3h vrqo#7ҽf%D%rq(\qnE@1O5K.ktul+؟.ĕdHxK)37w5OߟgWo\Rds?ζ#{ L~HVyНo#626e#~Ʒm'e;_+gwՇAW,kWI@9h e5P] Ԯ\lم:NtN}@.;|;9XǠV$.Th,bb+p92ƯM;`&tp 2̸e/I9QD7z)ݍ`(^z~TwAo>DL?B S.Z!%6s#됷 B@{&ُ҅GPyp5UH= +IM#4 p5Luv@ +T %[jeh{6u۴&&7fmئo[[]STkf`Cj)iU6"0Ct07$>꓃@tҧS-;禬=vo~|9]U,kwJgK +q]tA +wQ%5 ι^t}!7ut4ݡ㧱O3g q6Y DGBFPº>+o'K(+G=b=`{#G(;PliI*ؙiӖ]̌ 0 !C,rl H_B@#/;sLcɌФ.R2餗1o2iFO} 3T#^-=<5tS_ȇCvx1-pvjR~LGd9GkF)ELlv`՟r 5exvF( ire1ee?I-υ˒V[Tm99&_MkЇ$MF\ ;}aK=48Ӌ +83GЀK͑ L簜_+m +ΔzoWxJۨ^(^(\cau:^}`7=+gSΚN:4f< +9B߬=cH<6-E +~~M6Ʒ3%욉Xr{vٝdϙTyj]tTU_oԟR4NdsYLh (۠{Jz4SV +xLVQaStg%RI/`v"wpGމs2Z;yFO{QrCF߰>-/P+uWȶR VR9,P',XeK,K0vlSYau _dk9_\-§d +endstream +endobj +467 0 obj<>endobj +xref +0 468 +0000000000 65535 f +0000000015 00000 n +0000000258 00000 n +0000000350 00000 n +0000000460 00000 n +0000000493 00000 n +0000001681 00000 n +0000002866 00000 n +0000004841 00000 n +0000005096 00000 n +0000005237 00000 n +0000010960 00000 n +0000011206 00000 n +0000017772 00000 n +0000018007 00000 n +0000020523 00000 n +0000020769 00000 n +0000020863 00000 n +0000021020 00000 n +0000021289 00000 n +0000021431 00000 n +0000027403 00000 n +0000027639 00000 n +0000027756 00000 n +0000028035 00000 n +0000029223 00000 n +0000030410 00000 n +0000041087 00000 n +0000041356 00000 n +0000053195 00000 n +0000053452 00000 n +0000053546 00000 n +0000060871 00000 n +0000061128 00000 n +0000068461 00000 n +0000068729 00000 n +0000069913 00000 n +0000075188 00000 n +0000075445 00000 n +0000080960 00000 n +0000081239 00000 n +0000082430 00000 n +0000088979 00000 n +0000089259 00000 n +0000089353 00000 n +0000090529 00000 n +0000096183 00000 n +0000100507 00000 n +0000100756 00000 n +0000101025 00000 n +0000106714 00000 n +0000106983 00000 n +0000114589 00000 n +0000114847 00000 n +0000119851 00000 n +0000120109 00000 n +0000132654 00000 n +0000132922 00000 n +0000133016 00000 n +0000144136 00000 n +0000144405 00000 n +0000152991 00000 n +0000153260 00000 n +0000154438 00000 n +0000158190 00000 n +0000161034 00000 n +0000161288 00000 n +0000161567 00000 n +0000172571 00000 n +0000172851 00000 n +0000178497 00000 n +0000178766 00000 n +0000178860 00000 n +0000185333 00000 n +0000185602 00000 n +0000190797 00000 n +0000191033 00000 n +0000191170 00000 n +0000191461 00000 n +0000191600 00000 n +0000197534 00000 n +0000197824 00000 n +0000204865 00000 n +0000205155 00000 n +0000205249 00000 n +0000215971 00000 n +0000216240 00000 n +0000227346 00000 n +0000227615 00000 n +0000229873 00000 n +0000230153 00000 n +0000240767 00000 n +0000241046 00000 n +0000252863 00000 n +0000253132 00000 n +0000253228 00000 n +0000257069 00000 n +0000257338 00000 n +0000261174 00000 n +0000261454 00000 n +0000264976 00000 n +0000265288 00000 n +0000338980 00000 n +0000345473 00000 n +0000345744 00000 n +0000351297 00000 n +0000351558 00000 n +0000351658 00000 n +0000353606 00000 n +0000353888 00000 n +0000363090 00000 n +0000363340 00000 n +0000365179 00000 n +0000365429 00000 n +0000367419 00000 n +0000367669 00000 n +0000369468 00000 n +0000369718 00000 n +0000369818 00000 n +0000371177 00000 n +0000371449 00000 n +0000379752 00000 n +0000380024 00000 n +0000383472 00000 n +0000383754 00000 n +0000393568 00000 n +0000393829 00000 n +0000396543 00000 n +0000396825 00000 n +0000396925 00000 n +0000408484 00000 n +0000408787 00000 n +0000485923 00000 n +0000494024 00000 n +0000494295 00000 n +0000497444 00000 n +0000497694 00000 n +0000499130 00000 n +0000499391 00000 n +0000500993 00000 n +0000501276 00000 n +0000501376 00000 n +0000509153 00000 n +0000509425 00000 n +0000511480 00000 n +0000511719 00000 n +0000511857 00000 n +0000512139 00000 n +0000519613 00000 n +0000519896 00000 n +0000524231 00000 n +0000524481 00000 n +0000524581 00000 n +0000526472 00000 n +0000526744 00000 n +0000533459 00000 n +0000533741 00000 n +0000545251 00000 n +0000545523 00000 n +0000560506 00000 n +0000560788 00000 n +0000569985 00000 n +0000570267 00000 n +0000570367 00000 n +0000584663 00000 n +0000584945 00000 n +0000597123 00000 n +0000597395 00000 n +0000607867 00000 n +0000608139 00000 n +0000611254 00000 n +0000611547 00000 n +0000623997 00000 n +0000624269 00000 n +0000624369 00000 n +0000634880 00000 n +0000635151 00000 n +0000638717 00000 n +0000638989 00000 n +0000641545 00000 n +0000641817 00000 n +0000643111 00000 n +0000643372 00000 n +0000646874 00000 n +0000647145 00000 n +0000647245 00000 n +0000654197 00000 n +0000654479 00000 n +0000666918 00000 n +0000667201 00000 n +0000672968 00000 n +0000673250 00000 n +0000677042 00000 n +0000677292 00000 n +0000681100 00000 n +0000681350 00000 n +0000681450 00000 n +0000683245 00000 n +0000683506 00000 n +0000691201 00000 n +0000691472 00000 n +0000693726 00000 n +0000693998 00000 n +0000699843 00000 n +0000700115 00000 n +0000705315 00000 n +0000705586 00000 n +0000705686 00000 n +0000711312 00000 n +0000711573 00000 n +0000713060 00000 n +0000713321 00000 n +0000717785 00000 n +0000718046 00000 n +0000722426 00000 n +0000722708 00000 n +0000729716 00000 n +0000730009 00000 n +0000730109 00000 n +0000740917 00000 n +0000741178 00000 n +0000742800 00000 n +0000743061 00000 n +0000747157 00000 n +0000747418 00000 n +0000750424 00000 n +0000750706 00000 n +0000755188 00000 n +0000755460 00000 n +0000755560 00000 n +0000759773 00000 n +0000760023 00000 n +0000762064 00000 n +0000762358 00000 n +0000771946 00000 n +0000772218 00000 n +0000776424 00000 n +0000776696 00000 n +0000781217 00000 n +0000781489 00000 n +0000781589 00000 n +0000786973 00000 n +0000787266 00000 n +0000792236 00000 n +0000792541 00000 n +0000802457 00000 n +0000802765 00000 n +0000803962 00000 n +0000804104 00000 n +0000811131 00000 n +0000816097 00000 n +0000816380 00000 n +0000816663 00000 n +0000821687 00000 n +0000821969 00000 n +0000822069 00000 n +0000827694 00000 n +0000827977 00000 n +0000833381 00000 n +0000833642 00000 n +0000836586 00000 n +0000836868 00000 n +0000846133 00000 n +0000846426 00000 n +0000854266 00000 n +0000854538 00000 n +0000854638 00000 n +0000864756 00000 n +0000865006 00000 n +0000866525 00000 n +0000866797 00000 n +0000869947 00000 n +0000870197 00000 n +0000871890 00000 n +0000872162 00000 n +0000879636 00000 n +0000879897 00000 n +0000879997 00000 n +0000883927 00000 n +0000884188 00000 n +0000886306 00000 n +0000886588 00000 n +0000896246 00000 n +0000896518 00000 n +0000902473 00000 n +0000902734 00000 n +0000904811 00000 n +0000905118 00000 n +0000905218 00000 n +0000911887 00000 n +0000912126 00000 n +0000912265 00000 n +0000912536 00000 n +0000919073 00000 n +0000919323 00000 n +0000921021 00000 n +0000921282 00000 n +0000923115 00000 n +0000923397 00000 n +0000923497 00000 n +0000930427 00000 n +0000930720 00000 n +0000939412 00000 n +0000939683 00000 n +0000944777 00000 n +0000945049 00000 n +0000948782 00000 n +0000949032 00000 n +0000949319 00000 n +0000949601 00000 n +0000949701 00000 n +0000957854 00000 n +0000958126 00000 n +0000964815 00000 n +0000965065 00000 n +0000966692 00000 n +0000966953 00000 n +0000970974 00000 n +0000971256 00000 n +0000977709 00000 n +0000978025 00000 n +0000978125 00000 n +0001015042 00000 n +0001015183 00000 n +0001019187 00000 n +0001019479 00000 n +0001073064 00000 n +0001076381 00000 n +0001076663 00000 n +0001082253 00000 n +0001082556 00000 n +0001180524 00000 n +0001184924 00000 n +0001185196 00000 n +0001188867 00000 n +0001189117 00000 n +0001189217 00000 n +0001192715 00000 n +0001192976 00000 n +0001194331 00000 n +0001194603 00000 n +0001199161 00000 n +0001199463 00000 n +0001249086 00000 n +0001250410 00000 n +0001250671 00000 n +0001252377 00000 n +0001252638 00000 n +0001252738 00000 n +0001254528 00000 n +0001254810 00000 n +0001260901 00000 n +0001261172 00000 n +0001273927 00000 n +0001274198 00000 n +0001282121 00000 n +0001282360 00000 n +0001282499 00000 n +0001282770 00000 n +0001282870 00000 n +0001290717 00000 n +0001291010 00000 n +0001303344 00000 n +0001303681 00000 n +0001376801 00000 n +0001384570 00000 n +0001384842 00000 n +0001389327 00000 n +0001389629 00000 n +0001436807 00000 n +0001441044 00000 n +0001441305 00000 n +0001441405 00000 n +0001452345 00000 n +0001452616 00000 n +0001460519 00000 n +0001460804 00000 n +0001470313 00000 n +0001470649 00000 n +0001470684 00000 n +0001624788 00000 n +0001632888 00000 n +0001636701 00000 n +0001636983 00000 n +0001647073 00000 n +0001647366 00000 n +0001647482 00000 n +0001659876 00000 n +0001660126 00000 n +0001661459 00000 n +0001661744 00000 n +0001664872 00000 n +0001665111 00000 n +0001665250 00000 n +0001665533 00000 n +0001665568 00000 n +0001670910 00000 n +0001671195 00000 n +0001676735 00000 n +0001677008 00000 n +0001680392 00000 n +0001680647 00000 n +0001697073 00000 n +0001697098 00000 n +0001697677 00000 n +0001698108 00000 n +0001698176 00000 n +0001698447 00000 n +0001714790 00000 n +0001714868 00000 n +0001714893 00000 n +0001715193 00000 n +0001715367 00000 n +0001715435 00000 n +0001715706 00000 n +0001716554 00000 n +0001716632 00000 n +0001716890 00000 n +0001732403 00000 n +0001732678 00000 n +0001738569 00000 n +0001738836 00000 n +0001769358 00000 n +0001769630 00000 n +0001802388 00000 n +0001802640 00000 n +0001802708 00000 n +0001802977 00000 n +0001806983 00000 n +0001807061 00000 n +0001807086 00000 n +0001807458 00000 n +0001807807 00000 n +0001807832 00000 n +0001808062 00000 n +0001808130 00000 n +0001808403 00000 n +0001812577 00000 n +0001812655 00000 n +0001812824 00000 n +0001812892 00000 n +0001813173 00000 n +0001813198 00000 n +0001813495 00000 n +0001818277 00000 n +0001818355 00000 n +0001819138 00000 n +0001821591 00000 n +0001821646 00000 n +0001821725 00000 n +0001821820 00000 n +0001821915 00000 n +0001822013 00000 n +0001822114 00000 n +0001822215 00000 n +0001822316 00000 n +0001822441 00000 n +0001822678 00000 n +0001822730 00000 n +0001822834 00000 n +0001824863 00000 n +0001828579 00000 n +0001828657 00000 n +0001828699 00000 n +0001829178 00000 n +0001829435 00000 n +0001830193 00000 n +0001852003 00000 n +trailer +<> +startxref +1852303 +%%EOF1 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 15 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 23 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 37 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 54 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 70 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 89 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 105 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 125 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 144 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 161 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 175 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 194 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 210 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 223 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 236 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 260 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 280 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 293 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 308 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 327 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 341 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC]/XObject<>>>/Rotate 0/Type/Page>> endobj 357 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 375 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 393 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 398 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 460 0 obj <>stream + + + + + 2011-04-30T08:32:52Z + Scrivener + 2011-05-15T00:17:52+07:00 + 2011-05-15T00:17:52+07:00 + + + + Adobe Mac PDF Plug-in + + + application/pdf + + + Adam Bien + + + + + x-ray + + + + + uuid:e861431c-77d7-784e-a7dc-7f756ad21027 + uuid:d3853703-7d37-4a02-b488-1929a61e3437 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 467 0 obj <> endobj 468 0 obj <> endobj 469 0 obj <>/LastChar 111/Subtype/TrueType/Type/Font/Widths[542]>> endobj 470 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(167)Tj +ET +/CS1 cs 0.749 0.749 0.749 scn +57 616.6 1 24.4 re +f +58 640 202 1 re +f +260 616.6 1 24.4 re +f +58 616.6 202 1 re +f +260 616.6 1 24.4 re +f +261 640 189 1 re +f +450 616.6 1 24.4 re +f +261 616.6 189 1 re +f +57 541.6 1 76 re +f +58 616.6 202 1 re +f +260 541.6 1 76 re +f +58 541.6 202 1 re +f +260 541.6 1 76 re +f +261 616.6 189 1 re +f +450 541.6 1 76 re +f +261 541.6 189 1 re +f +57 503.8 1 38.8 re +f +58 541.6 202 1 re +f +260 503.8 1 38.8 re +f +58 503.8 202 1 re +f +260 503.8 1 38.8 re +f +261 541.6 189 1 re +f +450 503.8 1 38.8 re +f +261 503.8 189 1 re +f +57 466 1 38.8 re +f +58 503.8 202 1 re +f +260 466 1 38.8 re +f +58 466 202 1 re +f +260 466 1 38.8 re +f +261 503.8 189 1 re +f +450 466 1 38.8 re +f +261 466 189 1 re +f +57 442.6 1 24.4 re +f +58 466 202 1 re +f +260 442.6 1 24.4 re +f +58 442.6 202 1 re +f +260 442.6 1 24.4 re +f +261 466 189 1 re +f +450 442.6 1 24.4 re +f +261 442.6 189 1 re +f +57 404.8 1 38.8 re +f +58 442.6 202 1 re +f +260 404.8 1 38.8 re +f +58 404.8 202 1 re +f +260 404.8 1 38.8 re +f +261 442.6 189 1 re +f +450 404.8 1 38.8 re +f +261 404.8 189 1 re +f +57 367 1 38.8 re +f +58 404.8 202 1 re +f +260 367 1 38.8 re +f +58 367 202 1 re +f +260 367 1 38.8 re +f +261 404.8 189 1 re +f +450 367 1 38.8 re +f +261 367 189 1 re +f +57 329.2 1 38.8 re +f +58 367 202 1 re +f +260 329.2 1 38.8 re +f +58 329.2 202 1 re +f +260 329.2 1 38.8 re +f +261 367 189 1 re +f +450 329.2 1 38.8 re +f +261 329.2 189 1 re +f +57 305.8 1 24.4 re +f +58 329.2 202 1 re +f +260 305.8 1 24.4 re +f +58 305.8 202 1 re +f +260 305.8 1 24.4 re +f +261 329.2 189 1 re +f +450 305.8 1 24.4 re +f +261 305.8 189 1 re +f +57 282.4 1 24.4 re +f +58 305.8 202 1 re +f +260 282.4 1 24.4 re +f +58 282.4 202 1 re +f +260 282.4 1 24.4 re +f +261 305.8 189 1 re +f +450 282.4 1 24.4 re +f +261 282.4 189 1 re +f +BT +/CS0 cs 0 scn +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 63.3 620.6 Tm +(Number of interfaces)Tj +20.3 0 Td +(5)Tj +-20.3 -4.92 Td +(Interfaces)Tj +/TT1 1 Tf +20.3 2.7 Td +(XRayMonitoringMBean)Tj +-0.03 -1.32 Td +(XRayLogger)Tj +0 -1.32 TD +(ConfigurationProvider)Tj +T* +(MonitoringResourceMXBean)Tj +T* +(TitleCache)Tj +/C2_0 1 Tf +-20.27 -3.06 Td +<002A004D0045003A003D004A00010047003E00010034002900280001005D>Tj +/TT0 1 Tf +(les)Tj +20.3 0.72 Td +(2 \()Tj +/TT1 1 Tf +(beans.xml)Tj +/TT0 1 Tf +( and )Tj +/TT1 1 Tf +-0.03 -1.44 Td +(persistence.xml)Tj +/TT0 1 Tf +(\))Tj +-20.27 -3.06 Td +(Number of XML lines of code)Tj +20.3 0.72 Td +(14 \()Tj +/TT1 1 Tf +(persistence.xml)Tj +/TT0 1 Tf +(\) + 1 )Tj +-0.03 -1.44 Td +(\()Tj +/TT1 1 Tf +(beans.xml)Tj +/TT0 1 Tf +(\) = 15)Tj +-20.27 -2.34 Td +[(T)100(otal lines of code)]TJ +20.3 0 Td +(2645)Tj +-20.3 -2.34 Td +(Number of production classes \()Tj +/TT1 1 Tf +(src/main/)Tj +-0.03 -1.44 Td +(java)Tj +/TT0 1 Tf +(\))Tj +20.33 0.72 Td +(46)Tj +-20.3 -3.06 Td +(Lines of code of production classes \()Tj +/TT1 1 Tf +(src/)Tj +-0.03 -1.44 Td +(main/java)Tj +/TT0 1 Tf +(\))Tj +20.33 0.72 Td +(551)Tj +-20.3 -3.78 Td +[(Estimated man-da)30(ys)]TJ +20.3 0.72 Td +(3\2265 da)Tj +/C2_0 1 Tf +2.916 0 Td +<0051004B0001004C0047004C0039004400180001005D>Tj +/TT0 1 Tf +(rst \223production release\224 )Tj +-2.946 -1.44 Td +[(took 1 da)30(y)]TJ +-20.27 -2.34 Td +(Number of GlassF)Tj +/C2_0 1 Tf +7.762 0 Td +<0041004B0040000A004B0048003D003B0041005D>Tj +/TT0 1 Tf +[(c dependencies)-1478(0)]TJ +-7.762 -2.34 Td +(Fun factor \(1\22610\))Tj +20.3 0 Td +(11 :-\))Tj +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 471 0 obj <>stream +xXpיJ-Z۲-]!Lac9` L(-a[`C NoФm. \'ܥ^;AHkLCAȤ9r)w I +әdκ]4\WzV@ ƀ-"gШ90M݃랻``ؽ/> `~H8U:D9#Ȱ~Y؈#_&k~iӾ F-QC:< ~H@7| +h_E$ՏGy" +8<^oK )DC%É'^g d,1 o  +; $>Hܘ=<߁/ʷy_^0oΛax?)xmD dg0/mRW9"X9 -y=q]4珸Hozp sk5.f7_埃{3?W1~F῰n7xxNa0<_Ƙ![Ą yއ^D,O^꣥p".}`+9%;05lԸ~zMUUe_ZQܹ!K%KEKl9٢5+bH7 XEVxap8:]4VR7r)-]@/K +ؔvgku<T W!6,$^I7:{P mNQVoW0Vgk8bgnto$ pu2+V)9.+ҶW p'ޑ3SEfI![46G8&pYBP>\cuȊYgG1'-7نV{1cWrp*..Ը1ocrf/U꠽/c^':Dg޽-JAe*-'^: ӻW X7 "XrzCPUzz},A,]_g +($wh6sA7)iwE9Qvz׳rJ1N91($1@,cX0sʢ36z8Zٕ~E D:=]&#۟$$I-*n}*C!cvH7nz\clFᠻX}H(c[}-C]O #@%3II6*KJNe=ӊUF)$Ú\mvί!S_ze q+pũ.b6u;;dolnh=Sp;S~qnGwtOV|o/nۏ#&*8X3Gnr=Y7eI:!w"?S9µZQ曒78}SճD6웳\{kWCt ']Ď?9?:_v"ڑLUN؛Ȭ_>.- :k1-O<x1!pÜ^xŷGiZ62Ra[=hM:&9“ysF)4-ұ aa)gԱڹe:" gbq4lIgQli-\9rm)y{3SL)/g{.g0 ?J)%~S\%f<e!#$°e(E֍o +A䄰?!i~6ş_7$qpMe@? y>=`5J> o7GъRa8>=hA+Qv){gRۙ={aqqE.EKӼBH 9ys6KO 1_4C,6m~mFYd}*S2G JGYjZj:iZv&:VRYY,z5<:pžEEG-*xV(Q6 0cM +܃G="B8K?~6W?ϫTAZcb(AG*͵GЯ +yS>j%_WrŢ?Fws,mvqjLDeܷ͗Կk9̇ٯ`L:4߅Vʃ̒F{eC5_;?z3G@*wdy!8"k.a < f;IJ2! +;ؚ4Wwh9O6iC >K?_i6 +A8N@`ڬ{er%o4LHB.vBOlk~>E=Nb㡉]BC'*ܞ8Vq_8\De[E6،`ž .lG ҭ.-vO!Wsrج` +tyb}d}[8w;FU"=2zxQT4ЧtەJV00g2LZAYe 2JjVfc + ,9Բj&Tj`]՜O:1Nb'V;6'3Uld# +UHP1:F(E,gJF7؜mW>t_.MAb(E".@+ahJvs.I\xFD6 U/ +endstream endobj 472 0 obj <> endobj 473 0 obj [313 332 0 0 0 0 0 0 0 0 0 0 0 0 303 0 0 0 0 0 0 0 0 0 0 0 0 0 728 0 728 0 0 0 589 0 678 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 902 0 0 0 0 0 0 0 0 0 525 553 461 553 526 318 0 0 0 0 498 229 840 558 543 0 0 360 0 0 0 0 742] endobj 474 0 obj <>stream +x xTs%Ld#=!`@PMHťV mK~XMWuĊVbmQZ+j[Y2{Lfk>ors9f`@wWݼ(HK7Noni}7 e7ȑs̻+[ 7z~:kVS9cμ`oY4KpS=teOLgX~ت:L1v;M_)(DpX 'GQã=pH__;4ş'R JyLH!p%{6kJ\:~t +\껐9?AAAAAAEcL20 I˝QEͅ< Aj>>(B-Zű`P5%01! +e0 *P'A%jTVB jP 5PZ+އzh@ SQmSPBa{"Є:Mh#46A+j3LGm +3Pé3-7 b©0M,8 u6A= NGg΅yC{8Cx~x(<솇Qw#GQPQca'b#B}Ө{'9'@YxJ>xu?4D}^=KQ> !eԃB_Wb*Kg?kQ/ }D}-?mQ7]ԿP߄P*-x|{F}ށP߅Q&=8w80 A ce1&g + AcZTqzdYRƌ򸧀_rS1R   N^ W(t ot   /F*el\ˠgU4JqAAA_2L&(IWߵҥeFjE9djH]AAA'/f?RR*Ҧ**u|N   *͘qAGT,IK×(L:UAAA|ZU F|wAR]T\øJ'i%3UAAA|l>2@J/D(c*VtEsC   ݎqF;&*C*HJ}{ AWrAAA8hM\e1Wޥ%-AgЋXJX   t:y\542XD eLIwI` f4@ۮRAAAɋ¸J*L )W9*(gPFc"J$  8yqݠ~f\eNU.g2 & d]rAAAJ?&I;.MGԛOs%-U&QΈq*   Dc\q]RT?w2ѸiRAAAKFFt_qUҒ*Llwc#0   ׋q8&I7.K-$ޥHZjYnﻂ'HAAq򒝝 z4&I?.[RTzʓ6*Y6["J$  8y`0~a\t|?KI]I:좜Mu!-©   N^2DxqUNq[B.HUAAA'/`2~q\/%ԻTt]NK9t>.(JAAqS\\ feGeዿ5O*HZi4QmCۮ|G   `L8,؏DoKySAR0kBtgfX*XL|uURc   /`~$u\<|?KI]I˓q+XM|uUQa   /555`;~$m\BHSARqrפ%ޣJs_\yT    ɓpIrP,TwVrI~˃CG   `455۝6\2LoK©T4ՐֺWWU|.5&  b9ce@ T&LNjNZ +E,oOH|zRc   /'+0&i6&HrW[*X0í ։ >0AAAEAvoGeЄ/T4=k^*,,_<="   N^z{{ 辜qf `J*Hܵ0iUNs"géG   x0q0_eDhScXa-\[c1>~o;7x-DNi1er}]mMuUeŤ򲉥% Ey܀ߗdf]NfMF^ը,1(aьmڐ7t&=㷣r@2y?Q(ٟInW5 Z_3\QgaxDs-gG3zDs揶[86)شPZ F4ham& e6 tҒ#[rN4`3 8S{bÛ,6j9jZq^HO6 l7۳=׃ur~K_;c _Q.ċ)>@5،>5MWQ[Pt:~a<Вqo \n=c @Kk9/%$~M vyNg9MD]7:-}0=k`7?zS4.VоC\ 3Ȁ{3wvMbfoٓ)݉Lh5pFGqYVKD t2,57U*ۂ ʺGғH>n[Zց%A-8m:K 䍶nںd=gt{M.(.?3+2w^SюyGŽ[mpѲ{f {禡,;~XHYۣlݓ,ijC;+HXmiΖQov/::d$-Chz6S-U; ~Gzm/ ${A<%q`W $n%?=mިy[zz|sOf>l=חJMc::0 ?ۂӷEؕvAIMݍp_N?"U?(D~FW b{MctHF$LSi)m0."6.[p!·b"lҚ[=bk˓[y,Y:~\ne7.EV0.qـfkvtiU #~4>v&g_=Ͼp-փ6(ѹ]o ]dN1j,Ia,ԛ3j,IE #ۏ\6ų9=QpȌgSTg׋*Ď9 ƍSjʧ9xsЋsqpыҋSz{ʼn[0hsA`) gc V" +o_b؎xA97 +X-͸f._4n3V*Uvz":@u2j٫R`n^;as<ϲgq;-=h}cH#awAoPQcFn:|jРaxA;|^YHs//.n}nvWt}wwNݳ7z[525\|~Wf>wiy8n,tM9\~5ՀY0[6;n${Ř + +e vÓ`UcRLVLzUzsU66hko:5nWڢg4~;Ɏ^ϟ;tQvugTGoaBY֭-QMK_OTl^7,|Â"KKmkE]-}QW9.4V59OD{{y䢑ޑNɯa'< O$][a~?.\pk&%DѺKrv l/װ?3fze'%/`uj< 5b=S\U= XL)Uj6*]W7,oYO) XF=ƾ'= Xk[ +!ldQ̀jW4w^DO?Zp)>;vj?[I{Fi$EŮvTV_XYІ~=RQx3Ag ~÷1p#ySa azB| +{%]ЇmrP} QVJ\J|y>4G#)/2<`Q:Qc| h`ǀgD,Kfn%$wb6jAnq٬+;L&a. =ǂ6*;+ta, O*grPv+ٞ[s{qu߱GڣeO:I{4.QKh@!,+%iZY[օ9ʲK,t.׉&Q`fw]'C~ -`2A)>^xm-Б.:(hdwQ< +scʣ褎Hu*Q5u"),kBگJ2eee+&t3jRy>$܌)ǎ=T-O#$68rX0GՏր7p,eU4~B<1eZ KXÓsU+5`XQǞ߭THsO&iDN +Gm*4O:u3 EO*wVfJN6J'Viui]܎Fs5fL|V$ͨޝ"Uj]V7w2h^â/hD㱈Z~Z)qibGw8##? y9moC9Qe,K<8G.GH;R_?<ĺKhxUqӝƪ + + +*jjkj7ڧ82msO]y+_(+-h-Yz?uUշ6֪܅Mg}k.od5rdu'+ 2-'f.{ Q-v@6 "F4Qh4ltl*.cu~>b^">){wDdrnGH»9J.b.iRKi_-7=ΎoᲇX'Тp⑇ǾU\'EOXV$}\cX-V  jA/^먠|B|IKCT+JrUEkL*AoE‹n|Cxflo>1 +ߚ}-]fZZ$XX&q.«ƻeb:4"7qKr\+)+_"kuL)M IyJN1̐f[ &33J"d(Er2A_`hZ eaCV.R˕뺏Gd5ɉ,.H-М +mYmt2652ǜx[q;3 %lYl5It Bq ]a;1fUk t*f idG{VŠeXwLyX > (`&^+ jص4W,;ތ; +3"nc T9 4giW{XErj3M7e]&-3?\uaoozjضa[|(7xﮋ.kF viZo Ueײ>~=Y&s8 ^^A\Ǒ5j*Mj ?pLA2mzcm(%f|~~#fܙ;6> 7NHd.qx5>Ļ]i8 ;*jUF?A㦽%un Ϋjof9g1(/vZXn +Om sۙx~ٽOVU+<5n-m+ݳO(|ueeeΡLͦ{NġɐJsNCf37y`ěbxx㣱f/'CpEo:$:KTӿp-ޝ߯F}0dViFSeA;o{TfѦ4^ls1:C{Uog̉!>~Dxڀ7?vޠyWqd-vGF5ֳ;(U<ُu҂*>iSbW+pdJOM-llIR ; zkn"J#J,qsIx]P4Lx87f]0^^TXdNΌx;M. 4%7L@ Fs gDVf<@nv|o>xx594h4nMQbl.C %TN5u,HC񻬶-3ypKˬ9Y&+\ZxΤn卋nsgeN1}n9UOK]9/=K6-VKzL(`EVpy$]z+r] +K;ۇx2{7`Yr$e0`y,." +ZDcYFGRFRWis*U*.TU9ܯfi=+j9mXM< 80$fooGİ(ൈ @@ȸ/>wDg XɑNRi(HhA?m4헴պz5|}өׯ/w9ݳfw=0wBvq\ {}^S@rӉI 5X,?U3XFF`<:2Φ̣Ss|HVZpgEsޒKȣ%˥%1-t{qx/|kbrYf9I.CDǯ(q9+L,31XfO"ULkJå,dMNeќhBY4,V/[B bbw]Y7 O(w ~$6MVZ9 , Gqʅ啭%N`ŬC%NmΚ"/shIZUP\R*9w:lKhr ^Ot ÍQg F)vjW:,`.<юbb]Ac gd8M ,|OP%%ϢwZ1*?xx=`Y"n!>-ScB<*NDCDE(N*d8VWě@zƐyVXȓ6l]Un?:QcZٕXlrgYՠjgq=?zqbxv1Uu2"~T5_j6"a1F2ًzY|,[K Uv`x;Ə:>i(IC;$A6dݥnd0Z :Y4Qy$m縪2 vv{eWYz^D5aqN><|qb581?qr|4]ؽoTK#5Rf|lz c:D$B$]<%t)p2SAsBURHL +9,ʆSLS9*C}w@&4b翭4ZkCɳt.))~5c.x?8;J!/MX(TJs}; D$C%Fj̀L!*bb̙a1sfYc-5xK1kxvc +è0LLaJkT[ky,rb7I(:91q_w>莢 XSaS$6Ey4))c4gy({$旡1aXTypNzڃiOܯѦ><7YaL\EGقx: i$$I_MN}$Z8%Þdí_#xbҙbFg=k2&aT9Q>q{] ~TW[ϙ%9 s= ZRc'U?֗>~ kQZ<ҵH]j2J ]h='׻kIq #'CH!t6,22i6,*!K.V̉0GɆ"PE*f> )PH ԓJ0)愘IHm$B]{@g ?3G1=羂W鮮NޚYyc^@ x?$#qIaYyJ!D?ԓX5  U؆|+S f~j'ٖMwb^ʥsY7OF-Yd1*;&;FjID`Ҟ@1i0Io{\.m;X!R%7ѠNvb|?f*smkoڷ%p i7ߧ@bI$GDbW7%F"؋NWLqz SfSMb=fѹE0`=B>ϱ}'_}=& KOzO;gUݜ}.VZcTnhQKЋ-FW$]廾t +ZWE*^P DSk|0ͱԅGT`K_3 yQy_Ƽ?/e?9*h6N>Ij,(qFKh[ȥ)T#ܓlΨz{^b6jU1BʿܦjGk_=L1 +}"ITBZ"gDyhn4J^X.Y>l4q6٪?`/?z߸׹N冿_a co((B2t??qȉFuoR<)iIP]TXh8EX3U84fLI3i&ͤ4fLI3i&ͤ4fLI3i&ͤ{bCZtrHy̚M9=x2^0Z|9/^ =q <Ɵ-*%_e=&'gBY'zb#Va8C GQp JlXUqaqtس>?7p*ktW3(k)_,z}x.kՐ2ԒWQ*'rlDO_'kVePQVt*:ȏKH2<1fȂ{SWXouZW7!ߊ*Rk/R%J hU.:*ףKa*v{SS+Pa3xu'ղhRgjgsJ Irqh˸ZϤA[/1-6!E:BK" 臎@~+l,jvVh1+,-B>ya Cc ëy66WVP^6z&ZcOa +˪W!\HJwԱU)f֣,Wس\Lۚ!٪]c|urg꫒qΛ^y5WI6OT#yRK?}S{&:y.yas@+lnr.K}pnRZ2ͦrrZtԖ0Y|wYʻlvdF/?eaUai,?fP!5"V.+9DL1Fx3D|<1A<-|#c`}H[Doh뀷h~6B?k5ڟbw_aMu uBgo֡7X5E.n G>}r}%Q- ~Ϡ"Rʾ+4!bDy՗T"֔gR~먂T1͏5GRM4ܩFӇiV> VY;UĊ?,w(^6Qꂺ #W]֟FͿ dԒʶ[7Օ[IZ^d8 MeaG*ٮ%DLI⾂ +})"11R-K1~Ś O1~ 1>V0r1d63ēHKIG>GhC¨GF~Fr!+:4DT7AN̑ փaJ1g}C,I6E?<]٩kq} ,ix"J"o/ +1Qwg{#g;v &PNt'L1ޫ\ub=bٺ1܍S{ևqMa냡=J_{N:g][wa|i=8)[\l!Dg}~\~ٰ.ب.u<˓*.^gMX؇Q;{ oQ2w<}+knaߙvF΄{:Cؗ6b6,(ȯXDH'j{"q}>xssZ1O1hɊ <1E&IR4"ҿ_cbB1Av!6?H +b!vC*=r~-UMvjq4-4~xk׭=B|uWLyƪ + Wy9-<-zvB(;@& /( jV'+]B`( nUr}5jDw[ =(p['Ro-C )'S:Dv6D>GIFO8'\U52j> UԪsbU)A?--]=} 賥tt@y3ʛ|yYIي/B/\qew[,^ԯ:]9.֠ϵmѾ4,k a  <ú -;KFOYQ/~ypy4%{>kkˍk֓4Ap<`=:suPstė&z%(%8e\w I)zrw\cR󰍸yiM%6=K9̖@%fKvGwR$meI|7;lж2)>aAZo;6G BS`vwtWZVS?ٛw᎓V2݉R+oA1,w +渊46>$9lRmeam2 q1\ʸŽпfzmb|{9Lbf:>DfwܧD1}<\qcL>NMr/]djQӊۤz1ѕ!SA1# R&&=)AuaQ W{鮑P+Ò >W20tjt\\A% fSq5}?*ܷ Bx=f4ţq=եb'/Eyb4׺=bg Ed2zóTَ~RD=14Dŝ~3i>8-rJg#Rxܓ 9t!)R2܅zSI6~&&mԪ@2t-n2|] <^"-+i]KmGےmhxO<(OY']D}e_N<RW4h_:% Wծ5n& fb|:oBV]/EU#7Aΰ!MȐ?*,:<1^<%g{r)ʾ1\~v4O]@k4 >v+֮LGuZWcGŎ+MG]Ԋڭ]%Ci'zEwZOx3צ-QPLbvS֋9i5^++`RfccQm::]EAKiZu7cM75} _ + +k2,s/b{q +`qs ns ns6c85:q +$(3.fxM#68,.;'ݍ)#b8:Q?3+5c>8zV6&SIt/:ҽ̃)Tt@c+3x:XzsNZK>LeKuuLٸ"lNe)gt\Tk&c8ECpM遦`7= +3, 7fg n4ys$y<=7Yz7{$cq;Xro񔸦AȤڳOjmi]]c][`5-`.8CC&l~yS7z][! Aq;jЙHu&827dORpz %=냇? M't݋c+h54 Oh4z1wƶn7ynN,-sG>4NCtw7\ o<4m{#c-?Ԝm9ڜ9"P} yv%(h|{'>wjN\{ޣRusOz ,-}'O? {^}`767!4 &SқoycZKRs4Pxz,M>esu pγ.zÛ(6xW;)TP,Xl_ /ymjo_*yYȧǧžiNl74557/l-h^xӷyYmr Zss Q'N3g7<҅ҷVeAg+5.£bEK˨-Ex_ zy8|rߺj"_qss9l$h_rŷyW?g=x,H#4 9WNy,S1k3Y9N:14kv2NaE|h~X'PO%c/1=Sf|<|>؊_֑c)^ڷ9̥>jcK Kw=k}qm`Wi[Wi Z{>&{Eڻij^)4ͻ7oyE j2'-aGZ4;X9(r${Gj1pgͨyБ pd{3'Wx&8f5Ε.lJ \?Xb6G=tҔqe.;4k+GFV·caG<;Q~َ1~ñiIVomZc=ڴB`IiT%vҴ&C$sLRTibS!ZJM1MA}iTS#`co`ɎM``78 f85Φ,ǩVnGwS[p|IpQKmԟu'Ǩ䌯]YQolnu6 +ܹwY;|Y;|ȹww;|OS4uZ}{BղxvzRY|t.q|<<Άwx5-Z ޠ]- '-+7o SjYO-`?y՟ٲ.Aٛ9fwm 9.7ւw;j 4N_Ӳy,U+U}wdNz[KdI%_"d $FZ|.B"*n^*7Gr49\u"wzAuz1yRcgչ*iuάޮ~{Qݪ~hFBQWX,,. +Kl]!O!Q/|[ͧ +{N>Mn_;Go.1ۼGg>J[Ow_{^w}>_M- i2ʽ"+rrGrGsx **/./1/%/-oaޒey+ yàa80o=6}CH4{5{ ]X' ]3gF%7ʍ5wD+xx/>.HǓ>O"I,K}X*92s#Wb7qLRn27zv5;6!qc4JgѪXkH7F cL#o1 +,c1ΘhLAm1͸иĸ̸°ʘm4MhS{Rf(uzAC>PZcXk(2\3v,Mm6H݆Sko8 K y)f/'b_b{=paM`KkХ6R gR( ?$ ?~D~" o oo?~J E]R"SًƱ=[EHVP'tdVrMubSi`V&Ŵ˴Ǵn050413]ʿ_ߟ???3vx~IiҚbLy^|"R`mզK;[Wis=.i +H  H˄_ O=BY./O$~$R[K{} ̺| y(xӛ_(S>T|||/>aOϘϙ/S/ӊ/*K[K@ 6@,X5klc~+1خ1ch֦mBaB%f!b]q81.qs「(0s?=s=ǻo춧x]ǹgy4zV&y6TN+8Muگ]WֵջSQ׵tx5!Wu=Yx?A^sggZ gG_}]էq90\eMP{e=]<4oy}5܆8GL(u4۞ܪAq5ޣ<\t yCOZk 1?_-<nks6⯵5]csF<"7ƍJ9!ǃGǥ:h5Lˣuus(iލh^hz!Nx-Tw] Ww&>mE5^cxigރ! o3t:uۉ5( .뒷ն |몷};Zs}G}EE2iR_/_GuވƉ4+=7x]zm,Dc:nq![4׏ڠvλ}[?u1ns}W[|ףkԐ߽wӽw'Zݚn-xm=݋i1uOs x/5ݧ޻awp̾G'qTM>DOb~tl_R7 6r[j/ PdXXb{(Z!`UonUo~t_vOV7 ZU>Z+r6Vy}+qз&WU}뫶\U;|U}}-UuU};T5WpWھ=~0_UP-3`Q̗:neK}:}?18wYXGјQ%of_q?\>D&u>Y˺s/V;_]u| $'.?_n/8my--ӍJ5回sDϷD^ӓ/8=Kqzr'Wqzr'wD rD7OOtD,so8:z':=s>eʯ9)pv%zc!}J]T2$$V2%E%JJ$9zeɚ%.AG{IuIdKvGAJڈ0M wqO5w_ѳ1JBqw/QzA]8K)ubcL{٨Ni'MmV~ߦ?$|mxH l|l$a$7 #^ +xNSGED69d~#唦 O?E2E:mf.Jg( +{.phED`vpOGcAjz-.s^ x-}X`o|b4K+Zm.ma`(QWI8ckK3Igc ]npO\/pZwpG?KdnS*QA#L1UN{8V HX6S9vاZܽNעk , T*³G \?@6BF{Zz)\\²eIwC|dMp8$L!K(y&3o/9q*ƬTQreC˩BJ֖6܁!?9g6rK]Gr 3 vv(N- +ՆKO;,P#j #t<%33ΡЅХU͜+wy-;. W,vnnNH(BGcxExuYEY'zOi.59-wwA + 7ۈ: wRIW;S'|? __ oӘ_\hxc~ǬJ6NUcI:a vNkGOUIHEC"!J͔(Sj.,ļ.Jݔt(]k).❈Е=\GexvF9z&d]X_ΖXTdi\BL`%"%'( (&p8 RlPs7`V]{ j  Z(AJ 8EpJ_PT7ne,;@p_L*$mlݪ0©8lci|D9UqvZg~156^x4&_r +5_u"&_ͭkoRr:'brm6n$ck8[\C|^fmOǮSӳ1xT~ 1\GPGpoS~v?&Z,koVqusy|?hqv\ #3=Z??3{b9qsZ|Rsa쌎r#]S]tjqrW^Lۏ{2 C<9ONSt9}},YD 4tt 1n\5C*C05U\Se nN]?HPP({@ Ip_TT\Q`ނ .Z^b4oFqZz:p7{)m^eT v (5/h[о<%KJP2L' q؆wM>L%fbYcxdɟ&~Ep-P&O^Ve[^Zn>wO=0 +uTyߨOnߓOFtc4o[Dgxg B+;zp%7/_{榼<']<yHd0m+sSnd_?>M$7Qsn|Ƨ9}㓽zLy&t~`ɾ}lʳYKK7<6Y= `μ R4VNzܵeoϷ.|ϹWWWs3:Ƨ9wL&J9ms ӜS<>eeM迸:rr'?{؄{MTL^ļ luO+cS#a>6Ij |z|||w> ݽM;_gEP_EG>ω*>{= +j21Ym:Z!@G'0$Z^L{zY]bZI6?z\:(?k֜B^[ɶjm_tۮn}[_ ߷ uN)] 35nj<+ˬ9yWB[-"\COgSRNyiUm/s9Hg։YP}:oE?>(oV~)eM[E %I+5#GċkG^3me[5/k{{cUzJ$Q$fgcuFƦ6Nd_mM٣9էiikܐ}~/,=?LG-=I%GWݢ_H#;/zƋ&tCf~yP;t;EX4.⩌333vj4vf.fetκ2 娟fmTwwIw)t=H@[&]œXEMh']@4O sNH9"yڣa֭Ghݚ~Һ*gOzo=9@!!z'qMeV7$4 w;pY;Hz*;#+#궺I43cMv7n&NnJ׺,Ilmf6m"{ݙY/ߧdQsu)tzkv]59u-ӯ_qu_zs=_8h2Pm~[LǗ+ma&n6z"uD V0ITjJ bP?jDm,[ n#;= mFt'"'CA !PnC +oYXZ2[5B :dA>(jCb[H/bE붫^brժ?㏲茱{xESL)<Z4{O?'$NXL=DOp[':ݙz!69[I;;RRMx-S̍gn<3@e7{8ըSJX=[+R=[fJm~Lk}QJ3A%eѴi)RZZ/BjIY"ʔ= E)I\JZiԤVBEB)wy;mB\ja.⧶8Ô8SOtʪl `)Jωp8 +ҘmQWLCb])g]-PuS)nN)Nل6kt_:IR8C׍cviI(7S&KV׎ᚥKpd픹1\Y<ӶǏir-x[n9AtgA钻D$&?hwQ,L"_UxJ! l!q6O=x~7b` JSۥ5zmoxicxN $"J ^T5gbEK<ǽ+Ka]Wo,O KrjØB 1»)D_`0w˘u4w7ӺB3xB|OD} M 1t}LoC>~+F歘{ߊVL] +7c"@x4NyveY3-;ft 1xrrr'ie0I[ʆMB7$'u*iԡ$iJ.fV<_OdMbxg -Ba!&S(0Z=D`bRBsfi'b +L_$ʆċ;'Mn|mreiv괬I,|yrf&7S<"IdYjYcYCeN15]XNniɄY@w~}ӓR*1$'pt5AXͷk慤3IŋIk6$' $6Q,94@kj&"tM^ܐTkӵI\k+ 7)2vFlJ@5,zFJ'?(fb*Tz]d<Ae~Mp`⻘b]zV#Dy$񠩇F%6v'NjHlKL5P>|?3dC(6)ͦdWQGZRMI6MOA}n' {b7xS%$3ƬI(ώM#?ph$FjOZ᳑bm^ `%\` иf\=wKgOt?(x͸KGZ(8RD/k;sFgFZ9t{B~>v2 g&1OA8U61/݄~!}[t![+}Z?'Cq uu/}2!Mȼ_ut`<=\|:u! :cV.}Xwj8ǹi9|׻k$Ew0>m.O1ֽJ%ztfR+,hѻ]. +Yl9Uj`۬dW D~o #rq[6lE+OAwHCeT굓E6?#}f̴6 *z?)'GnC v +(1´ 8X|#?'ATK9-qjό?V%Ԑz7[0S<rx㛈nyF7#k*Vh$aK3sK/]f(M7n8qf?˰pGq> {5rsKCk3&u8K WY7R|#mR<& >Gc1=@ۆZkY1#0hwɥġx}1Z ,sA_~gNT.HbL3a2Yd)~(6xM":#I׈Ζn3Gu$^_{X_hDˋJ{_%OiKtm~E Oa+ A涿ﲔ!JXIFg'JoeIy܃{jL6˭})S[*x +_yf&<OЏAw !}ن|x}8 (1 z/h2)/rs=:mOfVBO1dA2 @ʮi@ӌέ6igv*KPUAZ+u]yF-~90#5E({-l[z7V*>#FPiA_]MJ)${!a:|ޅ>˚gC4IFd}y x|vɒGj@rR-a) 4 c!<6,!1,gBy"b%#rziId-0g]H2xʚGb|.`?`4hӟ9YƆπp>8/XfJ-c\ȼ~߀?܎н6a//C󻠋Po-mK, 1vt׃:Ծ z#^pA[/5|,N3mQ.Ȅ@ÇY;8A_!$&`xL ipZQ!J'( znԾ ]V F+Bhˀv7%J#[p/z8_4mO;I +hzjA`p8pc +$ΗA `7|6wމ#.G+Ya,Nk)'L|32>827t/A | ."[ zc8!{](]~?zy^G!fBJ۱ߠXȴl Np986[w}QӠ_S|?}@$~_l7e<CGYr;8{W^k$gDDD $bjE bJI5BH$"Ʀ*fA EQhQ R$wN}so]Z]wO]XNV(h2~ hBD/R}un +T X1ѻ +$ԅFyN>Qba\j8_PDfQ+l'ml (2g__A8[LsDPA8G sSA8l"X+x2^aU8aXCB;.Jb2Wj.4_sYhdžҞLꐱb stf4a Ӝ8&%I#4}CpUR"m_H4ׁZcOP6C-!.6Ƣ/!7B3!U9hw4 kχ}l"Ԋ +y0|`{hj@ȨECsm~O<54Y[̡ǵ U!C܆.,+p4@p/A^hrQba\j8_PY&3􉨋95%:Dc|yČ8av,!V᭚ ֶ,xԵ'4!:d\-P:C3հ fGق7 +7ɐ-'Lh2 39;hfnzg\9nB.]3]yK00W)Aݖx8F/_-(Rߪ]E!NL82I#eSRcJAi>0S4GɑBv7U;4v%)e1^M3֒Ө,js#4c w"w!S2f;ɱ +7֒S +\r:lRfw!2JwCs<-\&6>HVMqZ!7ԼKr.~ %VIFsC47/c|`-R/\&/@j0`,N>o!=wzyk1.<`9_b˷c>FH!{>s'뎆r+}]L^ wwə5hZ!Gaè%}9Pw feo967t{ mR +RV'B +uwV!f<?9au"sސCsV{uČ/3OMzz.Rq8ZUdfz|a<\ K'بX\_Y sk`rHzb 1?njA`y_kɜ(Q=o3d_܆@l# 1{2".YZK#1Bϭk?o@k7c|^T%yX,mL,l*t^ L!Ǻ ΛsGjof}wc!hAAteKY̪W5IFY"1'6x1w4x Rt) Ç! D6?gܑճɁoQk|gw)k2aRoFkWi}cDB\X:·ݬnZ9xERD}ɛPA0'$jx2 ?'yWf:x;w! eBn +(0GRFN[|V@0|Si*K~DR(5$'"k/v1x':"-beu"ڗ6x@J1bKK*]jy uxJ&}YZ?nKv`-f- o{1aQ/5 +P/,ـ|O@3 *H$@3%J>vԘ[o]#X>XЄIka]vK#E9i,+Pl F/]0^WEe o+Up(yw"*E2C }( X 'gMP 3ֿ'E]m%ZʼQäDHl* `9їQLz᳾nzQ3c:|WfHs_Ċ,l"HKj82O6WB=5VH޹iQ(/,II*ϖ1ۣn#*l:^>U&>٤y|W]fo5D7fأJfA,ω؋_"σ[ wgwK4%$rO;aF4B}_R %"c'XGy>2'e}3T+R6 z/@\׍QW4,e7[Zh?ZfK{K\'7Jv] w]iJ÷B%T u0qY Ww!6fkm } ƤN` :oU`̈M$8$4`?^>=` +~7 }v߄o(C#}̓6>91-#RCR#>A!5jٚ:2Ǽ l`Xbp*}4UXh#ahnAnU${ZJH?wBQDV6rH˂2WzZ%ZƜ d +K޴ ^FJЙy3Ct#ёƝ] r#ހ7F}JYOD#eSEzNгjg=ޡx#w(j_FcvDf˫npr6cyc7Vy f,}##5y5h2X?rr;jA =( W [k>[})H ߌo[!鐷c@^K%\zs)< aaϡ|n7ĕWP>l%K_/;(@} 0)G!9QAgF}ēc̖Z>0HOz4c,샺- 0R +a,鐛aF`E-Gis 31ہ( >4vI>I4K>M2l@k54vc텣_z=&wTD>l")G$Vo NMzp {EVO X =Dٲ]*"EMB/$:cgvZ|y&I4c7=DFE޲e3 J>'F~B&Q0{&BԬb;Z81f#zJU!==>F }G|<ȓd'mAs1%.;q,Ӵā'j|b,5tpd";0iM:0MwhYVR"t4Va.91Yr,aI:( +G~J谯e*ssXQQq l08 3m1~3"&p n  +EĀأꨈ9#v!ɿ7*k@7P{Kֿv8 FB7=?kZ,aXGcDfE,fv-;NfLf)`h|Z3N})Qi3F,gK= P#P_-8GL+8^M<)壍qƸP~ta]s׾K\)AƼY3֖uf""0&TsYbxn{4&RՄ3s+DZȪS'VՌ3V'LV뙰p|js+ERMz.K3k[=p,ϭW.SϬq|nc.;F4M/1⍑?V2l0S``牵Ou/5 ^je0k0R`H]0g0R```$40 2ih0`?a2`H3#- FZV#o+L3b ~t0xyॣH'#t1 +FB Ft7a0j0α#VdRLVk/#} FF7 7y`d`$`dHb f Ɗ6b3'%^:eKK6#$4I4e0d021k02`dHG# F>6d0FR F&L1VLTi3L73#A*9j8YRdoV_lf%R:cCjiХRW[2a7ِ I)_Ū!ΧM|tgՓĹt-TGO=}if:z'"!eY +gՖ)SlGsux4|G:wx2G\e79"4®LU~_o|d YeՑZmf|$`yW8oWP=`/lWo;+W%/)N3$.texB/=WJeRdZ`lӽ!/L&_SI>TAŐ;גrBHN:S)!d>vCo~.͏ox*AC8wC~vH%t!]qHW!Y5q-c[(GEoDG20]{LALG[ )̢VRV \e*Y)[m]ٮ|#*D~KuWz6aϕ=˶rU+ T#)+eUR*KYew +6@?-s++l܆_O/@-'S?7>ܓ{ܗqT4>s/<o[v 1~̯7~#^POgԋe^C}P_%d"NDҨrTPuzR}j@)56vԞޡN.unԃzR_OP 4G1P}Bh-ŴV*ZK_З}M{;Q:N'H?t~TDfU´*mGۧkG)vEjSV"(؜m+܉;«Ϋ3ڑu̙fd)| +|*sO+gR|b.K|!sbV/DYW|_SFjZ/՗Z$)椒Z̬%YZ+ɝYk$Oֆ*P֖*Se֎Q5LkOu@ޡ@ +d5b 5a5cR jP+jźRkjB-e(Yw@XHY(uά'u.PMݩ;CR¨cQ$EM,P>R,@ >$Jb4ƱL,&DEh$wLh4 4 PeaEY,r(Q.6xLYmml$,vn6oYl4l #l,clQO'$@>3t%9:>*`Ky|w?x>?*oyO,TOy r&*MesZN+i Mv.0]$^^Y9Z?mF[mҶj;]w vIEU=^L6/~Dfcl&d69i.'d-g++|eCrArE^*䆼Tyy RY%OrK^K呗* /UD^F^T +2rQUj8VG橁RY[**U EVCV⏬RYŎ   !2@#dM"4Ch %2@+dZ#Ah  =2@dw:"tB .2@d!ݐ#@,"{"{!{# "~!f!f#f#f f?@F f"f#QAhDDPDh "t"t8"4G& BG"*kgy39_W5|+wZ;ȏS,̯\=c$(ZANd#7 /&AGv +^FAHchhR:M4ʤlZMh#mzh<$&/iWVk봍m_syvUiBlQQ$*M3bAxKŋ{+LkIy' ~=w!`?WТL?p#rMy?o2+;w9vfK<5Xq&/]cGG'OLl֍mI|UUd9/Wyh||OICc+si`7?ʹ?IO5bBoURM&Vٳ/fG!}6n쵳j~xa;eJyØ.<4{O^PR^%Ck-oZ:ܲjoo{&Vjג7&7˝5_;2##"/8t5(*wLٽ^ B6Z3!.)dW"gߪ܈ƻuSENi>}lo>3ezɷ'-,|5[ie5V[}ƖrEߑ_kOYeOlV2)K)Mr럟 &1z[.9"RrzWwj[qxDLx+7mf7>zS9y͛[ۨWLq死Lɗf\0lW{7/]/ϧonZWH5};xV>тC7hhyZٯCb]z8YXNk;;>}us\YQ-UNQT>\e}߹^rOe+7ԭ= 3qWK_|%Y)iSfo~sSMVwR!OXC[|{l5AOo~9o\ҌQ.xu7YQ~ +l_΋wu2u_L=ҧFЗ }XcOht!yu'6tf~teD:;JO#+SȤPS٭f'qB#p#U>1JTsqW +WSȫtr K B_ЮR*(ApƉk=:;$);쭤:Ze8α^cf'?V:65Yϼ6_td;]x?zQ\n:eưMLTՕ;1) +z4?ݭӶ}Gh2COfxtf{ݒ'yj+ˆ'W~pٚP0zMksXY2'O£l3{UhgT[3X >ۿRgwhaLݗp''M*rc"3V +ތ#y_24&00 0aCpCl S&悅#ڵ[?0gOOny/r8igD8orPm=ߡqvN”2WIo}:dyӣmVɩOprN.Ϸ ;Kk퉪Y߾+N8YDf]T[=ǥk_'SN{0rO~WnuyEͫ|Z2`|?[0[`M>PXR͵W̵!<~=3t liٯp\wzD_,hg=8mWsjWy{Sǹ(~zT.{^ZhdeO{~`tL_R2E [&!oTz='UԖY7Ь~XsW?axOH4:*iTv=*{f&ەt?c'ROڧ^lӚ8jB͓~,h'r>||ezN|tG=x;}:\Δ9>{tipkILaD>ӏ+/u/گf psťnc3FFo:z*tk_XaʟK*eU'ˍlnuo~ViS.?vmz˗>>As}CzUm[2p6iY n_a>ߒc=}3E>nôKܾJ؄!5:MAAei*~ uz 40.zs<Ɏz-Z߿hЉv7= 'il@>e!?ޗ>̂ +۶oyݪBK#4; c.ۚr{7o_d>yargo(ѯݦʲ%,:K&Cͻ,%챇bn딞{%gYSonN^Ճ7vkK$%ͻ짭}OE `ϭR9Tg 8-pKSYٱU$afǔǖ)yuv@AG!!%ьR@M4'/ \ϵs{ԙlkMcs~Qb,n%ۚm-j-aGw'x4>yR{jo_b*3 +whLu"%>l!ERNne'?W,7䛷yoܬSAcj~&׷uuKQZJXK JZJ%ɉTi)L*^X`+ޭRG)Q;24ՉUڽ{K+}ԖRk=̧:c\gaKjq>?~vWweJ9`W꺫_yy᧣x,ڲL3kQ'jj`:W1p)}ΩzgX͇z'mI-*_(I#ª˺g&˸epꇁ}Ɏ_>ܕ!%Sǻ9Y]p5lbY ,3124` #_x@^;i03W,hdr2 ]q ˊFC`)9aKŧEo?hch>!!!!H+012+ hZ +[RY^XQVB4123mbbۗ9nțgk_ۺW)l~] '{6Ozڈ)eTZl3_/Y 9FnJ1,)?4ٷڨ5*Nj,dlqyP7;|7+ln|kYZ<÷9\]/Y7<~ii{oڿ[KҶ/Pb-}U,7qsm>bΗrګ㯽.+"x!B?v?ߖ_&]WtSEY f{D*Q*pvh\k B@;2T[caOf|XzuRh(iۦJ+_/˧_wkf5K?52jeш xdkVO41iOde$$˹>lc$stۤTyx3Myic"EVxi|q-H[I&gIMw֪_x5G[:˫]V#;uJW f;ftj3wd7k?4ˋC?cʼn^{O1_yM6\×9jos +endstream endobj 475 0 obj <> endobj 476 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(165)Tj +ET +/CS1 cs 0.749 0.749 0.749 scn +57 367 1 38.8 re +f +58 404.8 201 1 re +f +259 367 1 38.8 re +f +58 367 201 1 re +f +259 367 1 38.8 re +f +260 404.8 189 1 re +f +449 367 1 38.8 re +f +260 367 189 1 re +f +57 328.7 1 38.8 re +f +58 366.5 201 1 re +f +259 328.7 1 38.8 re +f +58 328.7 201 1 re +f +259 328.7 1 38.8 re +f +260 366.5 189 1 re +f +449 328.7 1 38.8 re +f +260 328.7 189 1 re +f +57 262.1 1 67.6 re +f +58 328.7 201 1 re +f +259 262.1 1 67.6 re +f +58 262.1 201 1 re +f +259 262.1 1 67.6 re +f +260 328.7 189 1 re +f +449 262.1 1 67.6 re +f +260 262.1 189 1 re +f +57 224.3 1 38.8 re +f +58 262.1 201 1 re +f +259 224.3 1 38.8 re +f +58 224.3 201 1 re +f +259 224.3 1 38.8 re +f +260 262.1 189 1 re +f +449 224.3 1 38.8 re +f +260 224.3 189 1 re +f +57 172.1 1 53.2 re +f +58 224.3 201 1 re +f +259 172.1 1 53.2 re +f +58 172.1 201 1 re +f +259 172.1 1 53.2 re +f +260 224.3 189 1 re +f +449 172.1 1 53.2 re +f +260 172.1 189 1 re +f +57 148.7 1 24.4 re +f +58 172.1 201 1 re +f +259 148.7 1 24.4 re +f +58 148.7 201 1 re +f +259 148.7 1 24.4 re +f +260 172.1 189 1 re +f +449 148.7 1 24.4 re +f +260 148.7 189 1 re +f +57 110.9 1 38.8 re +f +58 148.7 201 1 re +f +259 110.9 1 38.8 re +f +58 110.9 201 1 re +f +259 110.9 1 38.8 re +f +260 148.7 189 1 re +f +449 110.9 1 38.8 re +f +260 110.9 189 1 re +f +q +52 72 432 569 re +W n +BT +/CS0 cs 0 scn +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 630 Tm +(Some Statistics)Tj +ET +Q +BT +/CS0 cs 0 scn +/TT1 1 Tf +0 Tc 0 Tw 64 0 0 64 443.416 552.8 Tm +(9)Tj +/TT0 1 Tf +10 0 0 10 75 474.4 Tm +[(In )-120(this )-120(c)18(hapter)74(, )-120(I )-120(w)12(ould )-120(like )-120(to )-120(share )-120(some )-120(unrelated )-120(x-r)12(a)30(y )-120(services )-120(statistics )-120(to )-120(gi)18(v)12(e )-120(y)18(ou )-120(an )]TJ +-1.793 -1.44 Td +[(idea )-5(about )-5(J)12(a)30(v)24(a )-5(EE )-5(6 )-5(beha)30(vior)74(, )-5(deplo)12(yment )-5(requirements, )-5(and )-5(runtime )-5(\223o)12(v)12(erhead.)55(\224 )-5(J)12(a)30(v)24(a )-5(EE )-5(6 )-5(is )-5(still )]TJ +0.007 -1.44 Td +[(judged )-46(with )-46(the )-46(experience )-46(in )-46(mind )-46(from )-46(its )-46(8-y)18(ear)55(-old )-46(predecessor)74(, )-46(J2EE )-46(1.4. )-46(In )-46(pr)12(actice, )-46(J)12(a)30(v)24(a )-46(EE )]TJ +0.002 -1.44 Td +[(6 is ev)12(en leaner than its \223competitors.)55(\224)]TJ +3.6 -2.24 Td +( )Tj +-2.97 -2.34 Td +[(S)-61(i)-61(z)-61(e )-530(o)-61(f )-530(t)-61(h)-61(e )-530(d)-61(e)-61(p)-61(l)-61(o)-49(y)-61(m)-61(e)-61(n)-61(t )-530(a)-61(r)-49(c)-43(h)-61(i)-43(v)-49(e )-530(\()]TJ +/TT2 1 Tf +17.814 0 Td +[(x)-61(-)]TJ +-17.839 -1.44 Td +(ray.war)Tj +/TT0 1 Tf +( = )Tj +/TT2 1 Tf +(x-ray-services)Tj +/TT0 1 Tf +(\))Tj +20.23 1.44 Td +(76 KB)Tj +-20.2 -3.83 Td +[(Size of the x-r)12(a)30(y probe Roller plug-in \(REST )]TJ +-0.03 -1.44 Td +[(client and Roller integr)12(ation\))]TJ +20.23 1.44 Td +(28 KB )Tj +-20.2 -3.78 Td +[(Size of the Roller 4 deplo)12(yment ar)12(c)18(hi)18(v)12(e )]TJ +-0.03 -1.44 Td +(\()Tj +/TT2 1 Tf +(roller.war)Tj +/TT0 1 Tf +[(\); ev)11(erything is bundled with )]TJ +0 -1.44 TD +[(the )37(W)]TJ +/C2_0 1 Tf +2.53 0 Td +<001D002E0001005D>Tj +/TT0 1 Tf +[(le; no J)12(a)30(v)24(a EE 6 functionality )]TJ +-2.53 -1.44 Td +[(\(suc)18(h as JP)55(A, EJB)24(, and so\) on is used)]TJ +20.23 4.32 Td +(24 MB)Tj +-20.2 -6.66 Td +[(Dur)12(ation of a full deplo)12(yment on GlassF)18(ish )]TJ +-0.03 -1.44 Td +(3.1 \()Tj +/TT2 1 Tf +(asadmin)Tj +/TT0 1 Tf +( from the command line\))Tj +20.23 1.44 Td +(3.2 seconds)Tj +-20.2 -3.78 Td +[(Dur)12(ation of a full domain installation with )]TJ +-0.03 -1.44 Td +[(resour)12(ces \()]TJ +/TT2 1 Tf +(asadmin)Tj +/TT0 1 Tf +( from the command )Tj +T* +(line\))Tj +20.23 1.44 Td +(26 seconds)Tj +-20.2 -3.78 Td +[(Dur)12(ation of full Ma)30(v)12(en 3 build with Scala)-2356(26 seconds)]TJ +0 -2.34 TD +[(Dur)12(ation of full Ma)30(v)12(en 3 build without )]TJ +-0.03 -1.44 Td +(Scala)Tj +20.23 0.72 Td +(5 seconds)Tj +0 g +/GS1 gs +/TT3 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT4 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT3 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 477 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(158)Tj +0 Tc 0 Tw -20.132 57.06 Td +[(Entities )-14(with )-14(similar )-14(responsibilities )-14(are )-14(organized )-14(in )-14(pac)18(kages. )-14(Suc)18(h )-14(a )-14(pac)18(kage )-14(is )-14(named )-14(either )-14(b)18(y )]TJ +-0.006 -1.44 Td +[(abstr)12(acting )-40(the )-40(responsibilities )-40(of )-40(all )-40(included )-40(entities )-40(or )-40(b)18(y )-40(using )-40(the )-40(name )-40(of )-40(the )-40(most )-40(important )]TJ +0 -1.44 TD +[(entity)92(. )]TJ +1.8 -2.24 Td +[(In )-283(later )-283(iter)12(ations)]TJ +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +[( )-283(y)18(ou )-283(extend )-283(the )-283(pac)18(kage )-283(with )-283(reusable )-283(services )-283(\(the )-283(\223control\224\) )-283(and )-283(a )]TJ +-1.806 -1.44 Td +[(dedicated )-3(service )-3(interface )-3(to )-3(the )-3(outside )-3(w)12(orld )-3(\(the )-3(\223boundary\224\). )34(A )-3(pac)18(kage )-3(named )-3(b)18(y )-3(its )-3(domain )]TJ +-0.005 -1.44 Td +[(responsibilities )-15(with )-15(dedicated )-15(external )-15(interfaces )-15(is )-15(a )-15(business )-15(component. )-15(It )-15(is )-15(created )-15(according )]TJ +-0.003 -1.44 Td +[(to )-333(the )-333(\223Maximal )-333(Cohesion, )-333(Minimal )-333(Coupling\224 )-333(principle. )-296(All )-333(containing )-333(elements )-333(inside )-333(a )]TJ +-0.002 -1.44 Td +[(business )-101(component )-101(should )-101(ha)30(v)12(e )-101(similar )-101(responsibilities, )-101(but )-101(different )-101(components )-101(should )-101(be )-101(as )]TJ +T* +[(loosely )-54(coupled )-54(as )-54(possible. )-54(Some )-54(business )-54(components )-54(do )-54(not )-54(need )-54(to )-54(maintain )-54(an)18(y )-54(\(persistent\) )]TJ +0.004 -1.44 Td +[(state )-380(and )-380(so )-380(as )-380(entities)]TJ +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +[( )-380(they )-380(are )-380(created )-380(considering )-380(the )-380(responsibilities )-380(of )-380(controls )-380(and )]TJ +0.006 -1.44 Td +(boundaries. )Tj +1.8 -2.24 Td +[(X-r)12(a)30(y comes with sev)12(en business components: )]TJ +/C2_0 1 Tf +-0.7 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(configuration)Tj +/TT0 1 Tf +[(: )-10(Responsible )-9(for )-9(centr)12(alizing )]TJ +/C2_1 1 Tf +20.608 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation )-9(in )-9(one )-9(place )-9(and )-9(consists )-9(of )]TJ +-20.604 -1.44 Td +(boundary and control)Tj +/TT1 1 Tf +(.)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(logging)Tj +/TT0 1 Tf +[(: )-273(Responsible )-272(for )-272(creation )-272(and )-272(injection )-272(of )-272(loggers )-272(and )-272(comprises )-272(a )-272(single )]TJ +-0.005 -1.44 Td +[(boundary pac)18(kage. )]TJ +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(maintenance)Tj +/TT0 1 Tf +[(: )-24(Comprises )-23(only )-23(a )-23(single )-23(subpac)18(kage: )-23(the )-23(boundary)92(. )-23(Manages )-23(cac)18(hes )-23(and )]TJ +0.004 -1.44 Td +[(returns the current v)12(ersion.)]TJ +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(monitoring)Tj +/TT0 1 Tf +[(: )-63(Responsible )-62(for )-62(exposing )-62(runtime )-62(data)]TJ +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +[( )-62(suc)18(h )-62(as )-62(the )-62(number )-62(of )-62(exceptions )]TJ +-0.005 -1.44 Td +[(and )-417(the )-417(slo)12(west )-417(methods)]TJ +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +[( )-417(and )-417(pro)12(viding )-417(access )-417(to )-417(diagnostic )-417(data. )-343(T)45(he )-417(business )]TJ +-0.001 -1.44 Td +[(component )-19(monitoring )-19(consists )-19(of )-19(the )-19(boundary )-19(and )-19(entity )-19(la)30(y)18(er)74(. )55(T)45(he )-19(entities )-19(are )-19(tr)12(ansient )]TJ +0.003 -1.44 Td +(and used only for JSON/XML serialization.)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(statistics)Tj +/TT0 1 Tf +[(: )-83(Exposes )-82(daily)92(, )-82(hourly)92(, )-82(and )-82(minutely )-82(statistics. )-82(Contains )-82(the )-82(boundary )-82(and )]TJ +-0.003 -1.44 Td +[(entity la)30(y)18(ers. )74(T)45(he entities are tr)12(ansient.)]TJ +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(store)Tj +/TT0 1 Tf +[(: )-51(T)45(he )-124(core )-124(business )-124(logic. )-124(Manages )-124(the )-124(hit )-124(and )-124(referer )-124(cac)18(hes )-124(and )-124(computes )-124(the )]TJ +T* +[(statistics. It contains all three la)30(y)18(ers \(entity)92(, control, and boundary\))]TJ +/TT1 1 Tf +(.)Tj +/C2_0 1 Tf +-2.5 -2.24 Td +<005B>Tj +/TT2 1 Tf +2.5 0 Td +(useragent)Tj +/TT0 1 Tf +[(: Computes user agent \(bro)11(wser\) statistics and contains all three la)30(y)18(ers.)]TJ +-1.8 -2.24 Td +[(Most )-4(of )-3(the )-3(components )-3(are )-4(dependent )-3(on )-3(the )-3(logging )-4(functionality; )-3(some )-4(need )-4(a )-3(reference )-3(to )]TJ +-1.802 -1.44 Td +(the )Tj +/TT2 1 Tf +1.696 0 Td +(Hits)Tj +/TT0 1 Tf +[( )-85(boundary)92(. )-10(T)45(he )-84(CDI )-84(ev)12(ent )-84(mec)18(hanism )-84(w)18(as )-84(used )-84(to )-84(decouple )-84(business )-84(components )-84(and )]TJ +-1.7 -1.44 Td +[(get )-304(rid )-304(of )]TJ +/C2_1 1 Tf +5.025 0 Td +<004B004D0048003D004A005E>Tj +/TT0 1 Tf +[(uous )-304(coupling. )-304(X-r)12(a)30(y )-304(components )-304(are )-304(a )-304(perfect )-304(example )-304(of )-304(the )-304(\223Maximal )]TJ +-5.025 -1.44 Td +[(Cohesion, )-357(Minimal )-357(Coupling\224 )-357(idea. )-283(T)45(he )-357(example, )-357(ho)12(wev)12(er)74(, )-357(is )-357(r)12(ather )-357(unrealistic. )-283(T)45(he )-357(strict )]TJ +0.005 -1.44 Td +[(decoupling )-350(between )-350(components )-350(is )-350(possible )-350(only )-350(because )-350(there )-350(are )-350(no )-350(relations )-350(between )]TJ +T* +[(persistent )-273(entities. )-273(In )-273(more )-273(complex )-273(scenarios)]TJ +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +[( )-273(y)4(ou )-273(will )-273(ha)30(v)12(e )-273(to )-273(deal )-273(with )-273(cross-component)]TJ +10 0 0 10 279.085 88.8 Tm +19.993 0 Td +( )Tj +0 g +/GS1 gs +/TT3 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT4 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT3 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 478 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(151)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +[(J)12(a)30(v)24(a EE Lo)12(v)12(es Stress and Laughs )37(About JUnit)]TJ +64 0 0 64 443.416 539.8 Tm +(7)Tj +/TT0 1 Tf +10 0 0 10 75 461.4 Tm +[(Unit )-69(tests )-69(are )-69(absolutely )-69(necessary )-69(to )-69(v)24(alidate )-69(the )-69(functionality )-69(of )-69(y)18(our )-69(business )-69(logic. )-32(At )-69(the )]TJ +-1.795 -1.44 Td +[(same )-104(time, )-104(the )-104(necessary )-104(surrounding )-104(infr)12(astructure )-104(makes )-104(y)18(our )-104(life )-104(harder )-104(and )-104(slo)12(ws )-104(do)12(wn )-104(the )]TJ +0 -1.44 TD +[(execution )-112(time, )-112(so )-112(it )-112(is )-112(a )-112(good )-112(idea )-112(to )-112(moc)18(k )-112(out )-112(the )-112(incon)12(v)12(enient )-112(infr)12(astructure. )-112(In )-112(production, )]TJ +0.001 -1.44 Td +[(ho)12(wev)12(er)74(, y)18(our code will be executed against the real infr)12(astructure. )]TJ +1.8 -2.24 Td +[(T)45(he )-105(correct )-105(inter)12(action )-105(among )-105(all )-105(components )-105(is )-105(v)24(alidated )-105(during )-105(local )-105(integr)12(ation )-105(tests )-105(\(for )]TJ +-1.795 -1.44 Td +[(example, )-305(with )-268(Arquillian\) )-305(and )-305(remote )-305(integr)12(ation )-305(tests. )-305(Remote )-305(integr)12(ation )-305(tests )-305(are )-305(usually )]TJ +-0.003 -1.44 Td +[(performed )-144(in )-144(an )-144(integr)12(ation )-144(en)12(vironment. )-144(Unit )-144(tests )-144(fr)12(amew)12(orks)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-144(suc)18(h )-144(as )-144(JUnit )-144(\(http://junit.org\))]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +0.001 -1.44 Td +[(are )-166(often )-166(\223misused\224 )-166(in )-166(a )-166(good )-166(w)18(a)30(y )-166(for )-166(the )-166(implementation )-166(of )-166(a )-166(test )-166(dri)18(v)12(er)74(. )-129(A )-166(unit )-166(test )-166(usually )]TJ +0.004 -1.44 Td +[(in)12(v)18(okes the real \(REST\) service and v)24(alidates the result against the expected assumptions.)]TJ +1.8 -2.24 Td +[(Although )-91(applications )-91(alw)18(a)30(ys )-91(run )-91(concurrently )-91(in )-91(production, )-91(unit )-91(tests )-91(and )-91(integr)12(ation )-91(tests )]TJ +-1.795 -1.44 Td +[(are )-88(executed )-88(in )-88(a )-88(single )-88(thread )-88(sequentially)92(. )-88(Contention, )-88(tr)12(ansaction )-88(isolation, )-88(cac)18(hing )-88(beha)30(vior)74(, )]TJ +0.005 -1.44 Td +[(memory )-183(consumption, )-183(consistenc)24(y)92(, )-183(performance)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-183(and )-183(robustness )-183(aspects)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-183(in )-183(particular)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-183(can )-183(be )]TJ +T* +[(viably )-28(tested )-28(only )-28(under )-28(massi)18(v)12(e )-28(concurrenc)24(y)92(. )46(T)45(he )-28(earlier )-28(y)18(ou )-28(test )-28(the )-28(concurrenc)24(y)92(, )-28(the )-28(easier )-28(it )-28(is )]TJ +/C2_0 1 Tf +0.002 -1.44 Td +<004C00470001005D>Tj +/TT0 1 Tf +(x the bugs.)Tj +/TT1 1 Tf +12 0 0 12 57 221.8001 Tm +[(Stress \(T)100(est\) Kills Slo)12(wly)]TJ +/TT0 1 Tf +10 0 0 10 75 199.4001 Tm +[(Stress )-97(tests )-97(are )-97(fun. )-60(And )-97(there )-97(is )-97(only )-97(one )-97(mission: )-97(\223Kill )-97(My )-97(Serv)12(er)]TJ +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +[(\224 )-23(T)45(he )-97(more )-97(load )-97(y)18(ou )-97(are )]TJ +-1.808 -1.44 Td +[(able to gener)12(ate to \223kill the serv)12(er)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[(\224 the better)74(. )]TJ +1.8 -2.24 Td +[(Stress )-168(tests )-168(are )-168(great )-168(for )-168(learning )-168(about )-168(the )-168(beha)30(vior )-168(of )-168(an )-168(application )-168(serv)12(er )-168(under )-168(hea)30(vy )]TJ +-1.796 -1.44 Td +[(load. )-38(Memory )-38(consumption, )-38(the )-38(typical )-38(number )-38(of )-38(w)12(orker )-38(threads, )-38(the )-38(usual )-38(depth )-38(of )-38(the )-38(request )]TJ +0.004 -1.44 Td +[(queue, )-27(the )-27(number )-27(of )-27(rolled )-27(bac)18(k )-27(tr)12(ansactions, )-27(the )-27(number )-27(of )-27(requests )-27(per )-27(second)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-27(or )-27(the )-27(number )]TJ +-0.003 -1.44 Td +[(and )-382(length )-382(of )-382(major )-382(garbage )-382(collections )-382(are )-382(only )-382(a )-382(few )-382(examples )-382(of )-382(interesting )-382(runtime )]TJ +0.001 -1.44 Td +[(par)12(ameters. )]TJ +1.8 -2.24 Td +[(Y)129(ou )-233(should )-233(test )-233(under )-233(hea)30(vy )-233(load )-233(not )-233(only )-233(the )-233(application )-233(serv)12(er )-233(beha)30(vior)74(, )-233(but )-233(also )-233(the )]TJ +0 g +/GS1 gs +/TT3 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT4 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT3 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 479 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(144)Tj +ET +q +452 570.8 -377 -350.75 re +W n +q +378.1170502 0 0 351.8666382 74.4414825 219.4918671 cm +/Im0 Do +Q +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 200.4 Tm +[(F)18(igure 6: F)]TJ +/C2_0 1 Tf +4.521 0 Td +<0041004C0046003D004B004B003D0001001F00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation in Hudson)]TJ +/TT1 1 Tf +12 0 0 12 57 164 Tm +[(Build )92(Y)129(our F)18(itnesse)]TJ +/TT0 1 Tf +10 0 0 10 75 141.6 Tm +[(F)18(itnesse )-74(test )-74(code )-74(is )-74(built )-74(and )-74(tested )-74(as )-74(a )-74(standalone )-74(Ma)30(v)12(en )-74(module. )-74(It )-74(is )-74(pac)18(kaged )-74(as )-74(a )-74(J)18(AR )]TJ +-1.799 -1.44 Td +[(project \(see Listing 83\) with the F)18(itnesse and )]TJ +/TT2 1 Tf +(fitlibrary)Tj +/TT0 1 Tf +( dependencies.)Tj +/TT2 1 Tf +1.8 -3.58 Td +()]TJ +ET + +endstream endobj 480 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(138)Tj +/TT1 1 Tf +0 Tc 0 Tw -18.332 57.06 Td +(x-ray-services)Tj +/TT0 1 Tf +[( )-294(is )-292(deplo)12(y)18(ed )-292(\(with )-292(the )-292(alread)24(y )-292(discussed )]TJ +/TT1 1 Tf +27.789 0 Td +(asadmin)Tj +/TT0 1 Tf +[( )-293(deplo)12(y )-292(command )]TJ +-29.591 -1.44 Td +[(wr)12(apped )-260(as )-260(the )]TJ +/TT1 1 Tf +7.604 0 Td +(x-ray-deploy)Tj +/TT0 1 Tf +[( )-262(Hudson )-260(job\) )-260(into )-260(the )-260(freshly )-260(created )-260(and )-260(started )-260(GlassF)18(ish )]TJ +/TT1 1 Tf +-7.609 -1.44 Td +(x-ray)Tj +/TT0 1 Tf +[( )-6(domain. )31(After )-6(the )-5(deplo)12(yment )-6(of )-5(the )-5(application, )-6(the)]TJ +/TT1 1 Tf +[( )-6(x-ray-fitnesse)]TJ +/TT0 1 Tf +[( )-7(job )-6(executes )-5(the )]TJ +0.001 -1.44 Td +[(functional tests remotely)92(. )]TJ +/TT2 1 Tf +12 0 0 12 57 550 Tm +[(F)18(itnesse + J)12(a)30(v)24(a EE = Good F)37(riends)]TJ +/TT0 1 Tf +10 0 0 10 75 527.6 Tm +[(Functional )-109(tests )-109(are )-109(similar )-109(to )-109(integr)12(ation )-109(tests )-109(\(and )-109(sometimes )-109(ev)12(en )-109(unit )-109(tests\), )-109(but )-109(they )-109(are )]TJ +-1.794 -1.44 Td +[(dedicated )-53(to )-53(stakeholders )-53(with )-53(domain )-53(or )-53(business )-53(responsibilities. )-53(Integr)12(ation )-53(tests )-53(are )-53(dri)18(v)12(en )-53(b)18(y )]TJ +0.005 -1.44 Td +[(dev)12(elopers and functional tests are dri)18(v)12(en b)18(y product o)12(wners or business experts. )]TJ +1.8 -2.24 Td +[(T)45(he )-230(primary )-230(goal )-230(of )-230(functional )-230(tests )-230(is )-230(the )-230(v)]TJ +/C2_0 1 Tf +20.291 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +[(cation )-230(of )-230(the )-230(correct )-230(functionality )-230(of )-230(the )]TJ +-22.089 -1.44 Td +[(system. )-101(F)18(itnesse )-101(\()]TJ +/C2_0 1 Tf +<0040004C004C00480017000C000C005D>Tj +/TT0 1 Tf +[(tnesse.org\) )-101(is )-101(an )-101(excellent )-101(tool )-101(for )-101(bridging )-101(the )-101(gap )-101(between )-101(dev)12(elopers )]TJ +-0.001 -1.44 Td +[(and )-61(domain )-61(experts. )-61(Domain )-61(experts )-61(are )-61(able )-61(to )-61(maintain )-61(the )]TJ +/C2_0 1 Tf +27.286 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +[(cation )-61(and )-61(execute )-61(the )-61(tests )]TJ +-27.283 -1.44 Td +[(without an)18(y dev)12(eloper interv)12(ention. )]TJ +1.8 -2.24 Td +[(F)18(itnesse )-40(is )-40(a )-40(\223wiki )-40(on )-40(steroids\224 )-40(that )-40(comes )-40(with )-40(its )-40(o)12(wn )-40(read)24(y-to-use )-3(W)37(eb )-40(serv)12(er)74(. )-3(A )-40(wiki )-40(page )]TJ +-1.798 -1.44 Td +[(can )-274(be )-274(created, )-274(v)12(ersioned)]TJ +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +[( )-274(and )-274(maintained )-274(directly )-274(from )-274(the )-274(UI. )-237(W)18(iki )-274(tables )-274(are )-274(treated )-274(as )]TJ +-0.002 -1.44 Td +[(\223bidirectional\224 )-236(test )-236(data )]TJ +/C2_0 1 Tf +11.156 0 Td +<0006005D>Tj +/TT0 1 Tf +[(xture\). )-162(T)45(he )-236(input )-236(is )-236(parsed )-236(and )-236(passed )-236(to )-236(a )-236(declared )]TJ +/C2_0 1 Tf +25.474 0 Td +<005D>Tj +/TT0 1 Tf +[(xture )-236(class. )]TJ +-36.629 -1.44 Td +(V)Tj +/C2_0 1 Tf +0.612 0 Td +<003D004A0041005D>Tj +/TT0 1 Tf +[(cation )-1(is )-1(performed )-1(and )-1(the )-1(actual )-1(outcome )-1(is )-1(compared )-1(with )-1(the )-1(expected )-1(result. )-1(Successful )]TJ +-0.616 -1.44 Td +(tests are highlighted as green cells, failed tests are red)Tj +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +[( and exceptions are y)18(ello)12(w \(see F)18(igure 5\).)]TJ +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 481 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(131)Tj +/TT1 1 Tf +0 Tc 0 Tw 18 0 0 18 57 624 Tm +[(Dev)12(elopment Process)]TJ +64 0 0 64 443.416 539.8 Tm +(6)Tj +/TT0 1 Tf +10 0 0 10 75 461.4 Tm +[(Dev)12(elopment )-57(of )-57(enterprise )-57(applications )-57(shouldn\222)37(t )-57(be )-57(an)18(y )-57(different )-57(than )-57(dev)12(elopment )-57(of )-57(plain )]TJ +-1.8 -1.44 Td +[(J)12(a)30(v)24(a )-98(SE )-99(applications. )-98(J)12(a)30(v)24(a )-98(SE )-99(applications )-98(are )-98(built )-98(according )-98(to )-98(the )-98(\223Write, )-98(Compile, )-24(T)100(est, )-98(Run\224 )]TJ +-0.005 -1.44 Td +[(c)24(ycle, )-334(w)18(hic)18(h )-334(should )-334(also )-334(be )-334(applicable )-334(to )-334(J)12(a)30(v)24(a )-334(EE )-334(applications. )-334(Unfortunately)92(, )-334(because )-334(of )]TJ +-0.003 -1.44 Td +[(dependencies )-347(on )-347(external )-347(resour)12(ces )-347(and )-347(serv)12(er )-347(runtime, )-347(running )-347(and )-347(testing )-347(an )-347(enterprise )]TJ +-0.005 -1.44 Td +[(application )-89(without )-89(an)18(y )-89(impro)12(v)12(ement )-89(takes )-89(too )-89(long. )-52(Also )-89(setup, )]TJ +/C2_0 1 Tf +28.791 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-89(and )-89(deplo)12(yment )]TJ +-28.79 -1.44 Td +[(are )-174(too )-174(complex )-174(to )-174(be )-174(performed )-174(in )-174(an )-174(ad-hoc )-174(manner )-174(manually)92(. )-174(By )-174(splitting )-174(the )-174(testing )-174(into )]TJ +0 -1.44 TD +[(sev)12(er)12(al )-173(manageable )-173(c)18(hunks, )-173(and )-173(introducing )-173(automated )-173(setup, )]TJ +/C2_0 1 Tf +28.346 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-173(and )-173(deplo)12(yment, )]TJ +-28.344 -1.44 Td +[(y)18(ou can get remarkably close to a build c)24(ycle of a plain J)12(a)30(v)24(a SE application. )]TJ +1.8 -2.24 Td +[(A )-203(fully )-203(automated )-203(build )-203(and )-203(deplo)12(yment )-203(c)24(ycle )-203(is )-203(the )]TJ +/C2_0 1 Tf +24.635 0 Td +<005D>Tj +/TT0 1 Tf +[(rst )-203(step )-203(to)12(w)18(ards )-203(the )-203(DevOps )-203(idea )]TJ +-26.432 -1.44 Td +[(\(http://en.wikipedia.org/wiki/DevOps\), )-175(w)18(here )-175(the )-175(boundary )-175(between )-175(dev)12(elopers )-175(and )-175(oper)12(ations )]TJ +T* +(blurs.)Tj +1.8 -2.24 Td +[(T)45(he )-83(separ)12(ation )-83(between )-83(dev)12(elopers )-83(and )-83(oper)12(ations )-83(is )-83(r)12(ather )]TJ +/C2_0 1 Tf +26.47 0 Td +<0039004A004C0041005D>Tj +/TT0 1 Tf +[(cial. )-46(A )-83(dev)12(eloper )-83(has )-83(to )-83(set )]TJ +-28.273 -1.44 Td +[(up )-39(the )-38(en)12(vironment )-38(for )-38(dev)12(elopment )-38(and )-39(test )-39(and )-38(could )-39(reuse )-39(his )-39(automated )-38(process )-39(for )-38(building )]TJ +T* +[(the )-265(integr)12(ation )-265(en)12(vironment )-265(and )-265(ev)12(en )-265(the )-265(production )-265(en)12(vironment )-265(as )-265(well. )-265(DevOps )-265(tries )-265(to )]TJ +0.003 -1.44 Td +[(automate )-275(ev)12(ery )-275(reasonable )-275(step )-275(and )-275(treat )-275(the )-275(recipe )-275(as )-275(code. )-238(A )-275(fully )-275(automated )-275(process )-275(is )]TJ +0.003 -1.44 Td +[(repeatable, )-94(so )-94(y)18(ou )-94(can )-94(apply )-94(the )-94(same )-94(par)12(ameterized )-94(automation )-94(for )-94(local, )-94(test, )-94(integr)12(ation )-94(and )]TJ +-0.005 -1.44 Td +[(ev)12(en production en)12(vironments.)]TJ +/TT1 1 Tf +12 0 0 12 57 178.6001 Tm +[(Build and Deplo)12(yment)]TJ +/TT0 1 Tf +10 0 0 10 75 156.2001 Tm +[(X-r)12(a)30(y )-59(w)18(as )-59(dev)12(eloped )-59(with )-59(NetBeans )-59(7 )-59(\(J)12(a)30(v)24(a )-59(EE )-59(edition, )-59(http://www)74(.netbeans.org\), )-59(tested )-59(with )]TJ +-1.802 -1.44 Td +[(GlassF)18(ish )-56(v3.1, )-56(and )-56(built )-56(with )-56(Ma)30(v)12(en )-56(3 )-56(as )-56(a )-56(J)12(a)30(v)24(a )-56(EE )-56(6 )-56(project. )-56(It )-56(consists )-56(of )-56(eight )-56(Ma)30(v)12(en )-56(projects )]TJ +-0.008 -1.44 Td +[(\(some )-286(are )-286(prototypes\). )-212(T)45(he )-286(bac)18(k-end )-286(code )-286(discussed )-286(in )-286(this )-286(book )-286(comes )-286(from )-286(the )]TJ +/TT3 1 Tf +38.595 0 Td +(x-ray-)Tj +-38.599 -1.44 Td +(services)Tj +/TT0 1 Tf +[( )-89(module. )-14(T)45(he )]TJ +/TT3 1 Tf +10.949 0 Td +(x-ray-services)Tj +/TT0 1 Tf +[( )-89(module )-88(is )-88(a )-88(self-contained )-88(J)12(a)30(v)24(a )-88(EE )-88(6 )-51(W)45(AR )]TJ +/C2_0 1 Tf +27.663 0 Td +<005D>Tj +/TT0 1 Tf +[(le )-88(with )]TJ +-38.61 -1.44 Td +[(REST)111(, EJB beans, CDI managed beans, and JP)55(A 2 entities. )]TJ +1.8 -2.24 Td +[(I created the structure of the J)12(a)30(v)24(a EE 6 project with a Ma)30(v)12(en plug-in called \223ar)12(c)18(hetype\224 )]TJ +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 482 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(124)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( public final static String TOTAL_HITS = "hits";)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( public final static String HITS_FOR_URI = "hits/";)Tj +0 -1.79 TD +( public final static String TRENDING = "trending?max=5";)Tj +T* +( public final static String TODAY_HITS = "hitsperday/today";)Tj +0 -3.58 TD +( public final static String YESTERDAY_HITS = "hitsperday/)Tj +0 -0.99 TD +(yesterday";)Tj +0 -1.79 TD +( private final static Logger LOG = Logger.getLogger)Tj +0 -0.99 TD +(\(XRay.class.getName\(\)\);)Tj +0 -1.79 TD +( private static final int TIMEOUT_IN_MS = 100;)Tj +0 -3.58 TD +( public XRay\(String url\) {)Tj +0 -1.79 TD +( this.baseUrl = url;)Tj +T* +( })Tj +0 -3.58 TD +( public String getHitsPerHour\(\) {)Tj +0 -1.79 TD +( String uri = getUrl\(HITS_PER_HOUR\);)Tj +T* +( return getContent\(uri\);)Tj +T* +( })Tj +T* +( )Tj +T* +( public String getTotalHits\(\){)Tj +T* +( String uri = getUrl\(TOTAL_HITS\);)Tj +T* +( return getContent\(uri\);)Tj +T* +( })Tj +0 -3.58 TD +(//some getters omitted)Tj +T* +( public String getHitsForPost\(String post\) {)Tj +0 -1.79 TD +( String uri = getUrl\(HITS_FOR_URI\);)Tj +T* +( String encoded;)Tj +T* +( try {)Tj +T* +( encoded = URLEncoder.encode\(post, "UTF-8"\);)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 77.3 Tm +( } catch \(UnsupportedEncodingException e\) {)Tj +ET +Q +BT +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 483 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(118)Tj +0 Tc 0 Tw -20.132 57.06 Td +[(the )-214(method )]TJ +/TT1 1 Tf +5.597 0 Td +(loggerNameCorrespondsToClassNameNoDebug)Tj +/TT0 1 Tf +[(, )-218(the )]TJ +/C2_0 1 Tf +26 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation-dependent )]TJ +-31.596 -1.44 Td +[(i)-35(n)-35(j)-35(e)-35(c)-35(t)-35(i)-35(o)-35(n )-518(o)-35(f )-518(t)-35(h)-35(e )]TJ +/TT1 1 Tf +8.721 0 Td +[(X)-35(R)-35(a)-35(y)-35(L)-35(o)-35(g)-35(g)-35(e)-35(r)]TJ +/TT0 1 Tf +[( )-518(r)-35(e)-35(a)-35(l)-35(i)-35(z)-35(a)-35(t)-35(i)-35(o)-35(n )-518(i)-35(s )-518(v)-11(a)-35(l)-35(i)-35(d)-35(a)-35(t)-35(e)-35(d)-35(. )-518(I)-35(t )-518(i)-35(s )-518(a)-35(n )-518(e)-35(a)-35(s)-35(y )-518(t)-35(a)-35(s)-35(k )-518(b)-35(e)-35(c)-35(a)-35(u)-35(s)-35(e )]TJ +/TT1 1 Tf +-8.736 -1.44 Td +(LoggerProducerIT)Tj +/TT0 1 Tf +[( )-37(has )-35(direct )-35(access )-35(to )]TJ +/TT1 1 Tf +18.669 0 Td +(LogUser)Tj +/TT0 1 Tf +[( )-36(as )-35(well )-35(as )]TJ +/TT1 1 Tf +9.065 0 Td +(Configuration)Tj +/TT0 1 Tf +[(. )-36(In )-35(the )-35(method )]TJ +/TT1 1 Tf +-27.735 -1.44 Td +(createTestArchive)Tj +/TT0 1 Tf +(, )Tj +/TT1 1 Tf +10.797 0 Td +(DebugConfigurationProvider)Tj +/TT0 1 Tf +[( )-41(is )-39(deplo)12(y)18(ed, )-39(w)18(hic)18(h )-39(sets )-39(the )-39(v)24(alue )-39(of )]TJ +-10.796 -1.44 Td +(the )Tj +/TT1 1 Tf +(debug)Tj +/TT0 1 Tf +( entry to )Tj +/TT1 1 Tf +(true)Tj +/TT0 1 Tf +( \(see Listing 69\).)Tj +/TT1 1 Tf +1.8 -2.12 Td +(public class DebugConfigurationProvider implements )Tj +-1.8 -1.32 Td +(ConfigurationProvider{)Tj +1.8 -4.24 Td +( @Override)Tj +0 -2.12 TD +( public Map getConfiguration\(\) {)Tj +T* +( return new HashMap\(\){{)Tj +T* +( put\("debug", "true"\);)Tj +T* +( }};)Tj +T* +( })Tj +T* +(})Tj +/C2_0 1 Tf +-1.8 -2.24 Td +<00280041004B004C00410046003F000100130016001700010020003D003A004D003F0001001F00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation Helper)]TJ +1.8 -2.24 Td +(Also)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +2.544 0 Td +(DebugConfigurationProvider )Tj +/TT0 1 Tf +16.328 0 Td +[(w)18(as )-126(dev)12(eloped )-126(exclusi)18(v)12(ely )-126(for )-126(test )-126(purposes. )-52(T)45(he )]TJ +-20.67 -1.44 Td +[(sour)12(ce )-108(code )-108(resides )-108(in )]TJ +/TT1 1 Tf +10.257 0 Td +(src/test/java)Tj +/TT0 1 Tf +[( )-109(and )-108(w)18(as )-108(deplo)12(y)18(ed )-108(only )-108(into )-108(the )-108(test )-108(en)12(vironment, )-108(not )]TJ +-10.253 -1.44 Td +[(production. )-48(W)18(ith )-48(Arquillian, )-85(y)18(ou )-85(can )-85(selecti)18(v)12(ely )-85(deplo)12(y )-85(classes )-85(in )-85(the )-85(setup )-85(phase )-85(of )-85(a )-85(unit )-85(test, )]TJ +-0.001 -1.44 Td +[(w)18(hic)18(h )-83(makes )-83(the )-83(testing )-83(of )-83(ad)24(v)24(anced )-83(dependenc)24(y )-83(injection )-83(possible. )-9(T)45(he )-83(beha)30(vior )-83(of )]TJ +/C2_0 1 Tf +37.645 0 Td +<004D0046004B0039004C0041004B005D>Tj +/TT0 1 Tf +(ed )Tj +-37.642 -1.44 Td +[(or )-3(ambiguous )-3(dependencies )-3(is )-3(easily )-3(testable. )71(T)45(here )-3(is )-3(one )-3(ca)30(v)12(eat )-3(with )-3(this )-3(approac)18(h. )71(T)45(he )-3(creation )]TJ +0.006 -1.44 Td +[(of )-17(the )-17(ar)12(c)18(hi)18(v)12(e, )-17(as )-17(well )-17(as )-17(the )-17(deplo)12(yment)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-17(happens )-17(once )-17(for )-17(eac)18(h )-17(test )-17(class. )-17(F)45(or )-17(tests )-17(with )-17(different )]TJ +-0.001 -1.44 Td +[(setups )-193(\(suc)18(h )-193(as )-193(testing )-193(different )]TJ +/TT1 1 Tf +14.509 0 Td +(ConfigurationProviders)Tj +/TT0 1 Tf +(\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-195(y)18(ou )-193(ha)30(v)12(e )-193(to )-193(create )-193(a )-193(unit )-193(test )]TJ +-14.507 -1.44 Td +[(class for eac)18(h deplo)12(yment unit with a different set of classes.)]TJ +/TT3 1 Tf +12 0 0 12 57 166.0002 Tm +[(Accidental P)45(erformance Impro)12(v)12(ement of F)55(actor 250)]TJ +/TT0 1 Tf +10 0 0 10 75 143.6003 Tm +[(W)-252(a)-289(t)-289(c)-271(h)-289(i)-289(n)-289(g )-4641(t)-289(h)-289(e )-4641(m)-289(o)-289(n)-289(i)-289(t)-289(o)-289(r)-289(i)-289(n)-289(g )-4641(o)-289(u)-289(t)-289(p)-289(u)-289(t )-4641(o)-289(f )]TJ +/TT1 1 Tf +-1.803 -1.44 Td +[(c)-3(o)-3(m)-3(.)-3(a)-3(b)-3(i)-3(e)-3(n)-3(.)-3(x)-3(r)-3(a)-3(y)-3(.)-3(b)-3(u)-3(s)-3(i)-3(n)-3(e)-3(s)-3(s)-3(.)-3(m)-3(o)-3(n)-3(i)-3(t)-3(o)-3(r)-3(i)-3(n)-3(g)-3(.)-3(P)-3(e)-3(r)-3(f)-3(o)-3(r)-3(m)-3(a)-3(n)-3(c)-3(e)-3(A)-3(u)-3(d)-3(i)-3(t)-3(o)-3(r)]TJ +/TT0 1 Tf +31.959 0 Td +[(, )-501(I )-501(n)-3(o)-3(t)-3(i)-3(c)-3(e)-3(d )-501(t)-3(h)-3(e )-501(p)-3(o)-3(o)-3(r )]TJ +-31.936 -1.44 Td +[(p)-93(e)-93(r)-93(f)-93(o)-93(r)-93(m)-93(a)-93(n)-93(c)-93(e )-547(o)-93(f )-547(t)-93(h)-93(e )-547(f)-93(o)-75(l)-93(l)-93(o)-81(w)-93(i)-93(n)-93(g )-547(m)-93(e)-93(t)-93(h)-93(o)-93(d)-93(s)-93(: )]TJ +/TT1 1 Tf +22.316 -0 Td +[(H)-93(i)-93(t)-93(s)-93(.)-93(p)-93(e)-93(r)-93(s)-93(i)-93(s)-93(t)-93(R)-93(e)-93(f)-93(e)-93(r)-93(e)-93(r)-93(s)-93(C)-93(a)-93(c)-93(h)-93(e)]TJ +/TT0 1 Tf +10 0 0 10 180.1885 114.8002 Tm +27.249 0 Td +[( )-547(a)-93(n)-93(d )]TJ +/TT1 1 Tf +-39.577 -1.44 Td +(Hits.persistHitsCache)Tj +/TT0 1 Tf +[(. )-361(T)45(heir )-433(execution )-433(took )-433(around )-433(50 )-433(seconds )-433(in )-433(contr)12(ast )-433(to )-433(the )]TJ +0.003 -1.44 Td +[(remaining methods\222 performance, w)18(hic)18(h w)18(as belo)12(w 20 ms. )]TJ +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 484 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(109)Tj +/TT1 1 Tf +0 Tc 0 Tw -18.332 57.06 Td +(DevNullLogger)Tj +/TT0 1 Tf +[( )-75(is )-74(denoted )-74(with )-74(the )]TJ +/TT1 1 Tf +16.954 0 Td +(@Alternative)Tj +/TT0 1 Tf +[( )-75(annotation )-74(and )-74(so )-74(it )-74(is )-74(disabled. T)45(he )]TJ +/TT1 1 Tf +-18.757 -1.44 Td +(@Alternative)Tj +/TT0 1 Tf +[( )-237(annotation )-236(for)12(ces )-236(the )-236(container )-236(to )-236(use )-236(the )]TJ +/TT1 1 Tf +27.475 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +[( )-238(to )-236(create )-236(the )]TJ +-27.477 -1.44 Td +[(instances, )-207(instead )-207(of )-207(using )-207(the )-207(default )-207(constructor )-207(directly)92(. )-170(A )-207(remo)12(v)24(al )-207(of )-207(the )]TJ +/TT1 1 Tf +35 0 Td +(@Alternative)Tj +/TT0 1 Tf +( )Tj +-34.999 -1.44 Td +[(annotation )-97(from )]TJ +/TT1 1 Tf +7.364 0 Td +(DevNullLogger)Tj +/TT0 1 Tf +[( )-99(w)12(ould )-97(introduce )-97(an )-97(ambiguity )-97(and )-97(w)12(ould )-97(cause )-97(deplo)12(yment )]TJ +-7.368 -1.44 Td +(errors)Tj +/TT2 1 Tf +(.)Tj +/TT0 1 Tf +1.8 -2.24 Td +[(A )-178(potential )-178(ad)24(v)24(antage )-178(of )-178(wr)12(apping )-178(the )]TJ +/TT1 1 Tf +17.738 0 Td +(java.util.Logger)Tj +/TT0 1 Tf +[( )-180(with )-178(a )-178(delegate )-178(is )-178(increased )]TJ +-19.537 -1.44 Td +[(encapsulation. )-218(X-r)12(a)30(y )-219(application )-218(code )-218(is )-218(no )-218(longer )-218(dependent )-218(on )]TJ +/TT1 1 Tf +30.101 0 Td +(java.util.Logger)Tj +/TT0 1 Tf +[(; )-220(it )-218(is )]TJ +-30.105 -1.44 Td +[(dependent )-151(only )-151(on )-151(the )]TJ +/TT1 1 Tf +10.61 0 Td +(XRayLogger)Tj +/TT0 1 Tf +[( )-152(interface. )-77(T)45(his )-151(positi)18(v)12(e )-151(side-effect )-151(w)18(as )-151(not )-151(the )-151(main )-151(goal )]TJ +-10.608 -1.44 Td +[(behind )-43(the )-43(introduction )-43(of )-43(the )-43(delegate; )-43(r)12(ather)74(, )-43(it )-43(w)18(as )-43(the )-43(consequence )-43(of )-43(centr)12(al )-43(and )-43(con)12(v)12(enient )]TJ +/C2_0 1 Tf +0.004 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation. )-261(It )-261(is )-261(actually )-261(v)12(ery )-261(unlikely )-261(that )-261(the )]TJ +/TT1 1 Tf +23.129 0 Td +(java.util.Logging)Tj +/TT0 1 Tf +[( )-262(fr)12(amew)12(ork )-261(will )-261(be )]TJ +-23.127 -1.44 Td +[(replaced in the near future with an alternati)18(v)12(e.)]TJ +1.8 -2.24 Td +[(T)45(he )-129(c)18(hoice )-129(regarding )-129(the )-129(implementation )-129(is )-129(made )-129(in )-129(the )]TJ +/TT1 1 Tf +25.496 0 Td +(LoggerProducer)Tj +/TT0 1 Tf +[( )-131(class )-129(with )-129(the )]TJ +-27.297 -1.44 Td +(injected )Tj +/TT1 1 Tf +3.828 0 Td +(debug)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +3.383 0 Td +<005D>Tj +/TT0 1 Tf +[(eld )-104(\(see )-104(Listing )-104(57\). )-104(In )-104(the )-104(default )-104(case)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +18.313 0 Td +(DevNullLogger)Tj +/TT0 1 Tf +[( )-106(gets )-104(instantiated. )-104(In )]TJ +-25.526 -1.44 Td +[(debug )-4(mode)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT1 1 Tf +5.927 0 Td +(DelegatingLogger)Tj +/TT0 1 Tf +[( )-5(gets )-4(instantiated. )70(T)45(he )-4(v)24(alue )-4(of )-4(the )]TJ +/TT1 1 Tf +24.438 0 Td +(debug)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +3.282 0 Td +<005D>Tj +/TT0 1 Tf +[(eld )-4(is )-4(produced )-4(b)18(y )]TJ +-33.646 -1.44 Td +(the )Tj +/TT1 1 Tf +(Configuration )Tj +/TT0 1 Tf +(singleton session bean.)Tj +/TT3 1 Tf +12 0 0 12 57 375.6002 Tm +[(Unit )74(T)100(est Is Not Integr)12(ation )74(T)100(est)]TJ +/TT0 1 Tf +10 0 0 10 75 353.2002 Tm +[(It )-338(is )-338(a )-338(common )-338(misconception )-338(that )-338(a )-338(unit )-338(test )-338(should )-338(alw)18(a)30(ys )-338(run )-338(con)12(v)12(eniently )-338(in )-338(an )]TJ +-1.801 -1.44 Td +[(embedded )-60(container )-60(and )-60(beha)30(v)12(e )-60(like )-60(the )-60(production )-60(system. )-60(In )-60(fact)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-60(the )-60(opposite )-60(is )-60(true: )-23(A )-60(good )]TJ +0.001 -1.44 Td +[(unit )-467(test )-467(should )-467(v)24(alidate )-467(the )-467(functionality )-467(independently )-467(of )-467(its )-467(infr)12(astructure )-467(and )-467(be )-467(as )]TJ +-0.002 -1.44 Td +[(independent )-227(as )-227(possible )-227(from )-227(a )-227(container)74(. )-190(All )-227(dependencies )-227(should )-227(be )-227(moc)18(ked )-227(out)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-227(and )-227(the )]TJ +0.002 -1.44 Td +[(beha)30(vior )-44(of )-44(the )-44(class )-44(under )-44(test )-44(should )-44(be )-44(tested )-44(in )-44(isolation. )-44(Moc)18(king )-44(out )-44(external )-44(dependencies )]TJ +-0.001 -1.44 Td +[(with )-374(the )-374(right )-374(fr)12(amew)12(ork )-374(\(for )-374(example, )-374(b)18(y )-374(using )-374(Moc)18(kito )-374(\(http://moc)18(kito.org\) )-374(is )-374(easy )-374(and )]TJ +0.002 -1.44 Td +[(extremely )-10(producti)18(v)12(e. )64(T)45(he )-10(producti)18(vity )-10(gains )-10(of )-10(moc)18(king )-10(out )-10(the )-10(infr)12(astructure )-10(are )-10(noticeable )-10(ev)12(en )]TJ +0.004 -1.44 Td +[(in tri)18(vial cases and become ev)12(en more substantial for more complex business logic.)]TJ +1.8 -2.24 Td +[(T)45(he )-395(JUnit )-395(\(http://junit.org/\) )-395(test )-395(fr)12(amew)12(ork )-395(can )-395(be )-395(misused )-395(to )-395(intentionally )-395(implement )]TJ +-1.803 -1.44 Td +[(integr)12(ation )-295(tests. )-203(Y)129(ou )-295(can )-295(launc)18(h )-295(the )-295(JP)55(A )-295(en)12(vironment )-295(outside )-295(the )-295(container )-295(and )-295(inject )-295(the )]TJ +/TT1 1 Tf +0.002 -1.44 Td +(EntityManager)Tj +/TT0 1 Tf +[( to the class under test \(CUT\) b)17(y y)18(ourself \(see Listing 61\).)]TJ +/TT1 1 Tf +0 -1.79 TD +(public class UserAgentStatisticsIT {)Tj +T* +( private EntityManager em;)Tj +T* +( private EntityTransaction tx;)Tj +T* +( UserAgentStatistics cut;)Tj +0 -3.58 TD +( @Before)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 57 75.9002 Tm +( public void initializeCUT\(\){)Tj +ET +Q +BT +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 485 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 258.3228 59 Tm +(100)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1002 Tm +( @Timeout)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2002 Tm +( public void initiateFlush\(\) {)Tj +0 -1.79 TD +( this.hits.persistHitsCache\(\);)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 51: Progr)Tj +/C2_0 1 Tf +6.991 0 Td +<0039004500450039004C0041003B000100390046003C0001001F00470046005D>Tj +/TT0 1 Tf +[(gur)12(able )74(T)]TJ +/C2_0 1 Tf +12.122 0 Td +<00410045003D004A0001001F00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation)]TJ +/TT1 1 Tf +-17.313 -2.24 Td +(HitsFlushTimer)Tj +/TT0 1 Tf +[( )-89(in )-88(Listing )-88(51 )-88(performs )-88(the )-88(timer )]TJ +/C2_0 1 Tf +23.022 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation )-88(in )-88(the )]TJ +/TT1 1 Tf +8.979 0 Td +(@PostConstruct)Tj +/TT0 1 Tf +( )Tj +-33.799 -1.44 Td +[(hook. )18(All )-19(par)12(ameters )-19(required )-19(for )-19(the )-19(initialization )-19(of )-19(a )-19(progr)12(ammatically )-19(created )-19(timer )-19(are )-19(passed )]TJ +-0.002 -1.44 Td +(as )Tj +/TT1 1 Tf +1.29 0 Td +(ScheduleExpression)Tj +/TT0 1 Tf +[( )-125(instances )-123(to )-123(the )-123(injected )]TJ +/TT1 1 Tf +22.367 0 Td +(TimerService)Tj +/TT0 1 Tf +[(. )-124(In )-123(contr)12(ast )-123(to )-123(the )-123(use )-123(of )]TJ +/TT1 1 Tf +-23.656 -1.44 Td +(@Schedule)Tj +/TT0 1 Tf +[( )-283(annotation, )-282(a )-282(progr)12(ammatically )-282(created )-282(timer )-282(can )-282(be )]TJ +/C2_0 1 Tf +30.818 0 Td +<004A003D003B00470046005D>Tj +/TT0 1 Tf +[(gured )-282(without )-282(an)18(y )]TJ +-30.816 -1.44 Td +[(recompilation. )-257(W)18(ith )-294(the )-294(injected )]TJ +/C2_0 1 Tf +15.405 0 Td +<005D>Tj +/TT0 1 Tf +(eld )Tj +/TT1 1 Tf +2.462 0 Td +(hitsFlushRate)Tj +/TT0 1 Tf +[(, )-295(the )-294(timer )-294(can )-294(ev)12(en )-294(be )]TJ +/C2_0 1 Tf +19.723 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +-37.587 -1.44 Td +[(externally)92(. )-67(Dependenc)24(y )-67(Injection )-67(of )-67(primiti)18(v)12(e )-67(types )-67(w)12(orks )-67(without )-67(an)18(y )-67(XML )-67(or )-67(further )-67(ceremon)18(y)92(. )]TJ +-0.001 -1.44 Td +[(Only )-32(a )-32(producer )-32(method, )-32(or )-32(ev)12(en )-32(just )-32(a )-32(plain )]TJ +/C2_0 1 Tf +20.006 0 Td +<005D>Tj +/TT0 1 Tf +[(eld )-32(with )-32(matc)18(hing )-32(type, )-32(is )-32(required )-32(to )-32(perform )-32(the )]TJ +-20.009 -1.44 Td +[(injection. )37(A nai)18(v)12(e producer implementation could be like this:)]TJ +/TT2 1 Tf +0 -1.79 TD +(@javax.enterprise.inject.Produces)Tj +/TT1 1 Tf +T* +[(public int getHitsFlushIntervallInMinutes\(\) {)-1800( return 1;)]TJ +T* +(})Tj +/TT0 1 Tf +1.8 -2.24 Td +[(T)45(hankfully)92(, CDI introduces additional meta-information \()]TJ +/TT1 1 Tf +(InjectionPoint)Tj +/TT0 1 Tf +( in Listing 52\) )Tj +-1.8 -1.44 Td +(that can be passed to a producer method on demand.)Tj +/TT1 1 Tf +T* +(@Startup)Tj +T* +(@Singleton)Tj +T* +(public class Configuration {)Tj +T* +( private Map configuration;)Tj +T* +( @PostConstruct)Tj +T* +( public void fetchConfiguration\(\) {)Tj +T* +( this.configuration = new HashMap\(\) {{)Tj +T* +( put\("version", "0.5"\);)Tj +T* +( put\("hitsFlushRate", "1"\);)Tj +T* +( put\("referersFlushRate", "1"\);)Tj +T* +( }};)Tj +T* +( })Tj +0 -3.58 TD +( @javax.enterprise.inject.Produces)Tj +0 g +/GS1 gs +/TT3 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT4 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT3 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 486 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(94)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 633.2001 Tm +(Listing 47: HitsP)Tj +/C2_0 1 Tf +6.959 0 Td +<003D004A0001001F004D004B004C004700450001002D004D003900440041005D>Tj +/TT0 1 Tf +(er)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 610.8002 Tm +(HitsPer)Tj +/TT0 1 Tf +[( )-87(is )-86(not )-86(just )-86(a )-86(marker )-86(annotation. )-86(It )-86(contains )-86(an )-86(embedded )-86(enum )]TJ +/TT1 1 Tf +32.745 0 Td +(Frequency)Tj +/TT0 1 Tf +[( )-87(with )]TJ +-34.545 -1.44 Td +[(the )-101(v)24(alues )]TJ +/TT1 1 Tf +4.791 0 Td +(MINUTE)Tj +/TT0 1 Tf +[( )-102(and )]TJ +/TT1 1 Tf +5.971 0 Td +(HOUR)Tj +/TT0 1 Tf +[(. )-27(T)45(he )-101(only )-101(element )-101(of )-101(the )]TJ +/TT1 1 Tf +13.948 0 Td +(HitsPer)Tj +/TT0 1 Tf +[( )-102(annotation )-101(that )-101(has )-101(the )-101(name )]TJ +/TT1 1 Tf +-24.71 -1.44 Td +(value)Tj +/TT0 1 Tf +[( )-180(is )]TJ +/TT1 1 Tf +4.583 0 Td +(Frequency)Tj +/TT0 1 Tf +[(. )-181(No )-180(default )-180(v)24(alue )-180(is )-180(declared, )-180(so )-180(a )-180(v)24(alue )-180(has )-180(to )-180(be )-180(pro)12(vided )-180(b)18(y )-180(ev)12(ery )]TJ +-4.579 -1.44 Td +[(declar)12(ation. )-40(T)100(ogether )-114(with )-114(the )-114(pro)12(vided )-114(v)24(alue, )-114(the )-114(annotation )]TJ +/TT1 1 Tf +27.425 0 Td +(HitsPer)Tj +/TT0 1 Tf +[( )-115(is )-114(far )-114(more )-114(readable )-114(as )]TJ +/TT1 1 Tf +-27.427 -1.44 Td +(@HitsPer\(MINUTE\))Tj +/TT0 1 Tf +[(, as sho)10(wn in Listing 48:)]TJ +/TT1 1 Tf +0 -1.79 TD +(@Singleton)Tj +T* +(public class HourlyStatisticsCalculator {)Tj +0 -3.58 TD +( @Inject)Tj +0 -1.79 TD +( @HitsPer\(HOUR\))Tj +T* +( Event hourlyEvent;)Tj +0 -3.58 TD +( @Schedule\(hour = "*/1", persistent = false\))Tj +0 -1.79 TD +( public void computeStatistics\(\) {)Tj +3.6 -1.79 Td +(//\205)Tj +-3.6 -1.79 Td +(hourlyEvent.fire\(currentRate\);)Tj +T* +( })Tj +0 -3.58 TD +(})Tj +T* +(@Singleton)Tj +0 -1.79 TD +(public class MinutelyStatisticsCalculator {)Tj +0 -3.58 TD +( @Inject)Tj +0 -1.79 TD +( @HitsPer\(MINUTE\))Tj +T* +( Event minutelyEvent;)Tj +0 -3.58 TD +( @Schedule\(minute = "*/1", hour = "*", persistent = false\))Tj +0 -1.79 TD +( public void computeStatistics\(\) {)Tj +7.2 -1.79 Td +(//...)Tj +T* +(minutelyEvent.fire\(currentRate\);)Tj +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 487 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(88)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( methods.clear\(\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( exceptionCount.set\(0\);)Tj +0 -1.79 TD +( diagnostics.clear\(\);)Tj +T* +( })Tj +3.6 -1.79 Td +(//REST irrelevant methods omitted)Tj +-3.6 -1.79 Td +(})Tj +/TT0 1 Tf +0 -1.88 TD +(Listing 44: Exposing Management Data via REST)Tj +1.8 -2.24 Td +[(It )-27(is )-27(a )-27(lot )-27(easier )-27(for )-27(the )-27(administr)12(ators )-27(and )-27(oper)12(ators )-27(to )-27(access )-27(monitoring )-27(data )-27(via )-27(HTTP/REST )]TJ +-1.804 -1.44 Td +[(than )-166(via )-166(JMX. )-92(T)45(he )]TJ +/TT1 1 Tf +8.493 0 Td +(getSlowestMethods)Tj +/TT0 1 Tf +[( )-168(method )-166(in )-166(Listing )-166(44 )-166(returns )-166(a )-166(list )-166(of )]TJ +/TT1 1 Tf +27.704 0 Td +(Invocation)Tj +/TT0 1 Tf +( )Tj +-36.199 -1.44 Td +(instances \(see Listing 45\). )Tj +/TT1 1 Tf +0 -1.79 TD +(@XmlRootElement)Tj +T* +(@XmlAccessorType\(XmlAccessType.FIELD\))Tj +T* +(public class Invocation implements Comparable{)Tj +T* +( @XmlAttribute)Tj +T* +( private String methodName;)Tj +T* +( @XmlAttribute)Tj +T* +( private Long invocationPerformance;)Tj +0 -3.58 TD +( public Invocation\(String methodName, long invocationPerformance\) {\ )Tj +0 -1.79 TD +( this.methodName = methodName;)Tj +T* +( this.invocationPerformance = invocationPerformance;)Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +[(Listing 45: Using J)18(AXB )37(Annotations for XML and JSON Serialization)]TJ +1.8 -2.24 Td +(Class )Tj +/TT1 1 Tf +2.566 0 Td +(Invocation)Tj +/TT0 1 Tf +[( )-66(together )-65(with )-65(J)18(AXB )-65(annotations )-65(pro)12(vides )]TJ +/C2_0 1 Tf +24.258 0 Td +<004B004D003E005D>Tj +/TT0 1 Tf +[(cient )-65(metadata )-65(for )-65(the )-65(J)18(AX-)]TJ +-28.62 -1.44 Td +[(RS )-211(implementation )-211(J)12(ersey )-211(to )-211(gener)12(ate )-211(either )-211(JSON )-211(or )-211(XML )-211(from )-211(the )-211(class )-211(structure. )-211(Ev)12(en )-211(the )]TJ +0.006 -1.44 Td +[(serialization )-222(w)12(orks )-222(with )-222(respect )-222(to )-222(the )-222(Con)12(v)12(ention )-222(o)12(v)12(er )]TJ +/C2_0 1 Tf +25.726 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation )-222(principle. )-185(W)18(ithout )-222(an)18(y )]TJ +/C2_0 1 Tf +-25.722 -1.44 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation, )-63(the )-63(names )-63(of )-63(the )-63(XML )-63(and )-63(JSON )-63(tags )-63(are )-63(directly )-63(deri)18(v)12(ed )-63(from )-63(the )-63(class )-63(structure. )]TJ +-0.006 -1.44 Td +[(T)45(he )-168(default )-168(v)24(alues )-168(can )-168(be )-168(o)12(v)12(erridden )-168(at )-168(an)18(y )-168(time )-168(with )-168(annotations. )-94(T)45(he )-168(output )-168(format )-168(can )-168(be )]TJ +/C2_0 1 Tf +-0.003 -1.44 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +(ed with the )Tj +/TT1 1 Tf +(Accept)Tj +/TT0 1 Tf +[( HTTP header)73(. )]TJ +1.8 -2.24 Td +(Here is a )Tj +/TT1 1 Tf +(curl)Tj +/TT0 1 Tf +( command:)Tj +/TT1 1 Tf +-1.8 -1.79 Td +(curl -H "Accept: application/json\224 http://localhost:8080/x-ray/)Tj +0 -0.99 TD +(resources/monitoring)Tj +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 488 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(81)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.0999 Tm +( private ObjectName objectName = null;)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( private ConcurrentHashMap methods = new )Tj +0 -0.99 TD +(ConcurrentHashMap\(\);)Tj +0 -1.79 TD +( private ConcurrentHashMap diagnostics = new )Tj +0 -0.99 TD +(ConcurrentHashMap\(\);)Tj +0 -1.79 TD +( private AtomicLong exceptionCount;)Tj +0 -3.58 TD +( @PostConstruct)Tj +0 -1.79 TD +( public void registerInJMX\(\) {)Tj +T* +( this.exceptionCount = new AtomicLong\(\);)Tj +T* +( try{)Tj +T* +( objectName = new ObjectName)Tj +0 -0.99 TD +(\("XRayMonitoring:type="+this.getClass\(\).getName\(\)\);)Tj +0 -1.79 TD +( platformMBeanServer = )Tj +0 -0.99 TD +(ManagementFactory.getPlatformMBeanServer\(\);)Tj +0 -1.79 TD +( platformMBeanServer.registerMBean\(this,objectName\);)Tj +T* +( }catch\(Exception e\){)Tj +T* +( throw new IllegalStateException\("Problem during )Tj +0 -0.99 TD +(registration of Monitoring into JMX:" +e\);)Tj +0 -1.79 TD +( })Tj +T* +( })Tj +T* +( @GET)Tj +T* +( @Path\("exceptionCount"\))Tj +T* +( @Produces\(MediaType.TEXT_PLAIN\))Tj +T* +( @Override)Tj +T* +( public String getNumberOfExceptions\(\){)Tj +T* +( return String.valueOf\(exceptionCount.get\(\)\);)Tj +T* +( })Tj +0 -5.37 TD +( @Override)Tj +0 -1.79 TD +( public Map getDiagnostics\(\) {)Tj +T* +( return diagnostics;)Tj +T* +( })Tj +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 489 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(72)Tj +/TT1 1 Tf +0 Tc 0 Tw 12 0 0 12 57 593.2 Tm +[(P)45(ersistence for )37(A)55(v)24(ailability)]TJ +/TT0 1 Tf +10 0 0 10 75 570.7999 Tm +[(T)45(he )-251(x-r)12(a)30(y )-251(bac)18(kend )-251(stores )-251(its )-251(state )-251(in )-251(key-v)24(alue )-251(pairs. )-214(Also, )-251(simple )-251(statistics, )-251(suc)18(h )-251(as )-251(the )]TJ +-1.801 -1.44 Td +[(computation )-40(of )-40(total )-40(hits, )-40(are )-40(performed )-40(on )-40(the )-40(key-v)24(alue )-40(store. )34(T)45(he )-40(state )-40(of )-40(the )-40(tr)12(ansient )-40(cac)18(he )-40(is )]TJ +/C2_0 1 Tf +0.006 -1.44 Td +<005E>Tj +/TT0 1 Tf +[(ushed )-59(into )-59(a )-59(persistent )-59(store )-59(in )-59(a )]TJ +/C2_0 1 Tf +15.087 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(able )-59(period )-59(repeatedly)92(. )-22(A )-59(cr)12(ash )-59(or )-59(reboot )-59(between )-59(the )]TJ +-15.093 -1.44 Td +[(sync)18(hronization )-99(points )-99(w)12(ould )-99(lead )-99(to )-99(data )-99(loss. )-25(T)45(he )-99(shorter )-99(the )-99(period )-99(between )]TJ +/C2_0 1 Tf +35.334 0 Td +<005E>Tj +/TT0 1 Tf +[(ushes, )-99(the )-99(less )]TJ +-35.332 -1.44 Td +(data gets lost.)Tj +1.8 -2.24 Td +[(I )-107(implemented )-107(the )-107(periodic )-107(sync)18(hronization )-107(with )-107(the )]TJ +/TT2 1 Tf +23.63 0 Td +(@Singleton)Tj +/TT0 1 Tf +( )Tj +/TT2 1 Tf +6.386 0 Td +(Hits)Tj +/TT0 1 Tf +[( )-107(EJB )-107(bean )-107(and )-107(the )]TJ +/TT2 1 Tf +-31.813 -1.44 Td +(@Schedule)Tj +/TT0 1 Tf +( annotation \(see Listing 34\). )Tj +/TT2 1 Tf +0 -1.79 TD +(@Startup)Tj +T* +(@Singleton)Tj +T* +(@ConcurrencyManagement\(ConcurrencyManagementType.BEAN\))Tj +T* +(@Interceptors\(PerformanceAuditor.class\))Tj +T* +(public class Hits {)Tj +T* +( )Tj +T* +( @EJB)Tj +T* +( PersistentHitStore hitStore;)Tj +T* +( @EJB)Tj +T* +( PersistentRefererStore refererStore;)Tj +3.6 -1.79 Td +( )Tj +-3.6 -1.79 Td +( //\205)Tj +T* +( private ConcurrentHashMap hitStatistics = )Tj +0 -0.99 TD +(null;)Tj +0 -1.79 TD +( private ConcurrentHashMap trending = null;)Tj +T* +( private ConcurrentHashMap refererStatistics = )Tj +0 -0.99 TD +(null;)Tj +0 -3.58 TD +( @PostConstruct)Tj +0 -1.79 TD +( public void preloadCache\(\) {)Tj +T* +( Map hits = hitStore.getHits\(\);)Tj +T* +( Map referers = refererStore.getReferers\(\);\ )Tj +T* +( hitStatistics = new ConcurrentHashMap)Tj +0 g +/GS1 gs +/TT3 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT4 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT3 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 490 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(66)Tj +0 Tc 0 Tw -20.432 57.06 Td +[(complex )-85(classes )-85(are )-85(di)18(vided )-85(into )-85(cohesi)18(v)12(e )-85(and )-85(easier)55(-to-understand )-85(pieces )-85(after )-85(a )-85(few )-85(iter)12(ations. )]TJ +-0.003 -1.44 Td +[(No )-119(upfront )-119(design )-119(is )-119(needed, )-119(because )-119(no )-119(upfront )-119(o)12(v)12(erhead )-119(exists)]TJ +/TT1 1 Tf +(.)Tj +/TT0 1 Tf +[( )-119(F)37(rom )-119(the )-119(design )-119(perspecti)18(v)12(e)]TJ +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +-0.005 -1.44 Td +(there is absolutely no difference between POJOs, EJB beans, managed bean\ s)Tj +/TT1 1 Tf +(,)Tj +/TT0 1 Tf +[( or JP)55(A entities.)]TJ +1.8 -2.24 Td +[(T)45(he )]TJ +/TT2 1 Tf +2.038 0 Td +(URLPathExtractor)Tj +/TT0 1 Tf +[( )-194(is )-193(injected )-193(with )]TJ +/TT2 1 Tf +17.488 0 Td +(@Inject)Tj +/TT0 1 Tf +[(, )-193(and )-193(the )]TJ +/TT2 1 Tf +8.837 0 Td +(Hits)Tj +/TT0 1 Tf +[( )-193(boundary )-193(is )-193(injected )]TJ +-30.161 -1.44 Td +[(with )-237(the )]TJ +/TT2 1 Tf +4.254 0 Td +(@EJB)Tj +/TT0 1 Tf +[( )-238(annotation. )-163(T)45(his )-237(distinction )-237(is )-237(not )-237(necessary)92(. )-145(Y)129(ou )-237(could )-237(also )-237(inject )-237(both )-237(with )]TJ +/TT2 1 Tf +-4.257 -1.44 Td +(@Inject)Tj +/TT0 1 Tf +[(. )-45(If )-45(y)18(ou )-45(do )-45(so, )-45(y)18(ou )-45(ha)30(v)12(e )-45(to )-45(keep )-45(in )-45(mind )-45(that )]TJ +/TT2 1 Tf +24.006 0 Td +(@Inject)Tj +/TT0 1 Tf +[( )-45(injection )-45(is )-45(more )-45(po)12(werful )-45(than )]TJ +-24.003 -1.44 Td +[(EJB )-32(beans. )42(T)45(he )-32(support )-32(for )-32(inheritance )-32(is )-32(v)12(ery )-32(poor )-32(in )-32(EJB)24(, )-32(but )-32(it )-32(is )-32(v)12(ery )-32(po)12(werful )-32(in )-32(CDI )-32(managed )]TJ +-0.008 -1.44 Td +[(beans. )-222(T)74(rying )-296(to )-296(inject )-296(polymorphic )-296(EJB )-296(beans )-296(with )]TJ +/TT2 1 Tf +24.452 0 Td +(@Inject)Tj +/TT0 1 Tf +[( )-297(could )-296(lead )-296(to )-296(nasty )-296(runtime )]TJ +-24.458 -1.44 Td +(problems.)Tj +/TT3 1 Tf +12 0 0 12 57 469.9999 Tm +[(Ev)12(entual Consistenc)24(y with Singletons)]TJ +/TT0 1 Tf +10 0 0 10 75 447.5999 Tm +[(Ev)12(ery )-313(clic)18(k )-313(is )-313(forw)18(arded )-313(to )-313(the )-313(bac)18(kend )-313(b)18(y )-313(an )-313(HTTP )]TJ +/C2_0 1 Tf +25.666 0 Td +<005D>Tj +/TT0 1 Tf +[(lter )-313(and )-313(forw)18(arded )-313(to )]TJ +/TT2 1 Tf +11.127 0 Td +(x-ray-)Tj +-38.599 -1.44 Td +(services)Tj +/TT0 1 Tf +[( )-34(via )-33(HTTP )-33(PUT)111(. )-33(But )-33(ho)12(w )-33(do )-33(we )-33(persist )-33(and )-33(compute )-33(the )-33(statistics? )4(W)37(e )-33(are )-33(actually )-33(not )]TJ +0.004 -1.44 Td +[(interested )-55(in )-55(tr)12(ac)18(king )-55(user )-55(beha)30(vior; )-55(r)12(ather )-55(we )-55(are )-55(interested )-55(in )-55(the )-55(popularity )-55(of )-55(posts. )-18(W)37(e )-55(could )]TJ +-0.005 -1.44 Td +[(insert )-130(new )-130(URIs )-130(into )-130(the )-130(database )-130(and )-130(update )-130(the )-130(statistics )-130(for )-130(alread)24(y )-130(existing )-130(URIs. )-130(On )-130(ev)12(ery )]TJ +0.007 -1.44 Td +[(clic)18(k, )-131(y)18(ou )-131(w)12(ould )-131(ha)30(v)12(e )-131(to )-131(perform )-131(an )-131(insert )-131(or )-131(database )-131(update. )-57(T)45(he )-131(database )-131(w)12(ould )-131(become )-131(a )]TJ +0.005 -1.44 Td +[(potential )-152(bottlenec)18(k, )-152(and )-152(we )-152(w)12(ould )-152(ha)30(v)12(e )-152(to )-152(deal )-152(with )-152(it )-152(from )-152(the )-152(v)12(ery )]TJ +/C2_0 1 Tf +32.017 0 Td +<005D>Tj +/TT0 1 Tf +[(rst )-152(increment. )-152(On )-152(the )]TJ +-32.019 -1.44 Td +[(other )-29(hand, )-29(a )-29(centr)12(al )-28(database )-28(as )-28(centr)12(al )-28(data )-29(store )-28(is )-29(the )-29(most )-28(consistent )-28(approac)18(h. )46(T)45(he )-28(system )-29(is )]TJ +-0.001 -1.44 Td +[(alw)18(a)30(ys )-8(in )-8(a )-8(consistent )-8(state )-8(at )-8(ev)12(ery )-8(point )-8(in )-8(time. )-8(So, )-8(ho)12(w )-8(do )-8(we )-8(decide )-8(w)18(hat )-8(consistenc)24(y )-8(lev)12(el )-8(is )]TJ +0.003 -1.44 Td +[(actually needed? )74(T)45(he ans)12(wer is easy)92(. )37(A dev)12(eloper cannot just decide that; it is a business decision.)]TJ +1.8 -2.24 Td +[(In )-6(the )-6(role )-6(of )-6(domain )-6(expert, )-6(I\222m )-6(really )-6(interested )-6(in )-6(the )-6(popularity )-6(of )-6(eac)18(h )-6(post. )31(At )-6(the )-6(time )-6(of )]TJ +-1.796 -1.44 Td +[(this )-140(writing, )-140(there )-140(are )-140(about )-140(one )-140(thousand )-140(posts. )-140(It )-140(w)12(ould )-140(be )-140(interesting )-140(to )-140(kno)12(w )-140(ho)12(w )-140(popular )]TJ +-0.004 -1.44 Td +[(eac)18(h )-164(one )-164(is. )-164(Suc)18(h )-164(statistics )-164(don\222)37(t )-164(ha)30(v)12(e )-164(to )-164(be )-164(consistent )-164(in )-164(real )-164(time. )-127(A )-164(daily )-164(update )-164(w)12(ould )-164(be )]TJ +/C2_0 1 Tf +-0.005 -1.44 Td +<004B004D003E005D>Tj +/TT0 1 Tf +[(cient. )-108(Before )-108(x-r)12(a)30(y)92(, )-108(I )-108(used )-108(weekly )-71(W)37(ebalizer )-108(\()]TJ +10 0 0 10 57 266.8 Tm +21.943 0 Td +[(http://www)74(.mrunix.net/webalizer/\) )-108(runs )-108(for )-108(the )]TJ +-21.942 -1.44 Td +[(computation )-264(and )-264(published )-264(the )-264(statistics )-264(monthly)92(. )-227(A )-264(daily )-264(statistic )-264(update )-264(w)12(ould )-264(be )-264(a )-264(huge )]TJ +0 -1.44 TD +[(impro)12(v)12(ement compared to the previous situation.)]TJ +1.8 -2.24 Td +[(T)45(he )-71(next )-72(interesting )-71(statistic )-72(is )-71(currently )-72(trending )-72(topics. )-71(It )-71(is )-71(interesting )-71(to )-71(see )-71(w)18(hat )-71(happens )]TJ +-1.803 -1.44 Td +[(in )-146(real )-146(time, )-146(but )-146(these )-146(results )-146(don\222)37(t )-146(ha)30(v)12(e )-146(to )-146(be )-146(stored )-146(persistently)92(. )-72(T)45(hey )-146(could )-146(get )-146(lost )-146(at )-146(ev)12(ery )]TJ +-0.003 -1.44 Td +[(serv)12(er )-281(restart )-281(or )-281(cr)12(ash. )-281(P)45(ersisting )-281(the )-281(current )-281(trend )-281(w)12(ould )-281(be )-281(a )-281(nice, )-281(but )-281(not )-281(an )-281(absolutely )]TJ +0.004 -1.44 Td +[(necessary)92(, )-284(feature. )-284(Furthermore, )-284(it )-284(turns )-284(out )-284(that )-284(so )-284(far)74(, )-284(the )-284(Linux, )-284(JDK )-284(1.6, )-284(GlassF)18(ish, )-284(and )]TJ +-0.004 -1.44 Td +[(Hypersonic )-183(database )-183(\(HSQLDB\) )-183(\(http://hsqldb.org\) )-183(combination )-183(is )-183(extremely )-183(stable. )-109(T)45(he )-183(serv)12(er )]TJ +-0.003 -1.44 Td +[(has )-171(nev)12(er )-171(cr)12(ashed )-171(thus )-171(far)74(. )-171(It )-171(r)12(an )-171(for )-171(months, )-171(ev)12(en )-171(y)18(ears. )-171(I )-171(restarted )-171(it )-171(only )-171(for )-171(updates. )-171(Suc)18(h )]TJ +0.008 -1.44 Td +[(c)-1(o)-1(n)-1(s)-1(i)-1(d)-1(e)-1(r)11(a)-1(t)-1(i)-1(o)-1(n)-1(s )-500(a)-1(r)-1(e )-500(a)-1(l)-1(s)-1(o )-500(v)23(a)-1(l)-1(u)-1(a)-1(b)-1(l)-1(e )-500(i)-1(n )-500(c)-1(o)-1(m)-1(m)-1(e)-1(r)11(c)-1(i)-1(a)-1(l )-500(p)-1(r)-1(o)-1(j)-1(e)-1(c)-1(t)-1(s)-1(. )-500(H)-1(i)-1(g)-1(h )-500(a)29(v)23(a)-1(i)-1(l)-1(a)-1(b)-1(i)-1(l)-1(i)-1(t)-1(y )-500(a)-1(n)-1(d )-500(e)-1(x)-1(t)-1(r)-1(e)-1(m)-1(e )]TJ +-0.003 -1.44 Td +[(consistenc)24(y )-225(are )-225(o)12(v)12(err)12(ated )-225(in )-225(the )-225(real )-225(w)12(orld. )-225(Clients )-225(prescribe )-225(24/7 )-225(a)30(v)24(ailability )-225(for )-225(noncritical )]TJ +T* +[(softw)18(are without ev)12(en thinking about the consequences. )]TJ +1.8 -2.24 Td +[(It )-102(w)12(ould )-102(also )-102(be )-102(nice )-102(to )-102(ha)30(v)12(e )-102(the )-102(total )-102(number )-102(of )-102(daily )-102(hits )-102(and )-102(hits )-102(from )-102(the )-102(previous )-102(da)30(y)92(. )]TJ +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 491 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(58)Tj +0 g +/GS1 gs +/TT1 1 Tf +-0.103 Tc 0 Tw 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT2 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT1 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 492 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(50)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +(public static final String )Tj +/TT2 1 Tf +(HEADER_NAME_PREFIX)Tj +/TT1 1 Tf +( = "xray_";)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +(public void put\(String content, Map headers\) {)Tj +0 -1.79 TD +( try {)Tj +T* +( Socket socket = new Socket\(inetAddress, port\);)Tj +T* +( socket.setSoTimeout\(TIMEOUT\);)Tj +T* +( BufferedWriter wr = new BufferedWriter\(new )Tj +0 -0.99 TD +(OutputStreamWriter\(socket.getOutputStream\(\), "UTF8"\)\);)Tj +0 -1.79 TD +( wr.write\(\223PUT " + path + " HTTP/1.0\\r\\n"\);)Tj +T* +( wr.write\(getFormattedHeader\("Content-Length","" + )Tj +0 -0.99 TD +(content.length\(\)\)\);)Tj +0 -1.79 TD +( wr.write\(getFormattedHeader\("Content-Type", "text/)Tj +0 -0.99 TD +(plain"\)\);)Tj +/TT2 1 Tf +0 -1.79 TD +( for \(Map.Entry header : headers.entrySet)Tj +0 -0.99 TD +(\(\)\) {)Tj +0 -1.79 TD +( wr.write\(getFormattedHeader\(HEADER_NAME_PREFIX + )Tj +0 -0.99 TD +(header.getKey\(\),header.getValue\(\)\)\);)Tj +0 -1.79 TD +( })Tj +/TT1 1 Tf +T* +( //bookkeeping skipped)Tj +T* +( })Tj +T* +( String getFormattedHeader\(String key,String value\){)Tj +T* +( return key + ": " + value + "\\r\\n";)Tj +T* +( })Tj +/TT0 1 Tf +0 -1.88 TD +[(Listing 24: P)92(assing )37(Additional K)24(ey )92(V)55(alues in a Header)]TJ +1.8 -2.24 Td +[(W)18(ith )-106(the )-106(a)30(v)24(ailability )-106(of )-106(key-v)24(alue )-106(pairs, )-106(metadata )-106(processing )-106(and )-106(tr)12(ansport )-106(become )-106(generic. )]TJ +-1.796 -1.44 Td +[(T)45(he HTTP headers are con)12(v)12(erted into a)]TJ +/TT1 1 Tf +( Map)Tj +/TT0 1 Tf +( \(see Listing 25\):)Tj +/TT1 1 Tf +0 -1.79 TD +( Map extractHeaders\(HttpServletRequest )Tj +0 -0.99 TD +(httpServletRequest\){)Tj +0 -1.79 TD +( Map headers = new HashMap\(\);)Tj +T* +( Enumeration headerNames = )Tj +0 -0.99 TD +(httpServletRequest.getHeaderNames\(\);)Tj +0 -1.79 TD +( if\(headerNames == null\){)Tj +T* +( return headers;)Tj +T* +( })Tj +T* +( while \(headerNames.hasMoreElements\(\)\){)Tj +T* +( String name = headerNames.nextElement\(\);)Tj +0 g +/GS1 gs +/TT3 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT4 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT3 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 493 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(41)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 634.1 Tm +( this\("localhost", 8080, PATH\);)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 75 616.2 Tm +( })Tj +/TT2 1 Tf +-1.8 -3.58 Td +( public String put\(String content\) {)Tj +0 -1.79 TD +( try {)Tj +T* +( Socket socket = new Socket\(inetAddress, port\);)Tj +T* +( BufferedWriter wr = new BufferedWriter\(new OutputStreamWriter)Tj +0 -0.99 TD +(\(socket.getOutputStream\(\), "UTF8"\)\);)Tj +0 -1.79 TD +( InputStreamReader is = new InputStreamReader)Tj +0 -0.99 TD +(\(socket.getInputStream\(\)\);)Tj +0 -1.79 TD +( wr.write\(\223PUT " + path + " HTTP/1.0\\r\\n"\);)Tj +T* +( wr.write\("Content-Length: " + content.length\(\) + "\\r\\n"\);)Tj +T* +( wr.write\("Content-Type: text/plain\\r\\n"\);)Tj +T* +( wr.write\("\\r\\n"\);)Tj +T* +( wr.write\(content\);)Tj +3.6 -1.79 Td +( )Tj +/TT1 1 Tf +(//\205 exception handling / InputStream -> String conversion)Tj +/TT2 1 Tf +-3.6 -1.79 Td +(})Tj +/TT1 1 Tf +1.8 -3.58 Td +( public InetAddress getInetAddress\(\) {)Tj +T* +( return inetAddress;)Tj +T* +( })Tj +0 -3.58 TD +( public String getPath\(\) {)Tj +0 -1.79 TD +( return path;)Tj +T* +( })Tj +0 -3.58 TD +( public int getPort\(\) {)Tj +0 -1.79 TD +( return port;)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -2.24 TD +[(Listing 21: )37(An HTTP POST Implementation in RESTClient)]TJ +T* +[(T)45(he )-353(key )-353(functionality )-353(is )-353(implemented )-353(in )-353(the )-353(method )]TJ +/TT1 1 Tf +25.289 0 Td +[(public )-354(String )]TJ +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 418.9902 86.2 Tm +(put\(String )Tj +ET +Q +BT +0 g +/GS1 gs +/TT3 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT4 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT3 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 494 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(34)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( )Tj +/TT2 1 Tf +(String createName\(\){)Tj +ET +Q +BT +/TT2 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( return namePrefix +"-"+threadNumber.incrementAndGet\(\);)Tj +0 -1.79 TD +( })Tj +/TT1 1 Tf +T* +( public int getNumberOfCreatedThreads\(\){)Tj +T* +( return threadNumber.get\(\);)Tj +T* +( })Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +[(Listing 16: )37(A Monitor)12(able )74(T)45(hreadF)55(actory)]TJ +1.8 -2.24 Td +[(T)45(he )-126(only )-126(responsibility )-126(of )-126(the )]TJ +/TT1 1 Tf +13.37 0 Td +(ThreadFactory)Tj +/TT0 1 Tf +[( )-128(is )-126(custom )-126(naming )-126(and )-126(counting )-126(of )-126(created )]TJ +-15.175 -1.44 Td +[(threads. )68(T)45(hreads )-6(created )-6(b)18(y )-6(the )-6(custom )]TJ +/TT1 1 Tf +17.016 0 Td +(Executor)Tj +/TT0 1 Tf +[( )-7(should )-6(be )-6(distinguishable )-6(from )-6(threads )-6(created )]TJ +-17.021 -1.44 Td +[(b)18(y )-294(the )-294(application )-294(serv)12(er)74(. )-220(T)45(he )-294(name )-294(of )-294(a )-294(thread )-294(will )-294(look )-294(like )]TJ +/TT1 1 Tf +29.816 0 Td +(xray-rest-pool-42)Tj +/TT0 1 Tf +[( )-296(\(the )]TJ +-29.814 -1.44 Td +(forty)Tj +/TT1 1 Tf +(-)Tj +/TT0 1 Tf +[(third )-100(created )-100(thread\). )-100(Proper )-100(thread )-100(naming )-100(is )-100(important )-100(for )-100(monitoring )-100(in )-100(production )-100(and )]TJ +0.005 -1.44 Td +[(during )-159(stress )-159(tests. )-122(W)18(ith )-159(tools )-159(suc)18(h )-159(as )-67(V)37(isualVM )-159(\(http://visualvm.ja)30(v)24(a.net/\))]TJ +/TT3 1 Tf +(,)Tj +/TT0 1 Tf +[( )-159(thread )-159(monitoring )-159(is )]TJ +0.005 -1.44 Td +[(relati)18(v)12(ely )-212(easy)92(. )-120(Y)129(ou )-212(will )-212(alw)18(a)30(ys )]TJ +/C2_0 1 Tf +14.451 0 Td +<005D>Tj +/TT0 1 Tf +[(nd )-212(a )-212(bunc)18(h )-212(of )-212(threads )-212(running )-212(on )-212(an )-212(application )-212(serv)12(er)74(, )-212(so )]TJ +-14.449 -1.44 Td +[(naming y)18(our custom threads differently is a good idea.)]TJ +1.8 -2.24 Td +[(T)45(he )-295(class )]TJ +/TT1 1 Tf +4.769 0 Td +(ThreadPoolExecutor)Tj +/TT0 1 Tf +[( )-297(reuses )-295(alread)24(y)]TJ +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +[(created )-295(threads )-295(behind )-295(the )-295(scenes, )-295(so )]TJ +-6.572 -1.44 Td +[(threads )-137(do )-137(not )-137(need )-137(to )-137(be )-137(created )-137(for )-137(eac)18(h )-137(task. )-100(An )-137(unc)18(hec)18(ked )-137(exception )-137(terminates )-137(a )-137(thread; )]TJ +0.002 -1.44 Td +[(w)18(hat )-97(immediately )-97(initiates )-97(its )-97(re-creation )-97(is )-97(pro)12(vided )-97(with )]TJ +/TT1 1 Tf +25.755 0 Td +(MonitorableThreadFactory)Tj +/TT0 1 Tf +[( )-99(\(see )]TJ +-25.756 -1.44 Td +[(Listing )-53(16\). )-53(New )-53(threads )-53(are )-53(created )-53(only )-53(until )-53(the )]TJ +/C2_0 1 Tf +22.264 0 Td +<0048004A003D003B00470046005D>Tj +/TT0 1 Tf +[(gured )-53(maximum )-53(number )-53(of )-53(threads )-53(is )]TJ +-22.263 -1.44 Td +[(reac)18(hed. )-280(Some )]TJ +/TT1 1 Tf +7.21 0 Td +(ThreadPool)Tj +/TT0 1 Tf +( )Tj +/C2_0 1 Tf +6.559 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gur)12(ations )-280(\(suc)18(h )-280(as )]TJ +/TT1 1 Tf +10.926 0 Td +(newCachedThreadPool)Tj +/TT0 1 Tf +[(\) )-282(destro)12(y )-280(idle )]TJ +-24.692 -1.44 Td +[(t)-216(h)-216(r)-216(e)-216(a)-216(d)-216(s)-216(. )-608(D)-216(e)-216(s)-216(t)-216(r)-216(o)-204(y)-198(e)-216(d )-608(t)-216(h)-216(r)-216(e)-216(a)-216(d)-216(s )-608(a)-216(r)-216(e )-608(a)-216(l)-216(s)-216(o )-608(c)-216(r)-216(e)-216(a)-216(t)-216(e)-216(d )-608(o)-216(n )-608(d)-216(e)-216(m)-216(a)-216(n)-216(d )-608(w)-216(i)-216(t)-216(h )-608(t)-216(h)-216(e )]TJ +/TT1 1 Tf +-0.016 -1.44 Td +(MonitorableThreadFactory)Tj +/TT0 1 Tf +(. )Tj +1.8 -2.24 Td +[(W)37(e )-303(alread)24(y )-303(co)12(v)12(ered )-303(tw)12(o )-303(of )-303(the )-303(par)12(ameters )-303(of )-303(the )-303(constructor: )]TJ +/TT1 1 Tf +29.596 0 Td +(ThreadPoolExecutor)Tj +-31.398 -1.32 Td +[(\()-8(N)-8(R)-8(_)-8(O)-8(F)-8(_)-8(T)-8(H)-8(R)-8(E)-8(A)-8(D)-8(S)-8(, )-504(N)-8(R)-8(_)-8(O)-8(F)-8(_)-8(T)-8(H)-8(R)-8(E)-8(A)-8(D)-8(S)-8(, )-504(I)-8(n)-8(t)-8(e)-8(g)-8(e)-8(r)-8(.)-8(M)-8(A)-8(X)-8(_)-8(V)-8(A)-8(L)-8(U)-8(E)-8(, )-504(T)-8(i)-8(m)-8(e)-8(U)-8(n)-8(i)-8(t)-8(.)-8(S)-8(E)-8(C)-8(O)-8(N)-8(D)-8(S)]TJ +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 472.9988 254.7001 Tm +(, )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 240.3001 Tm +[(workQueue, )-370(monitorableThreadFactory,)]TJ +/TT0 1 Tf +[( )-371(and)]TJ +/TT1 1 Tf +[( )-369(ignoringHandler\))]TJ +/TT0 1 Tf +[(. )-296(T)45(he )-369(remaining )]TJ +0 -1.44 TD +[(par)12(ameters )-108(are )-108(less )-108(interesting )-108(and )]TJ +/C2_0 1 Tf +15.587 0 Td +<003C003D005D>Tj +/TT0 1 Tf +[(ne )-108(the )-108(core )-108(pool )-108(size, )-108(the )-108(maximum )-108(size, )-108(the )-108(keep)]TJ +/TT3 1 Tf +(-)Tj +/TT0 1 Tf +[(ali)18(v)12(e )]TJ +-15.583 -1.44 Td +(time, the time unit, and an implementation of the )Tj +/TT1 1 Tf +(BlockingQueue)Tj +/TT0 1 Tf +( interface.)Tj +1.8 -2.24 Td +[(T)-30(h)-75(e )-538(c)-75(r)-75(e)-75(a)-75(t)-75(i)-75(o)-75(n )-538(a)-75(n)-75(d )-538(c)-75(o)-75(n)]TJ +/C2_0 1 Tf +11.79 0 Td +<005D>Tj +/TT0 1 Tf +0.631 0 Td +[(g)-75(u)-75(r)-63(a)-75(t)-75(i)-75(o)-75(n )-538(o)-75(f )-538(t)-75(h)-75(e )-538(t)-75(h)-75(r)-75(e)-75(a)-75(d )-538(p)-75(o)-75(o)-75(l )-538(w)-57(a)-75(s )-538(e)-75(x)-75(t)-75(r)-63(a)-75(c)-75(t)-75(e)-75(d )-538(i)-75(n)-75(t)-75(o )-538(t)-75(h)-75(e )]TJ +/TT1 1 Tf +-14.231 -1.44 Td +(setupThreadPools)Tj +/TT0 1 Tf +[( )-134(method. )-59(T)45(he )]TJ +/TT1 1 Tf +15.884 0 Td +(ThreadPoolExecutor)Tj +/TT0 1 Tf +[( )-135(went )-133(to )-133(production )-133(with )-133(tw)12(o )-133(core )]TJ +-15.882 -1.44 Td +[(threads, )-106(a )-106(maximum )-106(size )-106(of )-106(2, )-106(and )-106(a )-106(maximum )-106(queue )-106(size )-106(of )-106(2. )-106(Not )-106(a )-106(single )-106(request )-106(has )-106(been )]TJ +T* +[(rejected )-298(so )-298(far)74(. )-224(T)45(he )]TJ +/TT1 1 Tf +9.502 0 Td +(ThreadPoolExecutor)Tj +/TT0 1 Tf +[( )-300(is )-298(stored )-298(in )-298(a )-298(static )-298(member)74(. )-298(Sev)12(er)12(al )]TJ +/TT1 1 Tf +29.092 0 Td +(Filter)Tj +/TT0 1 Tf +( )Tj +-38.599 -1.44 Td +(instances share a single thread pool. )Tj +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 495 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(26)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 634.1 Tm +( public Response updateStatistics\(String url\) {)Tj +ET +Q +BT +/TT1 1 Tf +0 Tc 0 Tw 10 0 0 10 57 616.2 Tm +( if \(!isEmpty\(url\)\) {)Tj +0 -1.79 TD +( processURL\(url\);)Tj +T* +( })Tj +T* +( return Response.ok\(\).build\(\);)Tj +T* +( })Tj +T* +( //...)Tj +T* +(})Tj +/TT0 1 Tf +0 -1.88 TD +[(Listing 10: )74(T)45(he Serv)12(er)55(-Side POST)111(-Consuming Method)]TJ +1.8 -2.24 Td +[(T)45(he )]TJ +/TT1 1 Tf +2.015 0 Td +(@Stateless)Tj +/TT0 1 Tf +[( )-171(annotation )-170(tr)12(ansforms )-170(a )-171(POJO )-171(into )-171(an )-170(EJB )-170(3.1 )-171(bean. )-171(EJB )-170(3.1 )-171(beans )-171(are )]TJ +-3.815 -1.44 Td +[(especially )-122(interesting )-122(for )-122(the )-122(realization )-122(of )-122(a )-122(REST )-122(entry )-122(point. )-48(T)45(hey )-122(are )-122(thread-safe, )-122(monitored, )]TJ +0.004 -1.44 Td +[(p)-20(o)-20(o)-20(l)-20(e)-20(d)]TJ +/TT2 1 Tf +3.122 0 Td +(,)Tj +/TT0 1 Tf +[( )-510(a)-20(n)-20(d )-510(t)-20(r)-8(a)-20(n)-20(s)-20(a)-20(c)-20(t)-20(i)-20(o)-20(n)-20(a)-20(l)-20(. )-436(T)54(r)-8(a)-20(n)-20(s)-20(a)-20(c)-20(t)-20(i)-20(o)-20(n)-20(s )-510(a)-20(r)-20(e )-510(t)-20(h)-20(e )-510(m)-20(o)-20(s)-20(t )-510(i)-20(n)-20(t)-20(e)-20(r)-20(e)-20(s)-20(t)-20(i)-20(n)-20(g )-510(f)-20(e)-20(a)-20(t)-20(u)-20(r)-20(e)-20(. )-436(T)25(h)-20(e )-510(m)-20(e)-20(t)-20(h)-20(o)-20(d )]TJ +/TT1 1 Tf +-3.155 -1.44 Td +(updateStatistics)Tj +/TT0 1 Tf +[( )-113(starts )-111(and )-111(commits )-111(a )-111(new )-111(J)12(a)30(v)24(a )-37(T)74(r)12(ansaction )-74(API )-111(\(JT)74(A\) )-111(tr)12(ansaction )-111(on )-111(ev)12(ery )]TJ +-0.004 -1.44 Td +[(request. )-156(T)45(he )-230(tr)12(ansaction )-230(is )-230(tr)12(ansparently )-230(propagated )-230(to )-230(the )-230(bac)18(k)]TJ +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +[(end )-230(services. )-193(As )-230(long )-230(as )-230(the )]TJ +-0.004 -1.44 Td +[(request )-93(is )-93(propagated )-93(sync)18(hronously)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-93(it )-93(doesn\222)37(t )-93(matter )-93(w)18(hether )-93(it )-93(is )-93(processed )-93(b)18(y )-93(EJB )-93(3.1 )-93(beans, )]TJ +0 -1.44 TD +(POJOs)Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-38(or )-38(CDI )-38(managed )-38(beans. )36(T)45(he )-38(tr)12(ansaction )-38(is )-38(tr)12(ansparently )-38(passed )-38(to )-38(all )-38(participants )-38(in)12(v)18(oked )]TJ +-0.002 -1.44 Td +(from the )Tj +/TT1 1 Tf +(updateStatistics)Tj +/TT0 1 Tf +( method. )Tj +1.8 -2.24 Td +[(EJB )-62(beans, )-62(as )-62(well )-62(as )-62(CDI )-62(managed )-62(beans, )-62(can )-62(be )-62(decor)12(ated )-62(b)18(y )-62(inter)12(ceptors )-62(\(see )-62(Listing )-62(11\). )]TJ +-1.797 -1.44 Td +[(An )-232(inter)12(ceptor )-232(is )-232(suitable )-232(for )-232(the )-232(implementation )-232(of )-232(cross-cutting )-232(concerns. )-232(It )-232(is )-232(similar )-232(to )-232(a )]TJ +-0.004 -1.44 Td +[(d)24(ynamic )-286(proxy)92(, )-286(w)18(hereb)18(y )-286(the )-286(container )-286(realizes )-286(the )-286(tr)12(ansparent )-286(\223injection\224 )-286(of )-286(an )-286(inter)12(ceptor )]TJ +0.005 -1.44 Td +[(between the consumer and the pro)12(vider)74(. )]TJ +/TT1 1 Tf +0 -1.79 TD +(public class PerformanceAuditor {)Tj +T* +( private static final Logger LOG = Logger.getLogger)Tj +0 -0.99 TD +(\(PerformanceAuditor.class.getName\(\)\);)Tj +/TT3 1 Tf +0 -1.79 TD +( @AroundTimeout)Tj +T* +( @AroundInvoke)Tj +/TT1 1 Tf +T* +( public Object measurePerformance\(InvocationContext context\) throws\ )Tj +0 -0.99 TD +(Exception{)Tj +0 -1.79 TD +( String methodName = context.getMethod\(\).toString\(\);)Tj +T* +( long start = System.currentTimeMillis\(\);)Tj +T* +( try{)Tj +T* +( return context.proceed\(\);)Tj +T* +( }catch\(Exception e\){)Tj +T* +( LOG.log\(Level.SEVERE, "!!!During invocation of: {0} )Tj +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 496 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(20)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 57 632 Tm +[(Listing 5: Minimal persistence.xml with a Single P)45(ersistence Unit)]TJ +ET +Q +BT +/TT0 1 Tf +0 Tc 0 Tw 10 0 0 10 75 609.6 Tm +[(GlassF)18(ish )-136(3+ )-136(comes )-136(with )-136(a )-136(preinstalled )-136(EclipseLink )-136(\(http://www)74(.eclipse.org/eclipselink/\) )-136(JP)55(A )]TJ +-1.803 -1.44 Td +[(pro)12(vider)74(. )-252(Unfortunately)92(, )-252(the )-252(Roller )-252(application )-252(is )-252(alread)24(y )-252(bundled )-252(with )-252(the )-215(Apac)18(he )-252(OpenJP)55(A )]TJ +0 -1.44 TD +[(implementation. )-408(X-r)12(a)30(y)92(, )-408(ho)12(wev)12(er)74(, )-408(w)18(as )-408(intended )-408(to )-408(use )-408(the )-408(GlassF)18(ish )-408(default )-408(JP)55(A )-408(pro)12(vider)74(, )]TJ +0.005 -1.44 Td +(EclipseLink. )Tj +1.8 -2.24 Td +[(Because )-378(of )-378(the )-378(existence )-378(of )-378(OpenJP)55(A )-378(in )-378(the )-341(W)45(AR )]TJ +/C2_0 1 Tf +24.718 0 Td +<005D>Tj +/TT0 1 Tf +[(le, )-378(I )]TJ +/C2_0 1 Tf +3.202 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +[(ed )-378(the )]TJ +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +10 0 0 10 418.9901 543.9999 Tm +( )Tj +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 529.6 Tm +[(o)-44(r)-43(g)-44(.)-44(e)-43(c)-44(l)-44(i)-43(p)-44(s)-44(e)-43(.)-44(p)-44(e)-43(r)-44(s)-44(i)-43(s)-44(t)-44(e)-43(n)-44(c)-43(e)-44(.)-44(j)-43(p)-44(a)-43(.)-44(P)-44(e)-43(r)-44(s)-43(i)-44(s)-43(t)-44(e)-44(n)-43(c)-44(e)-43(P)-44(r)-44(o)-43(v)-44(i)-43(d)-44(e)-43(r )-522(<)-44(/)-44(p)-43(r)-44(o)-43(v)-44(i)-44(d)-43(e)-44(r)-43(>)]TJ +/TT0 1 Tf +[( )-522(t)-43(a)-43(g )-522(t)-43(o )]TJ +0.005 -1.44 Td +[(minimize )-27(interferences )-27(with )-27(OpenJP)55(A. )47(T)45(his )-27(is )-27(not )-27(necessary )-27(in )-27(cleanly )-27(pac)18(kaged )-27(applications. )47(T)45(he )]TJ +-0.004 -1.44 Td +[(lac)18(k )-35(of )-35(the )]TJ +/TT1 1 Tf +4.867 0 Td +()Tj +/TT0 1 Tf +[( )-36(tag )-35(causes )-35(the )-35(application )-35(serv)12(er )-35(to )-35(c)18(hoose )-35(its )-35(preinstalled )-35(JP)55(A )-35(pro)12(vider)74(. )]TJ +-4.861 -1.44 Td +[(T)45(he fallbac)18(k to the default pro)12(vider is another con)12(v)12(enient con)12(v)12(ention. )]TJ +1.8 -2.24 Td +[(T)45(he )-350(property )]TJ +/TT1 1 Tf +6.435 0 Td +(eclipselink.ddl-generation )Tj +/TT0 1 Tf +16.553 0 Td +[(controls )-350(the )-350(gener)12(ation )-350(of )-350(tables )-350(and )]TJ +-24.788 -1.44 Td +[(columns )-303(at )-303(deplo)12(yment )-303(time. )-229(T)45(he )-303(content )-303(of )-303(the )]TJ +/TT1 1 Tf +23.247 0 Td +(jta-database-source)Tj +/TT0 1 Tf +[( )-305(tag )-303(points )-303(to )-303(a )]TJ +-23.249 -1.44 Td +(properly )Tj +/C2_0 1 Tf +3.969 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gured )-79(data )-79(sour)12(ce )-79(at )-79(the )-79(application )-79(serv)12(er)74(. )-79(F)45(or )-79(our )-79(\223proof )-79(of )-79(concept\224 )-79(purposes, )-79(I )]TJ +-3.968 -1.44 Td +[(c)18(hose )-183(the )]TJ +/C2_0 1 Tf +4.739 0 Td +<0048004A003D003B00470046005D>Tj +/TT0 1 Tf +(gured )Tj +/TT1 1 Tf +6.463 0 Td +(jdbc/sample)Tj +/TT0 1 Tf +[( )-184(database. )-183(It )-183(is )-183(automatically )-183(created )-183(during )-183(NetBeans )]TJ +-11.199 -1.44 Td +[(\(J)12(a)30(v)24(a EE v)12(ersion\) installation. )]TJ +/TT1 1 Tf +1.8 -2.24 Td +(persistence.xml)Tj +/TT0 1 Tf +[( )-505(contains )-502(only )-501(a )-500(single )-501(persistence )-503(unit )-501(represented )-503(b)18(y )-500(the )-501(tag )]TJ +/TT1 1 Tf +-1.8 -1.44 Td +()Tj +/TT0 1 Tf +[(. )-147(Y)129(ou )-237(could )]TJ +/C2_0 1 Tf +15.973 0 Td +<003C003D005D>Tj +/TT0 1 Tf +[(ne )-237(multiple )-237(deplo)12(yment )-237(units )-237(with )-237(v)24(arious )-237(cac)18(hing )-237(or )]TJ +-15.973 -1.44 Td +[(v)24(alidation )-180(settings )-180(or )-180(ev)12(en )-180(with )-180(data )-180(sour)12(ce )-180(settings. )-180(If )-180(y)18(ou )]TJ +/C2_0 1 Tf +27.079 0 Td +<003C003D005D>Tj +/TT0 1 Tf +[(ne )-180(additional )]TJ +/TT1 1 Tf +7.92 0 Td +(persistence-)Tj +-34.999 -1.44 Td +(unit)Tj +/TT0 1 Tf +[( )-101(sections )-100(in )]TJ +/TT1 1 Tf +7.815 0 Td +(persistence.xml)Tj +/TT0 1 Tf +[(, )-102(y)18(ou )-100(also )-100(ha)30(v)12(e )-100(to )]TJ +/C2_0 1 Tf +17.335 0 Td +<003B00470046005D>Tj +/TT0 1 Tf +[(gure )-100(the )-100(injection )-100(and )-100(c)18(hoose )-100(the )]TJ +-25.154 -1.44 Td +[(n)-12(a)-12(m)-12(e )-506(o)-12(f )-506(t)-12(h)-12(e )-506(p)-12(e)-12(r)-12(s)-12(i)-12(s)-12(t)-12(e)-12(n)-12(c)-12(e )-506(u)-12(n)-12(i)-12(t )-506(i)-12(n )-506(t)-12(h)-12(e )]TJ +/TT1 1 Tf +18.924 0 Td +[(@)-13(P)-13(e)-13(r)-13(s)-13(i)-13(s)-13(t)-13(e)-13(n)-13(c)-13(e)-13(C)-13(o)-13(n)-13(t)-13(e)-13(x)-13(t)-13(\()-13(u)-13(n)-13(i)-13(t)-13(N)-13(a)-13(m)-13(e)-13(=)-13(\223)-13([)-13(n)-13(a)-13(m)-13(e)-13(])-13(\224)-13(\))]TJ +/TT0 1 Tf +( )Tj +-18.919 -1.44 Td +(annotation. )Tj +1.8 -2.24 Td +[(T)45(he )-82(injection )-82(of )-82(the )]TJ +/TT1 1 Tf +8.955 0 Td +(EntityManager)Tj +/TT0 1 Tf +[( )-84(in )-82(Listing )-82(3 )-82(is )-82(lac)18(king )-82(an )-82(explicit )]TJ +/TT1 1 Tf +22.836 0 Td +(unitName)Tj +/TT0 1 Tf +[( )-83(element )]TJ +-33.594 -1.44 Td +[(in )-182(the )]TJ +/TT1 1 Tf +3.088 0 Td +(@PersistenceContext)Tj +/TT0 1 Tf +[( )-184(annotation )-182(and )-182(will )-182(not )-182(w)12(ork )-182(with )-174(multiple )]TJ +/TT1 1 Tf +31.904 0 Td +(persistence-)Tj +-34.999 -1.44 Td +(unit)Tj +/TT0 1 Tf +10 0 0 10 366.8192 275.2 Tm +-28.582 -1.44 Td +[( )-23(instances. )14(An )-23(error )-23(will )-23(break )-23(the )-23(deplo)12(yment. )-22(Con)12(v)12(ention )-23(o)12(v)12(er )]TJ +/C2_0 1 Tf +28.032 0 Td +<001F00470046005D>Tj +/TT0 1 Tf +[(gur)12(ation )-23(w)12(orks )-23(only )-23(if )]TJ +-30.427 -1.44 Td +[(there is a single possible c)18(hoice.)]TJ +1.8 -2.24 Td +[(T)45(he )-361(method )]TJ +/TT1 1 Tf +6.124 0 Td +(StatisticsService#store)Tj +/TT0 1 Tf +[( )-363(is )-361(the )-361(essential )-361(use )-361(case )-361(for )-361(our )-361(proof )-361(of )]TJ +-7.919 -1.44 Td +(concept:)Tj +/TT1 1 Tf +1.8 -1.79 Td +( public void store\(String uri, String referer\) {)Tj +0 -1.79 TD +( em.persist\(new Statistic\(uri, referer\)\);)Tj +T* +( })Tj +0 -2.24 TD +(StatisticsService)Tj +/TT0 1 Tf +[( )-382(is )-380(an )-380(EJB )-380(3.1 )-380(bean, )-380(so )-380(the )-380(method )-380(store )-380(is )-380(in)12(v)18(oked )-380(inside )-380(a )]TJ +-1.798 -1.44 Td +[(tr)12(ansaction )-42(context. )32(T)45(he )-42(newly )-42(created )]TJ +/TT1 1 Tf +17.03 0 Td +(Statistic)Tj +/TT0 1 Tf +[( )-43(entity )-42(is )-42(passed )-42(to )-42(the )]TJ +/TT1 1 Tf +15.436 0 Td +(EntityManager)Tj +/TT0 1 Tf +[( )-43(and )]TJ +-32.467 -1.44 Td +[(becomes )-33(\223managed.)55(\224 )41(T)45(he )]TJ +/TT1 1 Tf +11.316 0 Td +(EntityManager)Tj +/TT0 1 Tf +[( )-34(no)12(w )-33(holds )-33(a )-33(reference )-33(to )-33(the )]TJ +/TT1 1 Tf +20.859 0 Td +(Statistic)Tj +/TT0 1 Tf +[( )-34(entity )-33(and )]TJ +-32.175 -1.44 Td +[(tr)12(ac)18(ks )-81(its )-81(c)18(hanges. )-81(Because )-81(it )-81(is )-81(deplo)12(y)18(ed )-81(as )]TJ +/TT1 1 Tf +19.688 0 Td +(transaction-type=\223JTA\224)Tj +/TT0 1 Tf +[( )-83(\(see )-81(Listing )-81(5\), )-81(ev)12(ery )]TJ +-19.683 -1.44 Td +(commit )Tj +/C2_0 1 Tf +3.583 0 Td +<005E>Tj +/TT0 1 Tf +[(ushes )-27(all )-26(managed )-27(and )-26(\223dirty\224 )-27(entities )-27(to )-27(the )-27(database. )48(T)45(he )-26(tr)12(ansaction )-27(is )-26(committed )-26(just )]TJ +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 497 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +0.044 Tc -0.044 Tw 10 0 0 10 261.3228 59 Tm +(14)Tj +0 Tc 0 Tw -18.632 57.06 Td +[(T)45(he robustness and a)30(v)24(ailability of x-r)12(a)30(y is the most important feature. Gathering of statistics )]TJ +-1.8 -1.44 Td +[(must not affect the blog a)30(v)24(ailability)92(.)]TJ +/TT1 1 Tf +12 0 0 12 57 551.6 Tm +[(Constr)12(aints)]TJ +/TT0 1 Tf +10 0 0 10 75 529.2 Tm +[(Roller )-153(\(http://rollerweblogger)74(.org/project/\) )-153(r)12(an )-153(for )-153(o)12(v)12(er )-153(4 )-153(y)18(ears )-153(on )-153(GlassF)18(ish )-153(v2. )-153(Recently)92(, )-153(it )]TJ +-1.797 -1.44 Td +[(w)18(as )-127(migr)12(ated )-127(to )-127(GlassF)18(ish )-127(v3.1, )-127(J2SE )-127(Softw)18(are )-127(Dev)12(elopment )-127(Kit )-127(\(JDK\) )-127(1.6, )-127(and )-127(fully )-127(virtualized )]TJ +0 -1.44 TD +[(Or)12(acle Enterprise Linux \(w)18(hic)18(h is compatible with Red Hat Linux\). GlassF)18(ish v3+ )]TJ +T* +[(\()-17(h)-17(t)-17(t)-17(p)-17(:)-17(/)-17(/)-17(g)-17(l)-17(a)-17(s)-17(s)]TJ +/C2_0 1 Tf +5.057 0 Td +<005D>Tj +/TT0 1 Tf +0.573 0 Td +[(s)-17(h)-17(.)-17(j)-17(a)13(v)7(a)-17(.)-17(n)-17(e)-17(t)-17(/)-17(\) )-509(i)-17(s )-509(t)-17(h)-17(e )-509(J)-5(a)13(v)7(a )-509(P)-17(l)-17(a)-17(t)-17(f)-17(o)-17(r)-17(m)-17(, )-509(E)-17(n)-17(t)-17(e)-17(r)-17(p)-17(r)-17(i)-17(s)-17(e )-509(E)-17(d)-17(i)-17(t)-17(i)-17(o)-17(n )-509(\()-17(J)-5(a)13(v)7(a )-509(E)-17(E)-17(\) )-509(6 )-509(r)-17(e)-17(f)-17(e)-17(r)-17(e)-17(n)-17(c)-17(e )]TJ +-5.628 -1.44 Td +(implementation. )Tj +1.8 -2.24 Td +[(X-r)12(a)30(y )-109(is )-109(deplo)12(y)18(ed )-109(on )-109(GlassF)18(ish )-109(v3 )-109(and )-109(so )-109(it )-109(can )-109(lev)12(er)12(age )-109(all )-109(J)12(a)30(v)24(a )-109(EE )-109(6 )-109(features )-109(without )-109(an)18(y )]TJ +-1.808 -1.44 Td +[(constr)12(aints. )-9(Ma)30(v)12(en )-9(3 )-9(\(http://ma)30(v)12(en.apac)18(he.org/\) )-9(is )-9(used )-9(as )-9(a )-9(build )-9(tool )-9(that )-9(is )-9(executed )-9(on )-9(Hudson )]TJ +-0.001 -1.44 Td +[(\(http://ja)30(v)24(a.net/projects/hudson/\) and the J)12(enkins Continuous Integr)12(ation \(CI\) serv)12(er )]TJ +T* +(\(http://jenkins-ci.org/\).)Tj +1.8 -2.24 Td +[(Roller )-259(runs )-259(on )-259(a )-259(single )-259(node )-259(and )-259(there )-259(ha)30(v)12(e )-259(been )-259(no )-259(performance )-259(problems )-259(so )-259(far)74(, )-259(so )]TJ +-1.806 -1.44 Td +[(clustering )-182(is )-182(considered )-182(optional. )-181(It )-182(is )-182(unlikely )-182(that )-182(x-r)12(a)30(y )-181(will )-182(ev)12(er )-181(need )-182(to )-182(run )-181(in )-182(a )-181(clustered )]TJ +0.003 -1.44 Td +[(en)12(vironment. )-272(A )-309(single-node )-309(setup )-309(makes )-309(cac)18(hing )-309(a )-309(lot )-309(easier )-309(and )-309(it )-309(does )-309(not )-309(require )-309(an)18(y )]TJ +T* +[(distribution or replication str)12(ategies.)]TJ +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 498 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(9)Tj +ET +q +52 72 432 569 re +W n +BT +/TT1 1 Tf +12 0 0 12 57 630 Tm +(Preface)Tj +ET +Q +BT +/TT1 1 Tf +64 0 0 64 270.36 552.8 Tm +(Preface)Tj +/TT0 1 Tf +10 0 0 10 75 474.4 Tm +(My )Tj +/C2_0 1 Tf +1.822 0 Td +<005D>Tj +/TT0 1 Tf +[(rst )-155(self-published )-155(book)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +( )Tj +/TT3 1 Tf +11.276 0 Td +[(Real )-118(W)37(orld )-155(J)12(a)30(v)24(a )-155(EE )-155(P)92(atterns\227Rethinking )-155(Best )-155(Pr)12(actice)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-155(\(http://)]TJ +-14.9 -1.44 Td +(press.adam-bien.com\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-61(has )-61(sold )-61(far )-61(better )-61(than )-61(expected. )-61(Ev)12(en )-61(the )-61(complementary )-61(project )-61(\(http://)]TJ +0.001 -1.44 Td +[(kenai.com/projects/ja)30(v)24(aee-patterns/\) )-149(is )-149(one )-149(of )-149(the )-149(most )-149(successful )-149(kenai.com )-149(projects )-149(with )-149(o)12(v)12(er )]TJ +0.004 -1.44 Td +[(400 )-86(members. )-12(T)45(he )]TJ +/TT3 1 Tf +8.475 0 Td +[(Real )-49(W)37(orld )-86(J)12(a)30(v)24(a )-86(EE )-86(P)92(atterns)]TJ +/TT0 1 Tf +[( )-86(book )-86(ans)12(wers )-86(man)18(y )-86(questions )-86(I )-86(ha)30(v)12(e )-86(been )-86(asked )]TJ +-8.481 -1.44 Td +[(during )-20(m)12(y )-20(projects )-20(and )-20(consulting )-20(w)12(ork. )54(T)45(he )-20(old )-20(J)12(a)30(v)24(a )-20(2 )-20(Platform, )-20(Enterprise )-20(Edition )-20(\(J2EE\) )-20(patterns )]TJ +0 -1.44 TD +[(ha)30(v)12(e )-90(not )-90(been )-90(updated )-90(b)18(y )-90(Sun )-90(or )-90(Or)12(acle, )-90(and )-90(more )-90(and )-90(more )-90(projects )-90(are )-90(being )-90(migr)12(ated )-90(from )]TJ +0.002 -1.44 Td +[(the )-126(J2EE )-126(to )-126(J)12(a)30(v)24(a )-126(Platform, )-126(Enterprise )-126(Edition )-126(\(J)12(a)30(v)24(a )-126(EE\) )-126(without )-126(a )-126(corresponding )-126(rethinking )-126(of )-126(the )]TJ +0.005 -1.44 Td +[(best )-90(pr)12(actices. )-90(Often)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-90(the )-90(result )-90(is )-90(the )-90(Same )-90(Old )-90(\(exagger)12(ated\) )-53(Ar)12(c)18(hitecture )-90(\(SO)37(A )-90(for )-90(short )-90(:-\)\) )-90(or )]TJ +0.006 -1.44 Td +(bloated code on a lean platform.)Tj +1.8 -2.24 Td +[(T)45(he )]TJ +/TT3 1 Tf +1.907 0 Td +[(Real )-25(W)37(orld )-62(J)12(a)30(v)24(a )-62(EE )-62(P)92(atterns)]TJ +/TT0 1 Tf +[( )-62(book )-62(w)18(as )-62(published )-62(about )-62(tw)12(o )-62(y)18(ears )-62(ago. )-62(Since )-62(then, )-62(I )-62(ha)30(v)12(e )]TJ +-3.708 -1.44 Td +[(recei)18(v)12(ed )-133(lots )-133(of )-133(requests )-133(for )-133(information )-133(regarding )-133(builds, )-133(testing, )-133(and )-133(performance)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-133(and )-133(I )-133(ha)30(v)12(e )]TJ +T* +[(recei)18(v)12(ed )-148(more )]TJ +/C2_0 1 Tf +6.711 0 Td +<004B0048003D003B0041005D>Tj +/TT0 1 Tf +[(c )-148(J)12(a)30(v)24(a )-148(EE )-148(questions. )-148(In )-148(addition, )-148(m)12(y )-148(blog )-148(\(http://blog.adam-bien.com\) )-148(has )]TJ +-6.708 -1.44 Td +[(become )-104(more )-104(and )-104(more )-104(popular)74(. )-104(Shortly )-104(after )-104(publishing )-104(ev)12(ery )-104(J)12(a)30(v)24(a )-104(EE )-104(post )-104(\(these )-104(are )-104(the )-104(most )]TJ +-0.001 -1.44 Td +(\223dangerous\224\))Tj +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-13(m)12(y )-13(Internet )-13(connection )-13(comes )-13(close )-13(to )-13(collapsing. )-13(\(Y)129(ou )-13(should )-13(kno)12(w )-13(that )-13(m)12(y )-13(serv)12(er )]TJ +0.002 -1.44 Td +[(resides )-140(in )-140(m)12(y )-140(basement )-140(and )-140(also )-140(acts )-140(as )-140(m)12(y )-140(Internet )-140(proxy)92(.\) )-140(It )-140(became )-140(so )-140(bad )-140(that )-140(I )-140(started )-140(to )]TJ +-0.004 -1.44 Td +[(publish )-83(the )-83(posts )-83(w)18(hen )-83(I )-83(w)18(as )-83(not )-83(at )-83(home. )-9(T)45(he )-83(w)18(hole )-83(situation )-83(made )-83(me )-83(curious)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-83(so )-83(I )-83(started )-83(to )]TJ +0.002 -1.44 Td +[(look for monitoring softw)18(are so I could see in real time w)18(hat w)18(as happening on m)12(y serv)12(er)74(. )]TJ +1.8 -2.24 Td +(I couldn\222)Tj +/C2_0 1 Tf +3.799 0 Td +<004C0001005D>Tj +/TT0 1 Tf +[(nd an)18(y monitoring softw)]TJ +/C2_0 1 Tf +11.581 0 Td +<0039004A003D0001004B0048003D003B0041005D>Tj +/TT0 1 Tf +(cally for the Roller weblogger )Tj +-17.18 -1.44 Td +[(\(http://rollerweblogger)74(.org/project/\), )-374(w)18(hic)18(h )-374(is )-374(w)18(hat )-374(m)12(y )-374(blog )-374(runs )-374(on. )-374(J)12(a)30(v)24(a )]TJ +/C2_0 1 Tf +34.673 0 Td +<0048004A0047005D>Tj +/TT0 1 Tf +[(lers )-374(are )-374(too )]TJ +-34.672 -1.44 Td +[(tec)18(hnical, )-240(too )]TJ +/C2_0 1 Tf +6.632 0 Td +<005D>Tj +/TT0 1 Tf +(ne)Tj +/TT2 1 Tf +(-)Tj +/TT0 1 Tf +[(gr)12(ained)]TJ +/TT2 1 Tf +(,)Tj +/TT0 1 Tf +[( )-240(and )-240(too )-240(intrusi)18(v)12(e. )-240(Launc)18(hing )-240(a )-203(W)37(ebalizer )-240(\(http://www)74(.mrunix.net/)]TJ +-6.631 -1.44 Td +[(webalizer/\) )-70(job )-70(after )-58(eac)18(h )-70(post )-70(w)18(as )-70(not )-70(viable; )-70(it )-70(took )-70(sev)12(er)12(al )-70(hours )-70(to )-70(process )-70(all )-70(the )-70(logs. )4(T)45(hus, )]TJ +-0.016 -1.44 Td +[(the idea of building m)12(y \223x-r)12(a)30(y\224 softw)18(are w)18(as born. )]TJ +1.8 -2.24 Td +[(I )-186(w)18(as )-186(able )-186(to )-186(build )-186(a )-186(prototype )-186(in )-186(a )-186(fr)12(action )-186(of )-186(a )-186(weekend )-186(and )-186(put )-186(it )-186(into )-186(production. )-186(It )]TJ +-1.806 -1.44 Td +[(w)12(orked )-186(well )-186(and )-186(w)18(as )-186(good )-186(enough )-186(to )-186(gi)18(v)12(e )-186(me )-186(an )-186(idea )-186(of )-186(w)18(hat )-186(actually )-186(happens )-186(behind )-186(the )]TJ +-0.006 -1.44 Td +[(scenes )-205(on )-205(m)12(y )-205(blog. )-131(T)45(he )-205(result? )-131(T)45(here )-205(w)18(as )-205(nothing )-205(suspicious )-205(going )-205(on\227J)12(a)30(v)24(a )-205(EE )-205(is )-205(just )-205(more)]TJ +10 0 0 10 148.027 170.4001 Tm +33.084 -6.56 Td +( )Tj +-42.2 -1.44 Td +[(popular than I expected. My serv)12(er w)18(as o)12(v)12(erw)18(helmed b)18(y human visitors, not bots. )]TJ +0 g +/GS1 gs +/TT4 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT5 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT4 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 499 0 obj <>stream +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 264.3228 59 Tm +(6)Tj +/TT1 1 Tf +12 0 0 12 57 600.4 Tm +( )Tj +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj 500 0 obj <>stream +q +52 72 432 569 re +W n +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +10 0 0 10 57 632 Tm +[(Real )37(W)37(orld J)12(a)30(v)24(a EE Night Hac)18(ks )]TJ +ET +Q +BT +/CS0 cs 0 scn +/GS0 gs +/TT0 1 Tf +9 0 0 9 198.23 632 Tm +(\227)Tj +ET +q +52 72 432 569 re +W n +BT +/TT0 1 Tf +10 0 0 10 207.23 632 Tm +[( Dissecting the Business )74(T)74(ier)]TJ +ET +Q +BT +/TT1 1 Tf +10 0 0 10 57 620 Tm +[(b)18(y )37(Adam Bien)]TJ +0 -3.6 TD +[(Cop)18(yright \251 2011 press.adam-bien.com. )37(All rights reserv)12(ed. )]TJ +0 -1.2 TD +[(Published b)18(y press.adam-bien.com.)]TJ +T* +[(F)45(or more information or feedbac)18(k, contact abien@adam-bien.com.)]TJ +/TT0 1 Tf +0 -2.4 TD +[(Co)12(v)12(er Picture: )]TJ +/TT1 1 Tf +[(T)45(he front picture is the por)12(c)18(h of the Moscone Center in San F)37(r)12(ancisco and w)18(as )]TJ +0 -1.2 TD +[(taken during the 2010 J)12(a)30(v)24(aOne conference. )74(T)45(he name \223x-r)12(a)30(y\224 is inspired b)18(y the under side of the )]TJ +T* +[(por)12(c)18(h :-\). )]TJ +T* +( )Tj +/TT0 1 Tf +T* +[(Co)12(v)12(er Designer)]TJ +/TT1 1 Tf +[(: Kinga Bien \(http://design.gr)12(aphikerin.com\) )]TJ +/TT0 1 Tf +T* +(Editor)Tj +/TT1 1 Tf +[(: Karen P)45(erkins \(http://www)74(.linkedin.com/in/karenjperkins\))]TJ +0 -6 TD +(Printing History: )Tj +0 -1.2 TD +[(April 2011 Iter)12(ation One \(F)18(irst Edition\))]TJ +0 -30 TD +(ISBN 978-0-557-07832-5)Tj +0 g +/GS1 gs +/TT2 1 Tf +-0.103 Tc 0 8.25 -8.25 0 7.0437 260.3998 Tm +(D)Tj +/TT3 1 Tf +-0.104 Tc 0 8.3 -8.3 0 7.0437 265.8897 Tm +(o)Tj +/TT2 1 Tf +0.53 0 Td +[(w)-91(n)-91(l)-91(o)-91(a)-91(d)-91( )-91(f)-91(r)-91(o)-91(m)-91( )-91(W)-91(o)-91(w)-91(!)-91( )-91(e)-91(B)-91(o)-91(o)-91(k)-91( )-91(<)-91(w)-91(w)-91(w)-91(.)-91(w)-91(o)-91(w)-91(e)-91(b)-91(o)-91(o)-91(k)-91(.)-91(c)-91(o)-91(m)-91(>)]TJ +ET + +endstream endobj xref +0 2 +0000000000 65535 f +0001861786 00000 n +15 1 +0001862069 00000 n +23 1 +0001862354 00000 n +37 1 +0001862672 00000 n +54 1 +0001862968 00000 n +70 1 +0001863265 00000 n +89 1 +0001863573 00000 n +105 1 +0001863892 00000 n +125 1 +0001864191 00000 n +144 1 +0001864490 00000 n +161 1 +0001864767 00000 n +175 1 +0001865087 00000 n +194 1 +0001865396 00000 n +210 1 +0001865684 00000 n +223 1 +0001865983 00000 n +236 1 +0001866282 00000 n +260 1 +0001866592 00000 n +280 1 +0001866912 00000 n +293 1 +0001867232 00000 n +308 1 +0001867520 00000 n +327 1 +0001867840 00000 n +341 1 +0001868160 00000 n +357 1 +0001868500 00000 n +375 1 +0001868809 00000 n +393 1 +0001869132 00000 n +398 1 +0001869453 00000 n +460 1 +0001869764 00000 n +467 34 +0001873481 00000 n +0001873695 00000 n +0001873856 00000 n +0001874172 00000 n +0001877900 00000 n +0001881827 00000 n +0001882064 00000 n +0001882301 00000 n +0001924048 00000 n +0001924161 00000 n +0001928424 00000 n +0001934627 00000 n +0001939600 00000 n +0001941013 00000 n +0001944942 00000 n +0001950088 00000 n +0001952121 00000 n +0001957867 00000 n +0001964170 00000 n +0001967986 00000 n +0001970739 00000 n +0001974350 00000 n +0001976442 00000 n +0001979406 00000 n +0001987519 00000 n +0001988064 00000 n +0001990909 00000 n +0001993083 00000 n +0001999752 00000 n +0002004117 00000 n +0002011876 00000 n +0002015165 00000 n +0002021655 00000 n +0002022214 00000 n +trailer +<]/Prev 1852303>> +startxref +2023991 +%%EOF +1 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 8 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 11 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 13 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 15 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 18 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 21 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 23 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 27 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 29 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 32 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 34 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 37 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 39 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 42 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 48 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 50 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 52 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 54 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 56 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 59 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 61 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 66 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 68 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 70 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 73 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 75 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 77 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 80 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 82 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 85 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 87 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 89 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 91 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 93 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 96 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 98 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 100 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 103 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 105 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 108 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 110 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 112 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 114 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 116 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 119 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 121 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 123 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 125 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 127 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 130 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 133 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 135 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 137 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 139 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 142 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 144 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 146 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 148 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 150 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 153 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 155 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 157 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 159 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 161 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 164 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 166 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 168 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 170 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 172 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 175 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 177 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 179 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 181 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 183 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 186 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 188 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 190 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 192 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 194 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 197 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 199 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 201 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 203 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 205 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 208 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 210 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 212 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 214 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 216 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 219 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 221 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 223 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 225 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 227 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 230 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 232 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 234 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 236 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 238 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 241 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 243 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 245 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 251 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 253 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 256 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 258 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 260 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 262 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 264 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 267 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 269 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 271 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 273 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 275 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 278 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 280 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 282 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 284 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 286 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 289 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 291 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 293 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 295 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 297 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 300 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 302 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 304 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 306 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 308 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 311 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 313 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 315 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 317 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 319 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 324 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 327 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 329 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 332 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 334 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 337 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 339 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 341 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 344 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 346 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 349 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 351 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 353 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 355 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 357 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 360 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 362 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 365 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 367 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 370 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 373 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 375 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 377 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>>/Type/Page>> endobj 382 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 384 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 387 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 389 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 391 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 393 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 396 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 398 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 460 0 obj <>stream + + + + + 2011-04-30T08:32:52Z + Scrivener + 2011-05-14T21:26:58+03:00 + 2011-05-14T21:26:58+03:00 + + + + Adobe Mac PDF Plug-in + + + application/pdf + + + Adam Bien + + + + + x-ray + + + + + uuid:e861431c-77d7-784e-a7dc-7f756ad21027 + uuid:cea005cc-f402-4fd3-8a68-35256bd1fc99 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 461 0 obj <> endobj 467 0 obj <> endobj 501 0 obj <> endobj xref +1 1 +0002025589 00000 n +8 1 +0002025873 00000 n +11 1 +0002026131 00000 n +13 1 +0002026380 00000 n +15 1 +0002026618 00000 n +18 1 +0002026904 00000 n +21 1 +0002027176 00000 n +23 1 +0002027415 00000 n +27 1 +0002027734 00000 n +29 1 +0002028006 00000 n +32 1 +0002028266 00000 n +34 1 +0002028526 00000 n +37 1 +0002028797 00000 n +39 1 +0002029094 00000 n +42 1 +0002029376 00000 n +48 1 +0002029659 00000 n +50 1 +0002029931 00000 n +52 1 +0002030203 00000 n +54 1 +0002030464 00000 n +56 1 +0002030762 00000 n +59 1 +0002031033 00000 n +61 1 +0002031305 00000 n +66 1 +0002031577 00000 n +68 1 +0002031859 00000 n +70 1 +0002032142 00000 n +73 1 +0002032451 00000 n +75 1 +0002032723 00000 n +77 1 +0002032962 00000 n +80 1 +0002033256 00000 n +82 1 +0002033549 00000 n +85 1 +0002033842 00000 n +87 1 +0002034114 00000 n +89 1 +0002034386 00000 n +91 1 +0002034706 00000 n +93 1 +0002034988 00000 n +96 1 +0002035260 00000 n +98 1 +0002035532 00000 n +100 1 +0002035815 00000 n +103 1 +0002036130 00000 n +105 1 +0002036404 00000 n +108 1 +0002036704 00000 n +110 1 +0002036989 00000 n +112 1 +0002037242 00000 n +114 1 +0002037495 00000 n +116 1 +0002037748 00000 n +119 1 +0002038001 00000 n +121 1 +0002038276 00000 n +123 1 +0002038551 00000 n +125 1 +0002038836 00000 n +127 1 +0002039136 00000 n +130 1 +0002039421 00000 n +133 1 +0002039727 00000 n +135 1 +0002040001 00000 n +137 1 +0002040254 00000 n +139 1 +0002040518 00000 n +142 1 +0002040804 00000 n +144 1 +0002041079 00000 n +146 1 +0002041357 00000 n +148 1 +0002041642 00000 n +150 1 +0002041928 00000 n +153 1 +0002042181 00000 n +155 1 +0002042456 00000 n +157 1 +0002042741 00000 n +159 1 +0002043016 00000 n +161 1 +0002043301 00000 n +164 1 +0002043622 00000 n +166 1 +0002043907 00000 n +168 1 +0002044182 00000 n +170 1 +0002044457 00000 n +172 1 +0002044753 00000 n +175 1 +0002045028 00000 n +177 1 +0002045338 00000 n +179 1 +0002045613 00000 n +181 1 +0002045888 00000 n +183 1 +0002046152 00000 n +186 1 +0002046426 00000 n +188 1 +0002046711 00000 n +190 1 +0002046997 00000 n +192 1 +0002047282 00000 n +194 1 +0002047535 00000 n +197 1 +0002047824 00000 n +199 1 +0002048088 00000 n +201 1 +0002048362 00000 n +203 1 +0002048637 00000 n +205 1 +0002048912 00000 n +208 1 +0002049186 00000 n +210 1 +0002049450 00000 n +212 1 +0002049750 00000 n +214 1 +0002050014 00000 n +216 1 +0002050299 00000 n +219 1 +0002050595 00000 n +221 1 +0002050859 00000 n +223 1 +0002051123 00000 n +225 1 +0002051423 00000 n +227 1 +0002051708 00000 n +230 1 +0002051983 00000 n +232 1 +0002052236 00000 n +234 1 +0002052533 00000 n +236 1 +0002052808 00000 n +238 1 +0002053119 00000 n +241 1 +0002053394 00000 n +243 1 +0002053690 00000 n +245 1 +0002053998 00000 n +251 1 +0002054309 00000 n +253 1 +0002054595 00000 n +256 1 +0002054880 00000 n +258 1 +0002055166 00000 n +260 1 +0002055430 00000 n +262 1 +0002055751 00000 n +264 1 +0002056047 00000 n +267 1 +0002056322 00000 n +269 1 +0002056575 00000 n +271 1 +0002056850 00000 n +273 1 +0002057103 00000 n +275 1 +0002057378 00000 n +278 1 +0002057642 00000 n +280 1 +0002057906 00000 n +282 1 +0002058227 00000 n +284 1 +0002058502 00000 n +286 1 +0002058766 00000 n +289 1 +0002059076 00000 n +291 1 +0002059318 00000 n +293 1 +0002059592 00000 n +295 1 +0002059881 00000 n +297 1 +0002060145 00000 n +300 1 +0002060430 00000 n +302 1 +0002060726 00000 n +304 1 +0002061000 00000 n +306 1 +0002061275 00000 n +308 1 +0002061528 00000 n +311 1 +0002061849 00000 n +313 1 +0002062124 00000 n +315 1 +0002062377 00000 n +317 1 +0002062641 00000 n +319 1 +0002062926 00000 n +324 1 +0002063245 00000 n +327 1 +0002063540 00000 n +329 1 +0002063861 00000 n +332 1 +0002064167 00000 n +334 1 +0002064442 00000 n +337 1 +0002064695 00000 n +339 1 +0002064959 00000 n +341 1 +0002065234 00000 n +344 1 +0002065575 00000 n +346 1 +0002065839 00000 n +349 1 +0002066103 00000 n +351 1 +0002066388 00000 n +353 1 +0002066662 00000 n +355 1 +0002066936 00000 n +357 1 +0002067178 00000 n +360 1 +0002067488 00000 n +362 1 +0002067784 00000 n +365 1 +0002068124 00000 n +367 1 +0002068399 00000 n +370 1 +0002068704 00000 n +373 1 +0002068968 00000 n +375 1 +0002069242 00000 n +377 1 +0002069566 00000 n +382 1 +0002069905 00000 n +384 1 +0002070190 00000 n +387 1 +0002070486 00000 n +389 1 +0002070739 00000 n +391 1 +0002071027 00000 n +393 1 +0002071269 00000 n +396 1 +0002071591 00000 n +398 1 +0002071879 00000 n +460 2 +0002072191 00000 n +0002075905 00000 n +467 1 +0002076002 00000 n +501 1 +0002076216 00000 n +trailer +<<48F5C20BE0B18E49B77EE73DCB1687E5>]/Prev 2023991 >> +startxref +2076260 +%%EOF diff --git a/ws2012/Bachelor Thesis/Literatur/JEE/RealWorldJavaEE.pdf b/ws2012/Bachelor Thesis/Literatur/JEE/RealWorldJavaEE.pdf new file mode 100644 index 00000000..2effca39 Binary files /dev/null and b/ws2012/Bachelor Thesis/Literatur/JEE/RealWorldJavaEE.pdf differ diff --git a/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/BS1_TBA A 31_20110614_070000.TXT b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/BS1_TBA A 31_20110614_070000.TXT new file mode 100755 index 00000000..ac5d6a61 --- /dev/null +++ b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/BS1_TBA A 31_20110614_070000.TXT @@ -0,0 +1,3595 @@ +V02;14.06.2011 07:00:00 +L;1;A 31;SFV 4;SFG 34;SFG 35;SSTRAB 56;SSTRAB 57;SFV 5;SBS 34;SBS 35;SPT 2;S;S;D;D;D;D +1;1;9;630;0;GRRGGGDDA0000 +2;1;9;640;0 +3;1;9;650;0 +4;1;9;660;0 +5;1;9;670;0 +6;1;9;680;0 +7;1;9;690;0 +9;1;9;0;0 +9;1;9;10;0 +10;1;9;20;0 +11;1;9;30;0;GRRGGGDDA0000 +12;1;9;40;0 +13;1;9;50;0 +14;1;9;55;0 +15;1;9;65;0 +16;1;9;75;0 +17;1;9;85;0 +18;1;9;95;0 +20;1;9;105;0 +21;1;9;115;0;GRRGGGDDA0000 +21;1;9;125;0;GRRGGGDDA0000 +22;1;9;135;0 +23;1;9;145;0 +24;1;9;155;0 +25;1;9;165;0 +26;1;9;175;0 +27;1;9;185;0 +28;1;9;195;0 +30;1;9;205;0 +31;1;9;215;0;GRRAGGDDA0000 +32;1;9;225;0;ARRAGGDDA0000 +32;1;9;235;0 +33;1;9;245;0 +34;1;9;255;0;RRRRGGDDA0000 +35;1;9;265;0 +36;1;9;275;0;RGRRGGGDA0000 +37;1;9;285;0 +38;1;9;295;0;RGRRAGGDA0000 +39;1;9;305;0;RGRRAAGDA0000 +42;1;9;315;3 +43;1;9;315;3 +44;1;9;315;3;DDDDDDDDD0000 +45;1;9;315;3 +46;1;9;315;3 +47;1;9;315;3 +48;1;9;315;3 +49;1;9;315;3 +50;1;9;315;3 +50;1;9;315;0;RRGRRRDGA0000 +51;1;9;425;0;RRGRRRDGA0000 +53;1;9;435;0 +54;1;9;445;0 +54;1;9;455;0 +55;1;9;465;0 +56;1;9;475;0;RRRRRRDDA0000 +57;1;9;485;0 +58;1;9;495;0 +59;1;9;505;0 +60;1;9;515;0;SRRRRRDDA0000 +61;1;9;525;0;GRRGRRDDA0000 +62;1;9;535;0 +64;1;9;545;0 +65;1;9;555;0 +65;1;9;565;0 +66;1;9;575;0 +67;1;9;585;0 +68;1;9;595;0;GRRGRSDDA0000 +69;1;9;605;0;GRRGGGDDA0000 +70;1;9;615;0 +71;1;9;625;0;GRRGGGDDA0000 +72;1;9;635;0 +73;1;9;645;0 +75;1;9;655;0 +76;1;9;665;0 +76;1;9;675;0 +77;1;9;685;0 +78;1;9;695;0 +79;1;9;5;0 +80;1;9;15;0 +81;1;9;25;0;GRRGGGDDA0000 +82;1;9;35;0 +83;1;9;45;0 +84;1;9;55;0 +86;1;9;65;0 +86;1;9;75;0 +87;1;9;85;0 +88;1;9;95;0 +89;1;9;105;0 +90;1;9;115;0 +91;1;9;125;0;GRRGGGDDA0000 +92;1;9;135;0 +93;1;9;145;0 +94;1;9;155;0 +95;1;9;165;0 +96;1;9;175;0 +97;1;9;185;0 +98;1;9;195;0 +99;1;9;205;0;GRRAGGDDA0000 +100;1;9;215;0;ARRAGGDDA0000 +101;1;9;225;0;ARRAGGDDA0000 +102;1;9;235;0 +103;1;9;245;0;RRRRGGDDA0000 +104;1;9;255;0 +105;1;9;265;0;RGRRGGGDA0000 +106;1;9;275;0 +107;1;9;285;0 +108;1;9;295;0;RGRRAGGDA0000 +109;1;9;305;0;RGRRAAGDA0000 +110;1;9;315;0 +111;1;9;325;0;RGRRAAGDA0000 +112;1;9;335;0;RGRRRRGDA0000 +113;1;9;345;0 +114;1;9;355;0;RGGRRRGGA0000 +115;1;9;365;0 +116;1;9;375;0 +117;1;9;385;0;RRGRRRDGA0000 +118;1;9;395;0 +119;1;9;405;0 +120;1;9;415;0 +121;1;9;425;0;RRGRRRDGA0000 +122;1;9;435;0 +123;1;9;445;0 +124;1;9;455;0 +125;1;9;465;0 +126;1;9;475;0;RRRRRRDDA0000 +127;1;9;485;0 +128;1;9;495;0 +129;1;9;505;0;SRRRRRDDA0000 +130;1;9;515;0;GRRGRRDDA0000 +131;1;9;525;0;GRRGRRDDA0000 +132;1;9;535;0 +133;1;9;545;0 +134;1;9;555;0 +135;1;9;565;0 +136;1;9;575;0 +137;1;9;585;0 +138;1;9;595;0;GRRGRSDDA0000 +139;1;9;605;0;GRRGGGDDA0000 +140;1;9;615;0 +141;1;9;625;0;GRRGGGDDA0000 +142;1;9;635;0 +143;1;9;645;0 +144;1;9;655;0 +145;1;9;665;0 +146;1;9;675;0 +147;1;9;685;0 +148;1;9;695;0 +149;1;9;5;0 +150;1;9;15;0 +151;1;9;25;0;GRRGGGDDA0000 +152;1;9;35;0 +153;1;9;45;0 +154;1;9;55;0 +155;1;9;65;0 +156;1;9;75;0 +157;1;9;85;0 +158;1;9;95;0 +159;1;9;105;0 +160;1;9;115;0 +161;1;9;125;0;GRRGGGDDA0000 +162;1;9;135;0 +163;1;9;145;0 +164;1;9;155;0 +165;1;9;165;0 +166;1;9;175;0 +167;1;9;185;0 +168;1;9;195;0 +169;1;9;205;0 +170;1;9;215;0;GRRAGGDDA0000 +171;1;9;225;0;ARRAGGDDA0000 +172;1;9;235;0 +173;1;9;245;0 +174;1;9;255;0;RRRRGGDDA0000 +175;1;9;265;0 +176;1;9;275;0;RGRRGGGDA0000 +177;1;9;285;0 +178;1;9;295;0;RGRRAGGDA0000 +179;1;9;305;0;RGRRAAGDA0000 +180;1;9;315;0 +181;1;9;325;0;RGRRAAGDA0000 +182;1;9;335;0;RGRRRRGDA0000 +183;1;9;345;0 +184;1;9;355;0;RGGRRRGGA0000 +185;1;9;365;0 +186;1;9;375;0 +187;1;9;385;0 +188;1;9;395;0;RRGRRRDGA0000 +189;1;9;405;0 +190;1;9;415;0 +191;1;9;425;0;RRGRRRDGA0000 +192;1;9;435;0 +193;1;9;445;0 +194;1;9;455;0 +195;1;9;465;0 +196;1;9;475;0;RRRRRRDDA0000 +197;1;9;485;0 +198;1;9;495;0 +199;1;9;505;0 +200;1;9;515;0;SRRRRRDDA0000 +201;1;9;525;0;GRRGRRDDA0000 +202;1;9;535;0 +203;1;9;545;0 +204;1;9;555;0 +205;1;9;565;0 +206;1;9;575;0 +207;1;9;585;0 +208;1;9;595;0;GRRGRSDDA0000 +209;1;9;605;0;GRRGGGDDA0000 +210;1;9;615;0 +211;1;9;625;0;GRRGGGDDA0000 +212;1;9;635;0 +213;1;9;645;0 +214;1;9;655;0 +215;1;9;665;0 +216;1;9;675;0 +217;1;9;685;0 +218;1;9;695;0 +219;1;9;5;0 +220;1;9;15;0 +221;1;9;25;0;GRRGGGDDA0000 +222;1;9;35;0 +223;1;9;45;0 +224;1;9;55;0 +225;1;9;65;0 +226;1;9;75;0 +227;1;9;85;0 +228;1;9;95;0 +229;1;9;105;0 +230;1;9;115;0 +231;1;9;125;0;GRRGGGDDA0000 +232;1;9;135;0 +233;1;9;145;0 +234;1;9;155;0 +235;1;9;165;0 +236;1;9;175;0 +237;1;9;185;0 +238;1;9;195;0 +239;1;9;205;0;GRRAGGDDA0000 +240;1;9;215;0;ARRAGGDDA0000 +241;1;9;225;0;ARRAGGDDA0000 +242;1;9;235;0 +243;1;9;245;0;RRRRGGDDA0000 +244;1;9;255;0 +245;1;9;265;0;RGRRGGGDA0000 +246;1;9;275;0 +247;1;9;285;0 +248;1;9;295;0;RGRRAGGDA0000 +249;1;9;305;0;RGRRAAGDA0000 +250;1;9;315;0 +251;1;9;325;0;RGRRAAGDA0000 +252;1;9;335;0;RGRRRRGDA0000 +253;1;9;345;0 +254;1;9;355;0;RGGRRRGGA0000 +255;1;9;365;0 +256;1;9;375;0 +257;1;9;385;0;RRGRRRDGA0000 +258;1;9;395;0 +259;1;9;405;0 +260;1;9;415;0 +261;1;9;425;0;RRGRRRDGA0000 +262;1;9;435;0 +263;1;9;445;0 +264;1;9;455;0 +265;1;9;465;0 +266;1;9;475;0;RRRRRRDDA0000 +267;1;9;485;0 +268;1;9;495;0 +269;1;9;505;0;SRRRRRDDA0000 +270;1;9;515;0;GRRGRRDDA0000 +271;1;9;525;0;GRRGRRDDA0000 +272;1;9;535;0 +273;1;9;545;0 +274;1;9;555;0 +275;1;9;565;0 +276;1;9;575;0 +277;1;9;585;0 +278;1;9;595;0;GRRGRSDDA0000 +279;1;9;605;0;GRRGGGDDA0000 +280;1;9;615;0 +281;1;9;625;0;GRRGGGDDA0000 +282;1;9;635;0 +283;1;9;645;0 +284;1;9;655;0 +285;1;9;665;0 +286;1;9;675;0 +287;1;9;685;0 +288;1;9;695;0 +289;1;9;5;0 +290;1;9;15;0 +291;1;9;25;0;GRRGGGDDA0000 +292;1;9;35;0 +293;1;9;45;0 +294;1;9;55;0 +295;1;9;65;0 +296;1;9;75;0 +297;1;9;85;0 +298;1;9;95;0 +299;1;9;105;0 +300;1;9;115;0 +301;1;9;125;0;GRRGGGDDA0000 +302;1;9;135;0 +303;1;9;145;0 +304;1;9;155;0 +305;1;9;165;0 +306;1;9;175;0 +307;1;9;185;0 +308;1;9;195;0 +309;1;9;205;0;GRRAGGDDA0000 +310;1;9;215;0;ARRAGGDDA0000 +311;1;9;225;0;ARRAGGDDA0000 +312;1;9;235;0 +313;1;9;245;0;RRRRGGDDA0000 +314;1;9;255;0 +315;1;9;265;0;RGRRGGGDA0000 +316;1;9;275;0 +317;1;9;285;0 +318;1;9;295;0;RGRRAGGDA0000 +319;1;9;305;0;RGRRAAGDA0000 +320;1;9;315;0 +321;1;9;325;0;RGRRAAGDA0000 +322;1;9;335;0;RGRRRRGDA0000 +323;1;9;345;0 +324;1;9;355;0;RGGRRRGGA0000 +325;1;9;365;0 +326;1;9;375;0 +327;1;9;385;0;RRGRRRDGA0000 +328;1;9;395;0 +329;1;9;405;0 +330;1;9;415;0 +331;1;9;425;0;RRGRRRDGA0000 +332;1;9;435;0 +333;1;9;445;0 +334;1;9;455;0 +335;1;9;465;0 +336;1;9;475;0;RRRRRRDDA0000 +337;1;9;485;0 +338;1;9;495;0 +339;1;9;505;0;SRRRRRDDA0000 +340;1;9;515;0;GRRGRRDDA0000 +341;1;9;525;0;GRRGRRDDA0000 +342;1;9;535;0 +343;1;9;545;0 +344;1;9;555;0 +345;1;9;565;0 +346;1;9;575;0 +347;1;9;585;0 +348;1;9;595;0;GRRGRSDDA0000 +349;1;9;605;0;GRRGGGDDA0000 +350;1;9;615;0 +351;1;9;625;0;GRRGGGDDA0000 +352;1;9;635;0 +353;1;9;645;0 +354;1;9;655;0 +355;1;9;665;0 +356;1;9;675;0 +357;1;9;685;0 +358;1;9;695;0 +359;1;9;5;0 +360;1;9;15;0 +361;1;9;25;0;GRRGGGDDA0000 +362;1;9;35;0 +363;1;9;45;0 +364;1;9;55;0 +365;1;9;65;0 +366;1;9;75;0 +367;1;9;85;0 +368;1;9;95;0 +369;1;9;105;0 +370;1;9;115;0 +371;1;9;125;0;GRRGGGDDA0000 +372;1;9;135;0 +373;1;9;145;0 +374;1;9;155;0 +375;1;9;165;0 +376;1;9;175;0 +377;1;9;185;0 +378;1;9;195;0 +379;1;9;205;0 +380;1;9;215;0;GRRAGGDDA0000 +381;1;9;225;0;ARRAGGDDA0000 +382;1;9;235;0 +383;1;9;245;0 +384;1;9;255;0;RRRRGGDDA0000 +385;1;9;265;0 +386;1;9;275;0;RGRRGGGDA0000 +387;1;9;285;0 +388;1;9;295;0;RGRRAGGDA0000 +389;1;9;305;0;RGRRAAGDA0000 +390;1;9;315;0 +391;1;9;325;0;RGRRAAGDA0000 +392;1;9;335;0;RGRRRRGDA0000 +393;1;9;345;0 +394;1;9;355;0;RGGRRRGGA0000 +395;1;9;365;0 +396;1;9;375;0 +397;1;9;385;0 +398;1;9;395;0;RRGRRRDGA0000 +399;1;9;405;0 +400;1;9;415;0 +401;1;9;425;0;RRGRRRDGA0000 +402;1;9;435;0 +403;1;9;445;0 +404;1;9;455;0 +405;1;9;465;0 +406;1;9;475;0;RRRRRRDDA0000 +407;1;9;485;0 +408;1;9;495;0 +409;1;9;505;0 +410;1;9;515;0;SRRRRRDDA0000 +411;1;9;525;0;GRRGRRDDA0000 +412;1;9;535;0 +413;1;9;545;0 +414;1;9;555;0 +415;1;9;565;0 +416;1;9;575;0 +417;1;9;585;0 +418;1;9;595;0;GRRGRSDDA0000 +419;1;9;605;0;GRRGGGDDA0000 +420;1;9;615;0 +421;1;9;625;0;GRRGGGDDA0000 +422;1;9;635;0 +423;1;9;645;0 +424;1;9;655;0 +425;1;9;665;0 +426;1;9;675;0 +427;1;9;685;0 +428;1;9;695;0 +429;1;9;5;0 +430;1;9;15;0 +431;1;9;25;0;GRRGGGDDA0000 +432;1;9;35;0 +433;1;9;45;0 +434;1;9;55;0 +435;1;9;65;0 +436;1;9;75;0 +437;1;9;85;0 +438;1;9;95;0 +439;1;9;105;0 +440;1;9;115;0 +441;1;9;125;0;GRRGGGDDA0000 +442;1;9;135;0 +443;1;9;145;0 +444;1;9;155;0 +445;1;9;165;0 +446;1;9;175;0 +447;1;9;185;0 +448;1;9;195;0 +449;1;9;205;0 +450;1;9;215;0;GRRAGGDDA0000 +451;1;9;225;0;ARRAGGDDA0000 +452;1;9;235;0 +453;1;9;245;0 +454;1;9;255;0;RRRRGGDDA0000 +455;1;9;265;0 +456;1;9;275;0;RGRRGGGDA0000 +457;1;9;285;0 +458;1;9;295;0;RGRRAGGDA0000 +459;1;9;305;0;RGRRAAGDA0000 +460;1;9;315;0 +461;1;9;325;0;RGRRAAGDA0000 +462;1;9;335;0;RGRRRRGDA0000 +463;1;9;345;0 +464;1;9;355;0;RGGRRRGGA0000 +465;1;9;365;0 +466;1;9;375;0 +467;1;9;385;0 +468;1;9;395;0;RRGRRRDGA0000 +469;1;9;405;0 +470;1;9;415;0 +471;1;9;425;0;RRGRRRDGA0000 +472;1;9;435;0 +473;1;9;445;0 +474;1;9;455;0 +475;1;9;465;0 +476;1;9;475;0;RRRRRRDDA0000 +477;1;9;485;0 +478;1;9;495;0 +479;1;9;505;0 +480;1;9;515;0;SRRRRRDDA0000 +481;1;9;525;0;GRRGRRDDA0000 +482;1;9;535;0 +483;1;9;545;0 +484;1;9;555;0 +485;1;9;565;0 +486;1;9;575;0 +487;1;9;585;0 +488;1;9;595;0;GRRGRSDDA0000 +489;1;9;605;0;GRRGGGDDA0000 +490;1;9;615;0 +491;1;9;625;0;GRRGGGDDA0000 +492;1;9;635;0 +493;1;9;645;0 +494;1;9;655;0 +495;1;9;665;0 +496;1;9;675;0 +497;1;9;685;0 +498;1;9;695;0 +499;1;9;5;0 +500;1;9;15;0 +501;1;9;25;0;GRRGGGDDA0000 +502;1;9;35;0 +503;1;9;45;0 +504;1;9;50;0 +505;1;9;60;0 +506;1;9;70;0 +507;1;9;80;0 +508;1;9;90;0 +509;1;9;100;0 +510;1;9;110;0 +511;1;9;120;0;GRRGGGDDA0000 +512;1;9;130;0 +513;1;9;140;0 +514;1;9;150;0 +515;1;9;160;0 +516;1;9;170;0 +517;1;9;180;0 +518;1;9;190;0 +519;1;9;200;0 +520;1;9;210;0 +521;1;9;220;0;GRRAGGDDA0000 +522;1;9;230;0;ARRAGGDDA0000 +523;1;9;240;0 +524;1;9;250;0 +525;1;9;260;0;RRRRGGDDA0000 +526;1;9;270;0 +527;1;9;280;0;RGRRGGGDA0000 +528;1;9;290;0 +529;1;9;300;0;RGRRAGGDA0000 +530;1;9;310;0;RGRRAAGDA0000 +531;1;9;320;0;RGRRAAGDA0000 +532;1;9;330;0 +533;1;9;340;0;RGRRRRGDA0000 +534;1;9;350;0 +535;1;9;360;0;RGGRRRGGA0000 +536;1;9;370;0 +537;1;9;380;0 +538;1;9;390;0 +539;1;9;400;0;RRGRRRDGA0000 +540;1;9;410;0 +541;1;9;420;0;RRGRRRDGA0000 +542;1;9;430;0 +543;1;9;440;0 +544;1;9;450;0 +545;1;9;460;0 +546;1;9;470;0 +547;1;9;480;0;RRRRRRDDA0000 +548;1;9;490;0 +549;1;9;500;0 +550;1;9;510;0 +551;1;9;520;0;SRRRRRDDA0000 +552;1;9;530;0;GRRGRRDDA0000 +553;1;9;540;0 +554;1;9;550;0 +555;1;9;560;0 +556;1;9;570;0 +557;1;9;580;0 +558;1;9;590;0 +559;1;9;600;0;GRRGRSDDA0000 +560;1;9;610;0;GRRGGGDDA0000 +561;1;9;620;0;GRRGGGDDA0000 +562;1;9;630;0 +563;1;9;640;0 +564;1;9;650;0 +565;1;9;660;0 +566;1;9;670;0 +567;1;9;680;0 +568;1;9;690;0 +569;1;9;0;0 +570;1;9;10;0 +571;1;9;20;0;GRRGGGDDA0000 +572;1;9;30;0 +573;1;9;40;0 +574;1;9;50;0 +575;1;9;60;0 +576;1;9;70;0 +577;1;9;80;0 +578;1;9;90;0 +579;1;9;100;0 +580;1;9;110;0 +581;1;9;120;0;GRRGGGDDA0000 +582;1;9;130;0 +583;1;9;140;0 +584;1;9;150;0 +585;1;9;160;0 +586;1;9;170;0 +587;1;9;180;0 +588;1;9;190;0 +589;1;9;200;0 +590;1;9;210;0 +591;1;9;220;0;GRRAGGDDA0000 +592;1;9;230;0;ARRAGGDDA0000 +593;1;9;240;0 +594;1;9;250;0 +595;1;9;260;0;RRRRGGDDA0000 +596;1;9;270;0 +597;1;9;280;0;RGRRGGGDA0000 +598;1;9;290;0 +599;1;9;300;0;RGRRAGGDA0000 +600;1;9;310;0;RGRRAAGDA0000 +601;1;9;320;0;RGRRAAGDA0000 +602;1;9;330;0 +603;1;9;340;0;RGRRRRGDA0000 +604;1;9;350;0 +605;1;9;360;0;RGGRRRGGA0000 +606;1;9;370;0 +607;1;9;380;0 +608;1;9;390;0 +609;1;9;400;0;RRGRRRDGA0000 +610;1;9;410;0 +611;1;9;420;0;RRGRRRDGA0000 +612;1;9;430;0 +613;1;9;440;0 +614;1;9;450;0 +615;1;9;460;0 +616;1;9;470;0 +617;1;9;480;0;RRRRRRDDA0000 +618;1;9;490;0 +619;1;9;500;0 +620;1;9;510;0 +621;1;9;520;0;SRRRRRDDA0000 +622;1;9;530;0;GRRGRRDDA0000 +623;1;9;540;0 +624;1;9;550;0 +625;1;9;560;0 +626;1;9;570;0 +627;1;9;580;0 +628;1;9;590;0 +629;1;9;600;0;GRRGRSDDA0000 +630;1;9;610;0;GRRGGGDDA0000 +631;1;9;620;0;GRRGGGDDA0000 +632;1;9;630;0 +633;1;9;640;0 +634;1;9;650;0 +635;1;9;660;0 +636;1;9;670;0 +637;1;9;680;0 +638;1;9;690;0 +639;1;9;0;0 +640;1;9;10;0 +641;1;9;20;0;GRRGGGDDA0000 +642;1;9;30;0 +643;1;9;40;0 +644;1;9;50;0 +645;1;9;60;0 +646;1;9;70;0 +647;1;9;80;0 +648;1;9;90;0 +649;1;9;100;0 +650;1;9;110;0 +651;1;9;120;0;GRRGGGDDA0000 +652;1;9;130;0 +653;1;9;140;0 +654;1;9;150;0 +655;1;9;160;0 +656;1;9;170;0 +657;1;9;180;0 +658;1;9;190;0 +659;1;9;200;0 +660;1;9;210;0 +661;1;9;220;0;GRRAGGDDA0000 +662;1;9;230;0;ARRAGGDDA0000 +663;1;9;240;0 +664;1;9;250;0 +665;1;9;260;0;RRRRGGDDA0000 +666;1;9;270;0 +667;1;9;280;0;RGRRGGGDA0000 +668;1;9;290;0 +669;1;9;300;0;RGRRAGGDA0000 +670;1;9;310;0;RGRRAAGDA0000 +671;1;9;320;0;RGRRAAGDA0000 +672;1;9;330;0 +673;1;9;340;0;RGRRRRGDA0000 +674;1;9;350;0 +675;1;9;360;0;RGGRRRGGA0000 +676;1;9;370;0 +677;1;9;380;0 +678;1;9;390;0 +679;1;9;400;0;RRGRRRDGA0000 +680;1;9;410;0 +681;1;9;420;0;RRGRRRDGA0000 +682;1;9;430;0 +683;1;9;440;0 +684;1;9;450;0 +685;1;9;460;0 +686;1;9;470;0 +687;1;9;480;0;RRRRRRDDA0000 +688;1;9;490;0 +689;1;9;500;0 +690;1;9;510;0 +691;1;9;520;0;SRRRRRDDA0000 +692;1;9;530;0;GRRGRRDDA0000 +693;1;9;540;0 +694;1;9;550;0 +695;1;9;560;0 +696;1;9;570;0 +697;1;9;580;0 +698;1;9;590;0 +699;1;9;600;0;GRRGRSDDA0000 +700;1;9;610;0;GRRGGGDDA0000 +701;1;9;620;0;GRRGGGDDA0000 +702;1;9;630;0 +703;1;9;640;0 +704;1;9;650;0 +705;1;9;660;0 +706;1;9;670;0 +707;1;9;680;0 +708;1;9;690;0 +709;1;9;0;0 +710;1;9;10;0 +711;1;9;20;0;GRRGGGDDA0000 +712;1;9;30;0 +713;1;9;40;0 +714;1;9;50;0 +715;1;9;60;0 +716;1;9;70;0 +717;1;9;80;0 +718;1;9;90;0 +719;1;9;100;0 +720;1;9;110;0 +721;1;9;120;0;GRRGGGDDA0000 +722;1;9;130;0 +723;1;9;140;0 +724;1;9;150;0 +725;1;9;160;0 +726;1;9;170;0 +727;1;9;180;0 +728;1;9;190;0 +729;1;9;200;0 +730;1;9;210;0 +731;1;9;220;0;GRRAGGDDA0000 +732;1;9;230;0;ARRAGGDDA0000 +733;1;9;240;0 +734;1;9;250;0 +735;1;9;260;0;RRRRGGDDA0000 +736;1;9;270;0 +737;1;9;280;0;RGRRGGGDA0000 +738;1;9;290;0 +739;1;9;300;0;RGRRAGGDA0000 +740;1;9;310;0;RGRRAAGDA0000 +741;1;9;320;0;RGRRAAGDA0000 +742;1;9;330;0 +743;1;9;340;0;RGRRRRGDA0000 +744;1;9;350;0 +745;1;9;360;0;RGGRRRGGA0000 +746;1;9;370;0 +747;1;9;380;0 +748;1;9;390;0 +749;1;9;400;0;RRGRRRDGA0000 +750;1;9;410;0 +751;1;9;420;0;RRGRRRDGA0000 +752;1;9;430;0 +753;1;9;440;0 +754;1;9;450;0 +755;1;9;460;0 +756;1;9;470;0 +757;1;9;480;0;RRRRRRDDA0000 +758;1;9;490;0 +759;1;9;500;0 +760;1;9;510;0 +761;1;9;520;0;SRRRRRDDA0000 +762;1;9;530;0;GRRGRRDDA0000 +763;1;9;540;0 +764;1;9;550;0 +765;1;9;560;0 +766;1;9;570;0 +767;1;9;580;0 +768;1;9;590;0 +769;1;9;600;0;GRRGRSDDA0000 +770;1;9;610;0;GRRGGGDDA0000 +771;1;9;620;0;GRRGGGDDA0000 +772;1;9;630;0 +773;1;9;640;0 +774;1;9;650;0 +775;1;9;660;0 +776;1;9;670;0 +777;1;9;680;0 +778;1;9;690;0 +779;1;9;0;0 +780;1;9;10;0 +781;1;9;20;0;GRRGGGDDA0000 +782;1;9;30;0 +783;1;9;40;0 +784;1;9;55;0 +785;1;9;65;0 +786;1;9;75;0 +787;1;9;85;0 +788;1;9;95;0 +789;1;9;105;0 +790;1;9;115;0 +791;1;9;125;0;GRRGGGDDA0000 +792;1;9;135;0 +793;1;9;145;0 +794;1;9;155;0 +795;1;9;165;0 +796;1;9;175;0 +797;1;9;185;0 +798;1;9;195;0 +799;1;9;205;0 +800;1;9;215;0;GRRAGGDDA0000 +801;1;9;225;0;ARRAGGDDA0000 +802;1;9;235;0 +803;1;9;245;0 +804;1;9;255;0;RRRRGGDDA0000 +805;1;9;265;0 +806;1;9;275;0;RGRRGGGDA0000 +807;1;9;285;0 +808;1;9;295;0;RGRRAGGDA0000 +809;1;9;305;0;RGRRAAGDA0000 +810;1;9;315;0 +811;1;9;325;0;RGRRAAGDA0000 +812;1;9;335;0;RGRRRRGDA0000 +813;1;9;345;0 +814;1;9;355;0;RGGRRRGGA0000 +815;1;9;365;0 +816;1;9;375;0 +817;1;9;385;0 +818;1;9;395;0;RRGRRRDGA0000 +819;1;9;405;0 +820;1;9;415;0 +821;1;9;425;0;RRGRRRDGA0000 +822;1;9;435;0 +823;1;9;445;0 +824;1;9;455;0 +825;1;9;465;0 +826;1;9;475;0;RRRRRRDDA0000 +827;1;9;485;0 +828;1;9;495;0 +829;1;9;505;0 +830;1;9;515;0;SRRRRRDDA0000 +831;1;9;525;0;GRRGRRDDA0000 +832;1;9;535;0 +833;1;9;545;0 +834;1;9;555;0 +835;1;9;565;0 +836;1;9;575;0 +837;1;9;585;0 +838;1;9;595;0;GRRGRSDDA0000 +839;1;9;605;0;GRRGGGDDA0000 +840;1;9;615;0 +841;1;9;625;0;GRRGGGDDA0000 +842;1;9;635;0 +843;1;9;645;0 +844;1;9;655;0 +845;1;9;665;0 +846;1;9;675;0 +847;1;9;685;0 +848;1;9;695;0 +849;1;9;5;0 +850;1;9;15;0 +851;1;9;25;0;GRRGGGDDA0000 +852;1;9;35;0 +853;1;9;45;0 +854;1;9;50;0 +855;1;9;55;0 +856;1;9;65;0 +857;1;9;75;0 +858;1;9;85;0 +859;1;9;95;0 +860;1;9;105;0 +861;1;9;115;0;GRRGGGDDA0000 +862;1;9;125;0 +863;1;9;135;0 +864;1;9;145;0 +865;1;9;155;0 +866;1;9;165;0 +867;1;9;175;0 +868;1;9;185;0 +869;1;9;195;0 +870;1;9;205;0 +871;1;9;215;0;GRRAGGDDA0000 +872;1;9;225;0;ARRAGGDDA0000 +873;1;9;235;0 +874;1;9;245;0 +875;1;9;255;0;RRRRGGDDA0000 +876;1;9;265;0 +877;1;9;275;0;RGRRGGGDA0000 +878;1;9;285;0 +879;1;9;295;0;RGRRAGGDA0000 +880;1;9;305;0;RGRRAAGDA0000 +881;1;9;315;0;RGRRAAGDA0000 +882;1;9;325;0 +883;1;9;335;0;RGRRRRGDA0000 +884;1;9;345;0 +885;1;9;355;0;RGGRRRGGA0000 +886;1;9;365;0 +887;1;9;375;0 +888;1;9;385;0 +889;1;9;395;0;RRGRRRDGA0000 +890;1;9;405;0 +891;1;9;415;0;RRGRRRDGA0000 +892;1;9;425;0 +893;1;9;435;0 +894;1;9;445;0 +895;1;9;455;0 +896;1;9;465;0 +897;1;9;475;0;RRRRRRDDA0000 +898;1;9;485;0 +899;1;9;495;0 +900;1;9;505;0 +901;1;9;515;0;SRRRRRDDA0000 +902;1;9;525;0;GRRGRRDDA0000 +903;1;9;535;0 +904;1;9;545;0 +905;1;9;555;0 +906;1;9;565;0 +907;1;9;575;0 +908;1;9;585;0 +909;1;9;595;0;GRRGRSDDA0000 +910;1;9;605;0;GRRGGGDDA0000 +911;1;9;615;0;GRRGGGDDA0000 +912;1;9;625;0 +913;1;9;635;0 +914;1;9;645;0 +915;1;9;655;0 +916;1;9;665;0 +917;1;9;675;0 +918;1;9;685;0 +919;1;9;695;0 +920;1;9;5;0 +921;1;9;15;0;GRRGGGDDA0000 +922;1;9;25;0 +923;1;9;35;0 +924;1;9;45;0 +925;1;9;55;0 +926;1;9;65;0 +927;1;9;75;0 +928;1;9;85;0 +929;1;9;95;0 +930;1;9;105;0 +931;1;9;115;0;GRRGGGDDA0000 +932;1;9;125;0 +933;1;9;135;0 +934;1;9;145;0 +935;1;9;155;0 +936;1;9;165;0 +937;1;9;175;0 +938;1;9;185;0 +939;1;9;195;0;GRRAGGDDA0000 +940;1;9;205;0;ARRAGGDDA0000 +941;1;9;215;0;ARRAGGDDA0000 +942;1;9;225;0 +943;1;9;235;0;RRRRGGDDA0000 +944;1;9;245;0 +945;1;9;255;0;RGRRGGGDA0000 +946;1;9;265;0 +947;1;9;275;0 +948;1;9;285;0;RGRRAGGDA0000 +949;1;9;295;0;RGRRAAGDA0000 +950;1;9;305;0 +951;1;9;315;0;RGRRAAGDA0000 +952;1;9;325;0;RGRRRRGDA0000 +953;1;9;335;0 +954;1;9;345;0;RGGRRRGGA0000 +955;1;9;355;0 +956;1;9;365;0 +957;1;9;375;0;RRGRRRDGA0000 +958;1;9;385;0 +959;1;9;395;0 +960;1;9;405;0 +961;1;9;415;0;RRGRRRDGA0000 +962;1;9;425;0 +963;1;9;435;0 +964;1;9;445;0 +965;1;9;455;0 +966;1;9;465;0;RRRRRRDDA0000 +967;1;9;475;0 +968;1;9;485;0 +969;1;9;495;0;SRRRRRDDA0000 +970;1;9;505;0;GRRGRRDDA0000 +971;1;9;515;0;GRRGRRDDA0000 +972;1;9;525;0 +973;1;9;535;0 +974;1;9;545;0 +975;1;9;555;0 +976;1;9;565;0 +977;1;9;575;0 +978;1;9;585;0;GRRGRSDDA0000 +979;1;9;595;0;GRRGGGDDA0000 +980;1;9;605;0 +981;1;9;615;0;GRRGGGDDA0000 +982;1;9;625;0 +983;1;9;635;0 +984;1;9;645;0 +985;1;9;655;0 +986;1;9;665;0 +987;1;9;675;0 +988;1;9;685;0 +989;1;9;695;0 +990;1;9;5;0 +991;1;9;15;0;GRRGGGDDA0000 +992;1;9;25;0 +993;1;9;35;0 +994;1;9;45;0 +995;1;9;55;0 +996;1;9;65;0 +997;1;9;75;0 +998;1;9;85;0 +999;1;9;95;0 +1000;1;9;105;0 +1001;1;9;115;0;GRRGGGDDA0000 +1002;1;9;125;0 +1003;1;9;135;0 +1004;1;9;145;0 +1005;1;9;155;0 +1006;1;9;165;0 +1007;1;9;175;0 +1008;1;9;185;0 +1009;1;9;195;0 +1010;1;9;205;0 +1011;1;9;215;0;GRRAGGDDA0000 +1012;1;9;225;0;ARRAGGDDA0000 +1013;1;9;235;0 +1014;1;9;245;0 +1015;1;9;255;0;RRRRGGDDA0000 +1016;1;9;265;0 +1017;1;9;275;0;RGRRGGGDA0000 +1018;1;9;285;0 +1019;1;9;295;0;RGRRAGGDA0000 +1020;1;9;305;0;RGRRAAGDA0000 +1021;1;9;315;0;RGRRAAGDA0000 +1022;1;9;325;0 +1023;1;9;335;0;RGRRRRGDA0000 +1024;1;9;345;0 +1025;1;9;355;0;RGGRRRGGA0000 +1026;1;9;365;0 +1027;1;9;375;0 +1028;1;9;385;0 +1029;1;9;395;0;RRGRRRDGA0000 +1030;1;9;405;0 +1031;1;9;415;0;RRGRRRDGA0000 +1032;1;9;425;0 +1033;1;9;435;0 +1034;1;9;445;0 +1035;1;9;455;0 +1036;1;9;465;0 +1037;1;9;475;0;RRRRRRDDA0000 +1038;1;9;485;0 +1039;1;9;495;0 +1040;1;9;505;0 +1041;1;9;515;0;SRRRRRDDA0000 +1042;1;9;525;0;GRRGRRDDA0000 +1043;1;9;535;0 +1044;1;9;545;0 +1045;1;9;555;0;GRRGRRDDA0000 +1046;1;9;565;0 +1047;1;9;575;0 +1048;1;9;585;0 +1049;1;9;595;0;GRRGRSDDA0000 +1050;1;9;605;0;GRRGGGDDA0000 +1051;1;9;615;0;GRRGGGDDA0000 +1052;1;9;625;0 +1053;1;9;635;0 +1054;1;9;645;0 +1055;1;9;655;0 +1056;1;9;665;0 +1057;1;9;675;0 +1058;1;9;685;0 +1059;1;9;695;0 +1060;1;9;5;0 +1061;1;9;15;0;GRRGGGDDA0000 +1062;1;9;25;0 +1063;1;9;35;0 +1064;1;9;45;0 +1065;1;9;55;0 +1066;1;9;65;0 +1067;1;9;75;0;GRRGGGDDA0000 +1068;1;9;85;0 +1069;1;9;95;0 +1070;1;9;105;0 +1071;1;9;115;0;GRRGGGDDA0000 +1072;1;9;125;0 +1073;1;9;135;0 +1074;1;9;145;0 +1075;1;9;155;0 +1076;1;9;165;0 +1077;1;9;175;0 +1078;1;9;185;0 +1079;1;9;195;0 +1080;1;9;205;0 +1081;1;9;215;0;GRRAGGDDA0000 +1082;1;9;225;0;ARRAGGDDA0000 +1083;1;9;235;0 +1084;1;9;245;0 +1085;1;9;255;0;RRRRGGDDA0000 +1086;1;9;265;0 +1087;1;9;275;0;RGRRGGGDA0000 +1088;1;9;285;0 +1089;1;9;295;0;RGRRAGGDA0000 +1090;1;9;305;0;RGRRAAGDA0000 +1091;1;9;315;0;RGRRAAGDA0000 +1092;1;9;325;0 +1093;1;9;335;0;RGRRRRGDA0000 +1094;1;9;345;0 +1095;1;9;355;0;RGGRRRGGA0000 +1096;1;9;365;0 +1097;1;9;375;0 +1098;1;9;385;0 +1099;1;9;395;0;RRGRRRDGA0000 +1100;1;9;405;0 +1101;1;9;415;0;RRGRRRDGA0000 +1102;1;9;425;0 +1103;1;9;435;0 +1104;1;9;445;0 +1105;1;9;455;0 +1106;1;9;465;0 +1107;1;9;475;0;RRRRRRDDA0000 +1108;1;9;485;0 +1109;1;9;495;0 +1110;1;9;505;0 +1111;1;9;515;0;SRRRRRDDA0000 +1112;1;9;525;0;GRRGRRDDA0000 +1113;1;9;535;0 +1114;1;9;545;0 +1115;1;9;555;0 +1116;1;9;565;0 +1117;1;9;575;0 +1118;1;9;585;0 +1119;1;9;595;0;GRRGRSDDA0000 +1120;1;9;605;0;GRRGGGDDA0000 +1121;1;9;615;0;GRRGGGDDA0000 +1122;1;9;625;0 +1123;1;9;635;0 +1124;1;9;645;0 +1125;1;9;655;0 +1126;1;9;665;0 +1127;1;9;675;0 +1128;1;9;685;0 +1129;1;9;695;0 +1130;1;9;5;0 +1131;1;9;15;0;GRRGGGDDA0000 +1132;1;9;25;0 +1133;1;9;35;0 +1134;1;9;45;0 +1135;1;9;55;0 +1136;1;9;65;0 +1137;1;9;75;0 +1138;1;9;85;0 +1139;1;9;95;0 +1140;1;9;105;0 +1141;1;9;115;0;GRRGGGDDA0000 +1142;1;9;125;0 +1143;1;9;135;0 +1144;1;9;145;0 +1145;1;9;155;0 +1146;1;9;165;0 +1147;1;9;175;0 +1148;1;9;185;0 +1149;1;9;195;0 +1150;1;9;205;0 +1151;1;9;215;0;GRRAGGDDA0000 +1152;1;9;225;0;ARRAGGDDA0000 +1153;1;9;235;0 +1154;1;9;245;0 +1155;1;9;255;0;RRRRGGDDA0000 +1156;1;9;265;0 +1157;1;9;275;0;RGRRGGGDA0000 +1158;1;9;285;0 +1159;1;9;295;0;RGRRAGGDA0000 +1160;1;9;305;0;RGRRAAGDA0000 +1161;1;9;315;0;RGRRAAGDA0000 +1162;1;9;325;0 +1163;1;9;335;0;RGRRRRGDA0000 +1164;1;9;345;0 +1165;1;9;355;0;RGGRRRGGA0000 +1166;1;9;365;0 +1167;1;9;375;0 +1168;1;9;385;0 +1169;1;9;395;0;RRGRRRDGA0000 +1170;1;9;405;0 +1171;1;9;415;0;RRGRRRDGA0000 +1172;1;9;425;0 +1173;1;9;435;0 +1174;1;9;445;0 +1175;1;9;455;0 +1176;1;9;465;0 +1177;1;9;475;0;RRRRRRDDA0000 +1178;1;9;485;0 +1179;1;9;495;0 +1180;1;9;505;0 +1181;1;9;515;0;SRRRRRDDA0000 +1182;1;9;525;0;GRRGRRDDA0000 +1183;1;9;535;0 +1184;1;9;545;0 +1185;1;9;555;0 +1186;1;9;565;0 +1187;1;9;575;0 +1188;1;9;585;0 +1189;1;9;595;0;GRRGRSDDA0000 +1190;1;9;605;0;GRRGGGDDA0000 +1191;1;9;615;0;GRRGGGDDA0000 +1192;1;9;625;0 +1193;1;9;635;0 +1194;1;9;645;0 +1195;1;9;655;0 +1196;1;9;665;0 +1197;1;9;675;0 +1198;1;9;685;0 +1199;1;9;695;0 +1200;1;9;5;0 +1201;1;9;15;0;GRRGGGDDA0000 +1202;1;9;25;0 +1203;1;9;35;0 +1204;1;9;45;0 +1205;1;9;55;0 +1206;1;9;65;0 +1207;1;9;75;0 +1208;1;9;85;0 +1209;1;9;95;0 +1210;1;9;105;0 +1211;1;9;115;0;GRRGGGDDA0000 +1212;1;9;125;0 +1213;1;9;135;0 +1214;1;9;145;0 +1215;1;9;155;0 +1216;1;9;165;0 +1217;1;9;175;0 +1218;1;9;185;0 +1219;1;9;195;0;GRRAGGDDA0000 +1220;1;9;205;0;ARRAGGDDA0000 +1221;1;9;215;0;ARRAGGDDA0000 +1222;1;9;225;0 +1223;1;9;235;0;RRRRGGDDA0000 +1224;1;9;245;0 +1225;1;9;255;0;RGRRGGGDA0000 +1226;1;9;265;0 +1227;1;9;275;0 +1228;1;9;285;0;RGRRAGGDA0000 +1229;1;9;295;0;RGRRAAGDA0000 +1230;1;9;305;0 +1231;1;9;315;0;RGRRAAGDA0000 +1232;1;9;325;0;RGRRRRGDA0000 +1233;1;9;335;0 +1234;1;9;345;0;RGGRRRGGA0000 +1235;1;9;355;0 +1236;1;9;365;0 +1237;1;9;375;0;RRGRRRDGA0000 +1238;1;9;385;0 +1239;1;9;395;0 +1240;1;9;405;0 +1241;1;9;415;0;RRGRRRDGA0000 +1242;1;9;425;0 +1243;1;9;435;0 +1244;1;9;445;0 +1245;1;9;455;0 +1246;1;9;465;0;RRRRRRDDA0000 +1247;1;9;475;0 +1248;1;9;485;0 +1249;1;9;495;0;SRRRRRDDA0000 +1250;1;9;505;0;GRRGRRDDA0000 +1251;1;9;515;0;GRRGRRDDA0000 +1252;1;9;525;0 +1253;1;9;535;0 +1254;1;9;545;0 +1255;1;9;555;0 +1256;1;9;565;0 +1257;1;9;575;0 +1258;1;9;585;0;GRRGRSDDA0000 +1259;1;9;595;0;GRRGGGDDA0000 +1260;1;9;605;0 +1261;1;9;615;0;GRRGGGDDA0000 +1262;1;9;625;0 +1263;1;9;635;0 +1264;1;9;645;0 +1265;1;9;655;0 +1266;1;9;665;0 +1267;1;9;675;0 +1268;1;9;685;0 +1269;1;9;695;0 +1270;1;9;5;0 +1271;1;9;15;0;GRRGGGDDA0000 +1272;1;9;25;0 +1273;1;9;35;0 +1274;1;9;45;0 +1275;1;9;55;0 +1276;1;9;65;0 +1277;1;9;75;0 +1278;1;9;85;0 +1279;1;9;95;0 +1280;1;9;105;0 +1281;1;9;115;0;GRRGGGDDA0000 +1282;1;9;125;0 +1283;1;9;135;0 +1284;1;9;145;0 +1285;1;9;155;0 +1286;1;9;165;0 +1287;1;9;175;0 +1288;1;9;185;0 +1289;1;9;195;0;GRRAGGDDA0000 +1290;1;9;205;0;ARRAGGDDA0000 +1291;1;9;215;0;ARRAGGDDA0000 +1292;1;9;225;0 +1293;1;9;235;0;RRRRGGDDA0000 +1294;1;9;245;0 +1295;1;9;255;0;RGRRGGGDA0000 +1296;1;9;265;0 +1297;1;9;275;0 +1298;1;9;285;0;RGRRAGGDA0000 +1299;1;9;295;0;RGRRAAGDA0000 +1300;1;9;305;0 +1301;1;9;315;0;RGRRAAGDA0000 +1302;1;9;325;0;RGRRRRGDA0000 +1303;1;9;335;0 +1304;1;9;345;0;RGGRRRGGA0000 +1305;1;9;355;0 +1306;1;9;365;0 +1307;1;9;375;0;RRGRRRDGA0000 +1308;1;9;385;0 +1309;1;9;395;0 +1310;1;9;405;0 +1311;1;9;415;0;RRGRRRDGA0000 +1312;1;9;425;0 +1313;1;9;435;0 +1314;1;9;445;0 +1315;1;9;455;0 +1316;1;9;465;0;RRRRRRDDA0000 +1317;1;9;475;0 +1318;1;9;485;0 +1319;1;9;495;0;SRRRRRDDA0000 +1320;1;9;505;0;GRRGRRDDA0000 +1321;1;9;515;0;GRRGRRDDA0000 +1322;1;9;525;0 +1323;1;9;535;0 +1324;1;9;545;0 +1325;1;9;555;0 +1326;1;9;565;0 +1327;1;9;575;0 +1328;1;9;585;0;GRRGRSDDA0000 +1329;1;9;595;0;GRRGGGDDA0000 +1330;1;9;605;0 +1331;1;9;615;0;GRRGGGDDA0000 +1332;1;9;625;0 +1333;1;9;635;0 +1334;1;9;645;0 +1335;1;9;655;0 +1336;1;9;665;0 +1337;1;9;675;0 +1339;1;9;685;0 +1339;1;9;695;0 +1340;1;9;5;0 +1341;1;9;15;0;GRRGGGDDA0000 +1342;1;9;25;0 +1343;1;9;35;0 +1344;1;9;45;0 +1345;1;9;55;0 +1346;1;9;65;0 +1347;1;9;75;0 +1348;1;9;85;0 +1350;1;9;95;0 +1350;1;9;105;0 +1351;1;9;115;0;GRRGGGDDA0000 +1352;1;9;125;0 +1353;1;9;135;0 +1354;1;9;145;0 +1355;1;9;155;0 +1356;1;9;165;0 +1357;1;9;175;0 +1358;1;9;185;0 +1359;1;9;195;0 +1361;1;9;205;0;GRRGGGDDA0000 +1361;1;9;215;0;GRRAGGDDA0000 +1362;1;9;225;0;ARRAGGDDA0000 +1363;1;9;235;0 +1364;1;9;245;0 +1365;1;9;255;0;RRRRGGDDA0000 +1366;1;9;265;0 +1367;1;9;275;0;RGRRGGGDA0000 +1368;1;9;285;0 +1369;1;9;295;0;RGRRAGGDA0000 +1370;1;9;305;0;RGRRAAGDA0000 +1371;1;9;315;0;RGRRAAGDA0000 +1372;1;9;325;0 +1373;1;9;335;0;RGRRRRGDA0000 +1374;1;9;345;0 +1375;1;9;355;0;RGGRRRGGA0000 +1376;1;9;365;0 +1377;1;9;375;0 +1378;1;9;385;0 +1379;1;9;395;0;RRGRRRDGA0000 +1380;1;9;405;0 +1381;1;9;415;0;RRGRRRDGA0000 +1382;1;9;425;0 +1383;1;9;435;0 +1384;1;9;445;0 +1385;1;9;455;0 +1386;1;9;465;0 +1387;1;9;475;0;RRRRRRDDA0000 +1388;1;9;485;0 +1389;1;9;495;0 +1390;1;9;505;0 +1391;1;9;515;0;SRRRRRDDA0000 +1392;1;9;525;0;GRRGRRDDA0000 +1393;1;9;535;0 +1394;1;9;545;0 +1395;1;9;555;0 +1396;1;9;565;0 +1397;1;9;575;0 +1398;1;9;585;0 +1399;1;9;595;0;GRRGRSDDA0000 +1400;1;9;605;0;GRRGGGDDA0000 +1401;1;9;615;0;GRRGGGDDA0000 +1402;1;9;625;0 +1403;1;9;635;0 +1404;1;9;645;0 +1405;1;9;655;0 +1406;1;9;665;0 +1407;1;9;675;0 +1408;1;9;685;0 +1409;1;9;695;0 +1410;1;9;5;0 +1411;1;9;15;0;GRRGGGDDA0000 +1412;1;9;25;0 +1413;1;9;35;0 +1414;1;9;45;0 +1415;1;9;55;0 +1416;1;9;65;0 +1417;1;9;75;0 +1418;1;9;85;0 +1419;1;9;95;0 +1421;1;9;105;3;GRRGGGDDA0000 +1422;1;9;105;3 +1423;1;9;105;3 +1424;1;9;105;3;DDDDDDDDD0000 +1425;1;9;105;3 +1426;1;9;105;3 +1427;1;9;105;3 +1428;1;9;105;3 +1429;1;9;105;3 +1430;1;9;105;3 +1430;1;9;105;0;ARRAGGDDA0000 +1431;1;9;215;0;ARRAGGDDA0000 +1432;1;9;225;0 +1433;1;9;235;0;RRRRGGDDA0000 +1434;1;9;245;0 +1435;1;9;255;0;RGRRGGGDA0000 +1436;1;9;265;0 +1437;1;9;275;0 +1438;1;9;285;0;RGRRAGGDA0000 +1439;1;9;295;0;RGRRAAGDA0000 +1440;1;9;305;0 +1441;1;9;315;0;RGRRAAGDA0000 +1442;1;9;325;0;RGRRRRGDA0000 +1443;1;9;335;0 +1444;1;9;345;0;RGGRRRGGA0000 +1445;1;9;355;0 +1446;1;9;365;0 +1447;1;9;375;0;RRGRRRDGA0000 +1448;1;9;385;0 +1449;1;9;395;0 +1450;1;9;405;0 +1451;1;9;415;0;RRGRRRDGA0000 +1452;1;9;425;0 +1453;1;9;435;0 +1454;1;9;445;0 +1455;1;9;455;0 +1456;1;9;465;0;RRRRRRDDA0000 +1457;1;9;475;0 +1458;1;9;485;0 +1459;1;9;495;0;SRRRRRDDA0000 +1460;1;9;505;0;GRRGRRDDA0000 +1461;1;9;515;0;GRRGRRDDA0000 +1462;1;9;525;0 +1463;1;9;535;0 +1464;1;9;545;0 +1465;1;9;555;0 +1466;1;9;565;0 +1467;1;9;575;0 +1468;1;9;585;0;GRRGRSDDA0000 +1469;1;9;595;0;GRRGGGDDA0000 +1470;1;9;605;0 +1471;1;9;615;0;GRRGGGDDA0000 +1472;1;9;625;0 +1473;1;9;635;0 +1474;1;9;645;0 +1475;1;9;655;0 +1476;1;9;665;0 +1477;1;9;675;0 +1478;1;9;685;0 +1479;1;9;695;0 +1480;1;9;5;0 +1481;1;9;15;0;GRRGGGDDA0000 +1482;1;9;25;0 +1485;1;9;35;3 +1486;1;9;35;3 +1487;1;9;35;3;DDDDDDDDD0000 +1488;1;9;35;3 +1489;1;9;35;3 +1490;1;9;35;3 +1491;1;9;35;3;DDDDDDDDD0000 +1492;1;9;35;3 +1493;1;9;35;3 +1494;1;9;35;0;GRRGGGDDA0000 +1494;1;9;145;0 +1497;1;9;155;3 +1498;1;9;155;3 +1499;1;9;155;3;DDDDDDDDD0000 +1500;1;9;155;3 +1501;1;9;155;3;DDDDDDDDD0000 +1502;1;9;155;3 +1503;1;9;155;3 +1504;1;9;155;3 +1505;1;9;155;3 +1505;1;9;155;3;RGRRGGGDA0000 +1508;1;9;265;3 +1509;1;9;265;3 +1510;1;9;265;3;DDDDDDDDD0000 +1511;1;9;265;3;DDDDDDDDD0000 +1512;1;9;265;3 +1513;1;9;265;3 +1514;1;9;265;3 +1515;1;9;265;3 +1516;1;9;265;3 +1516;1;9;265;3;RGGRRRGGA0000 +1517;1;9;375;0;RRGRRRDGA0000 +1518;1;9;385;0 +1519;1;9;395;0 +1520;1;9;405;0 +1521;1;9;415;0;RRGRRRDGA0000 +1522;1;9;425;0 +1523;1;9;435;0 +1524;1;9;445;0 +1526;1;9;455;0 +1527;1;9;465;0;RRRRRRDDA0000 +1527;1;9;475;0 +1528;1;9;485;0 +1529;1;9;495;0;SRRRRRDDA0000 +1530;1;9;505;0;GRRGRRDDA0000 +1531;1;9;515;0;GRRGRRDDA0000 +1532;1;9;525;0 +1533;1;9;535;0 +1534;1;9;545;0 +1535;1;9;555;0 +1537;1;9;565;0 +1538;1;9;575;0 +1538;1;9;585;0;GRRGRSDDA0000 +1539;1;9;595;0;GRRGGGDDA0000 +1540;1;9;605;0 +1543;1;9;615;3 +1544;1;9;615;3 +1545;1;9;615;3;DDDDDDDDD0000 +1546;1;9;615;3 +1547;1;9;615;3 +1548;1;9;615;3 +1549;1;9;615;3 +1550;1;9;615;3 +1551;1;9;615;3;DDDDDDDDD0000 +1551;1;9;615;0;GRRGGGDDA0000 +1552;1;9;25;0 +1553;1;9;35;0 +1554;1;9;45;0 +1555;1;9;55;0 +1556;1;9;65;0 +1557;1;9;75;0 +1558;1;9;85;0 +1560;1;9;95;0 +1560;1;9;105;0 +1561;1;9;115;0;GRRGGGDDA0000 +1562;1;9;125;0 +1563;1;9;135;0 +1564;1;9;145;0 +1565;1;9;155;0 +1566;1;9;165;0 +1567;1;9;175;0 +1568;1;9;185;0 +1569;1;9;195;0;GRRAGGDDA0000 +1571;1;9;205;0;ARRAGGDDA0000 +1572;1;9;215;0 +1572;1;9;225;0 +1573;1;9;235;0;RRRRGGDDA0000 +1574;1;9;245;0 +1575;1;9;255;0;RGRRGGGDA0000 +1576;1;9;265;0 +1577;1;9;275;0 +1578;1;9;285;0;RGRRAGGDA0000 +1579;1;9;295;0;RGRRAAGDA0000 +1581;1;9;305;0;RGRRAAGDA0000 +1582;1;9;315;0 +1582;1;9;325;0;RGRRRRGDA0000 +1583;1;9;335;0 +1584;1;9;345;0;RGGRRRGGA0000 +1585;1;9;355;0 +1586;1;9;365;0 +1587;1;9;375;0;RRGRRRDGA0000 +1588;1;9;385;0 +1589;1;9;395;0 +1590;1;9;405;0 +1592;1;9;415;0 +1593;1;9;425;0 +1593;1;9;435;0 +1596;1;9;445;3 +1597;1;9;445;3 +1598;1;9;445;3;DDDDDDDDD0000 +1599;1;9;445;3 +1600;1;9;445;3 +1601;1;9;445;3;DDDDDDDDD0000 +1602;1;9;445;3 +1603;1;9;445;3 +1604;1;9;445;3 +1604;1;9;445;0;GRRGRRDDA0000 +1605;1;9;555;0 +1606;1;9;565;0 +1607;1;9;575;0 +1608;1;9;585;0;GRRGRSDDA0000 +1609;1;9;595;0;GRRGGGDDA0000 +1610;1;9;605;0 +1611;1;9;615;0;GRRGGGDDA0000 +1612;1;9;625;0 +1614;1;9;635;0 +1615;1;9;645;0 +1615;1;9;655;0 +1616;1;9;665;0 +1617;1;9;675;0 +1618;1;9;685;0 +1619;1;9;695;0 +1620;1;9;5;0 +1621;1;9;15;0;GRRGGGDDA0000 +1622;1;9;25;0 +1623;1;9;35;0 +1624;1;9;45;0 +1626;1;9;55;0 +1626;1;9;65;0 +1627;1;9;75;0 +1628;1;9;85;0 +1629;1;9;95;0 +1630;1;9;105;0 +1631;1;9;115;0;GRRGGGDDA0000 +1632;1;9;125;0 +1633;1;9;135;0 +1634;1;9;145;0 +1635;1;9;155;0 +1637;1;9;165;0 +1637;1;9;175;0 +1638;1;9;185;0 +1639;1;9;195;0 +1640;1;9;205;0 +1641;1;9;215;0;GRRAGGDDA0000 +1642;1;9;225;0;ARRAGGDDA0000 +1643;1;9;235;0 +1644;1;9;245;0 +1645;1;9;255;0;RRRRGGDDA0000 +1646;1;9;265;0 +1648;1;9;275;0;RGRRGGGDA0000 +1649;1;9;285;0 +1649;1;9;295;0;RGRRAGGDA0000 +1650;1;9;305;0;RGRRAAGDA0000 +1651;1;9;315;0;RGRRAAGDA0000 +1652;1;9;325;0 +1653;1;9;335;0;RGRRRRGDA0000 +1654;1;9;345;0 +1655;1;9;355;0;RGGRRRGGA0000 +1656;1;9;365;0 +1658;1;9;375;0 +1659;1;9;385;0 +1660;1;9;395;0;RRGRRRDGA0000 +1660;1;9;405;0 +1661;1;9;415;0;RRGRRRDGA0000 +1662;1;9;425;0 +1663;1;9;435;0 +1664;1;9;445;0 +1665;1;9;455;0 +1666;1;9;465;0 +1667;1;9;475;0;RRRRRRDDA0000 +1669;1;9;485;0 +1670;1;9;495;0 +1671;1;9;505;0;RRRRRRDDA0000 +1671;1;9;515;0;SRRRRRDDA0000 +1672;1;9;525;0;GRRGRRDDA0000 +1673;1;9;535;0 +1674;1;9;545;0 +1675;1;9;555;0 +1676;1;9;565;0 +1677;1;9;575;0 +1678;1;9;585;0 +1679;1;9;595;0;GRRGRSDDA0000 +1681;1;9;605;0;GRRGGGDDA0000 +1682;1;9;615;0 +1683;1;9;625;0 +1683;1;9;635;0 +1684;1;9;645;0 +1685;1;9;655;0 +1686;1;9;665;0 +1687;1;9;675;0 +1688;1;9;685;0 +1689;1;9;695;0 +1691;1;9;5;0;GRRGGGDDA0000 +1692;1;9;15;0 +1693;1;9;25;0 +1694;1;9;35;0 +1694;1;9;45;0 +1695;1;9;55;0 +1696;1;9;65;0 +1697;1;9;75;0 +1698;1;9;85;0 +1699;1;9;95;0 +1700;1;9;105;0 +1702;1;9;115;0 +1703;1;9;125;0 +1704;1;9;135;0 +1705;1;9;145;0 +1705;1;9;155;0 +1706;1;9;165;0 +1707;1;9;175;0 +1708;1;9;185;0 +1709;1;9;195;0 +1710;1;9;205;0 +1711;1;9;215;0;GRRAGGDDA0000 +1713;1;9;225;0;ARRAGGDDA0000 +1714;1;9;235;0 +1715;1;9;245;0 +1716;1;9;255;0;RRRRGGDDA0000 +1716;1;9;265;0 +1717;1;9;275;0;RGRRGGGDA0000 +1718;1;9;285;0 +1719;1;9;295;0;RGRRAGGDA0000 +1720;1;9;305;0;RGRRAAGDA0000 +1721;1;9;315;0;RGRRAAGDA0000 +1722;1;9;325;0 +1724;1;9;335;0;RGRRRRGDA0000 +1725;1;9;345;0 +1726;1;9;355;0;RGGRRRGGA0000 +1727;1;9;365;0 +1727;1;9;375;0 +1728;1;9;385;0 +1729;1;9;395;0;RRGRRRDGA0000 +1730;1;9;405;0 +1731;1;9;415;0;RRGRRRDGA0000 +1732;1;9;425;0 +1733;1;9;435;0 +1735;1;9;445;0 +1736;1;9;455;0 +1737;1;9;465;0 +1738;1;9;475;0;RRRRRRDDA0000 +1738;1;9;485;0 +1739;1;9;495;0 +1740;1;9;505;0 +1741;1;9;515;0;SRRRRRDDA0000 +1742;1;9;525;0;GRRGRRDDA0000 +1743;1;9;535;0 +1744;1;9;545;0 +1746;1;9;555;0 +1747;1;9;565;0 +1748;1;9;575;0 +1748;1;9;585;0 +1749;1;9;595;0;GRRGRSDDA0000 +1750;1;9;605;0;GRRGGGDDA0000 +1751;1;9;615;0;GRRGGGDDA0000 +1752;1;9;625;0 +1753;1;9;635;0 +1754;1;9;645;0 +1755;1;9;655;0 +1757;1;9;665;0 +1758;1;9;675;0 +1759;1;9;685;0 +1760;1;9;695;0 +1760;1;9;5;0 +1761;1;9;15;0;GRRGGGDDA0000 +1762;1;9;25;0 +1763;1;9;35;0 +1764;1;9;55;0 +1765;1;9;65;0 +1766;1;9;75;0 +1767;1;9;85;0 +1769;1;9;95;0 +1770;1;9;105;0 +1771;1;9;115;0;GRRGGGDDA0000 +1771;1;9;125;0;GRRGGGDDA0000 +1772;1;9;135;0 +1773;1;9;145;0 +1774;1;9;155;0 +1775;1;9;165;0 +1776;1;9;175;0 +1777;1;9;185;0 +1779;1;9;195;0;GRRAGGDDA0000 +1780;1;9;205;0;ARRAGGDDA0000 +1781;1;9;215;0;ARRAGGDDA0000 +1782;1;9;225;0 +1782;1;9;235;0;RRRRGGDDA0000 +1783;1;9;245;0 +1784;1;9;255;0;RGRRGGGDA0000 +1785;1;9;265;0 +1786;1;9;275;0;RGRRAGGDA0000 +1787;1;9;285;0;RGRRAAGDA0000 +1788;1;9;295;0 +1789;1;9;305;0 +1791;1;9;315;0;RGRRRRGDA0000 +1792;1;9;325;0 +1793;1;9;335;0;RGGRRRGGA0000 +1793;1;9;345;0 +1794;1;9;355;0 +1795;1;9;365;0 +1796;1;9;375;0;RRGRRRDGA0000 +1797;1;9;385;0 +1798;1;9;395;0 +1799;1;9;405;0 +1800;1;9;415;0 +1802;1;9;425;0 +1803;1;9;435;0 +1804;1;9;445;0 +1805;1;9;455;0;RRRRRRDDA0000 +1805;1;9;465;0 +1806;1;9;475;0;RRRRRRDDA0000 +1807;1;9;485;0;RRRRRRDDA0000 +1808;1;9;495;0;SRRRRRDDA0000 +1809;1;9;505;0;GRRGRRDDA0000 +1810;1;9;515;0 +1812;1;9;525;0 +1813;1;9;535;0 +1814;1;9;545;0 +1815;1;9;555;0 +1815;1;9;565;0 +1816;1;9;575;0;GRRGRSDDA0000 +1817;1;9;585;0;GRRGGGDDA0000 +1818;1;9;595;0 +1819;1;9;605;0 +1820;1;9;615;0 +1821;1;9;625;0;GRRGGGDDA0000 +1823;1;9;635;0 +1824;1;9;645;0 +1825;1;9;655;0 +1826;1;9;665;0 +1827;1;9;675;0 +1827;1;9;685;0 +1828;1;9;695;0 +1829;1;9;5;0 +1830;1;9;15;0 +1831;1;9;25;0;GRRGGGDDA0000 +1832;1;9;35;0 +1833;1;9;45;0 +1835;1;9;55;0 +1836;1;9;65;0 +1837;1;9;75;0 +1838;1;9;85;0 +1838;1;9;95;0 +1839;1;9;105;0 +1840;1;9;115;0 +1841;1;9;125;0;GRRGGGDDA0000 +1842;1;9;135;0 +1843;1;9;145;0 +1844;1;9;155;0 +1846;1;9;165;0 +1847;1;9;175;0 +1848;1;9;185;0 +1849;1;9;195;0;GRRAGGDDA0000 +1849;1;9;205;0;ARRAGGDDA0000 +1850;1;9;215;0 +1851;1;9;225;0;ARRAGGDDA0000 +1852;1;9;235;0;RRRRGGDDA0000 +1853;1;9;245;0 +1854;1;9;255;0;RGRRGGGDA0000 +1855;1;9;265;0 +1857;1;9;275;0;RGRRAGGDA0000 +1858;1;9;285;0;RGRRAAGDA0000 +1859;1;9;295;0 +1859;1;9;305;0 +1860;1;9;315;0;RGRRRRGDA0000 +1861;1;9;325;0;RGRRRRGDA0000 +1862;1;9;335;0;RGGRRRGGA0000 +1863;1;9;345;0 +1864;1;9;355;0 +1865;1;9;365;0 +1867;1;9;375;0;RRGRRRDGA0000 +1868;1;9;385;0 +1869;1;9;395;0 +1870;1;9;405;0 +1870;1;9;415;0 +1871;1;9;425;0;RRGRRRDGA0000 +1872;1;9;435;0 +1873;1;9;445;0 +1874;1;9;455;0;RRRRRRDDA0000 +1875;1;9;465;0 +1876;1;9;475;0 +1877;1;9;485;0 +1879;1;9;495;0;SRRRRRDDA0000 +1880;1;9;505;0;GRRGRRDDA0000 +1881;1;9;515;0;GRRGRRDDA0000 +1881;1;9;525;0;GRRGRRDDA0000 +1882;1;9;535;0 +1883;1;9;545;0 +1884;1;9;555;0 +1885;1;9;565;0;GRRGRRDDA0000 +1886;1;9;575;0;GRRGRSDDA0000 +1887;1;9;585;0;GRRGGGDDA0000 +1888;1;9;595;0 +1890;1;9;605;0 +1891;1;9;615;0;GRRGGGDDA0000 +1892;1;9;625;0 +1892;1;9;635;0 +1893;1;9;645;0 +1894;1;9;655;0 +1895;1;9;665;0 +1896;1;9;675;0 +1897;1;9;685;0 +1898;1;9;695;0 +1899;1;9;5;0 +1901;1;9;15;0;GRRGGGDDA0000 +1902;1;9;25;0 +1903;1;9;35;0 +1904;1;9;45;0 +1904;1;9;55;0 +1905;1;9;65;0 +1906;1;9;75;0 +1907;1;9;85;0 +1908;1;9;95;0 +1909;1;9;105;0 +1910;1;9;115;0 +1912;1;9;125;0 +1913;1;9;135;0 +1914;1;9;145;0 +1914;1;9;155;0 +1915;1;9;165;0 +1916;1;9;175;0 +1917;1;9;185;0 +1918;1;9;195;0;GRRAGGDDA0000 +1919;1;9;205;0;ARRAGGDDA0000 +1920;1;9;215;0 +1921;1;9;225;0;ARRAGGDDA0000 +1923;1;9;235;0;RRRRGGDDA0000 +1924;1;9;245;0 +1925;1;9;255;0;RGRRGGGDA0000 +1926;1;9;265;0 +1926;1;9;275;0;RGRRAGGDA0000 +1927;1;9;285;0;RGRRAAGDA0000 +1928;1;9;295;0 +1929;1;9;305;0 +1930;1;9;315;0;RGRRRRGDA0000 +1931;1;9;325;0;RGRRRRGDA0000 +1932;1;9;335;0;RGGRRRGGA0000 +1934;1;9;345;0 +1935;1;9;355;0 +1936;1;9;365;0 +1937;1;9;375;0;RRGRRRDGA0000 +1937;1;9;385;0 +1938;1;9;395;0 +1939;1;9;405;0 +1940;1;9;415;0 +1941;1;9;425;0;RRGRRRDGA0000 +1942;1;9;435;0 +1944;1;9;445;0 +1945;1;9;455;0;RRRRRRDDA0000 +1946;1;9;465;0 +1947;1;9;475;0 +1948;1;9;485;0 +1948;1;9;495;0;SRRRRRDDA0000 +1949;1;9;505;0;GRRGRRDDA0000 +1950;1;9;515;0 +1951;1;9;525;0;GRRGRRDDA0000 +1952;1;9;535;0 +1953;1;9;545;0 +1954;1;9;555;0 +1956;1;9;565;0 +1957;1;9;575;0;GRRGRSDDA0000 +1958;1;9;585;0;GRRGGGDDA0000 +1959;1;9;595;0 +1959;1;9;605;0 +1960;1;9;615;0 +1961;1;9;625;0;GRRGGGDDA0000 +1962;1;9;635;0 +1963;1;9;645;0 +1964;1;9;655;0 +1966;1;9;665;0 +1967;1;9;675;0 +1968;1;9;685;0 +1969;1;9;695;0 +1970;1;9;5;0 +1970;1;9;15;0 +1971;1;9;25;0;GRRGGGDDA0000 +1972;1;9;35;0 +1973;1;9;45;0 +1974;1;9;55;0 +1975;1;9;65;0 +1977;1;9;75;0 +1978;1;9;85;0 +1979;1;9;95;0 +1980;1;9;105;0 +1981;1;9;115;0;GRRGGGDDA0000 +1982;1;9;125;0 +1982;1;9;135;0 +1983;1;9;145;0 +1984;1;9;155;0 +1985;1;9;165;0 +1986;1;9;175;0 +1987;1;9;185;0 +1989;1;9;195;0 +1990;1;9;205;0 +1991;1;9;215;0;GRRAGGDDA0000 +1992;1;9;225;0;ARRAGGDDA0000 +1992;1;9;235;0 +1993;1;9;245;0 +1994;1;9;255;0;RRRRGGDDA0000 +1995;1;9;265;0 +1996;1;9;275;0;RGRRGGGDA0000 +1997;1;9;285;0 +1999;1;9;295;0;RGRRAGGDA0000 +2000;1;9;305;0;RGRRAAGDA0000 +2001;1;9;315;0;RGRRAAGDA0000 +2002;1;9;325;0 +2003;1;9;335;0;RGRRRRGDA0000 +2004;1;9;345;0 +2004;1;9;355;0;RGGRRRGGA0000 +2005;1;9;365;0 +2006;1;9;375;0 +2007;1;9;385;0 +2008;1;9;395;0;RRGRRRDGA0000 +2009;1;9;405;0 +2011;1;9;415;0;RRGRRRDGA0000 +2012;1;9;425;0 +2013;1;9;435;0 +2014;1;9;445;0 +2015;1;9;455;0 +2015;1;9;465;0 +2016;1;9;475;0;RRRRRRDDA0000 +2017;1;9;485;0;RRRRRRDDA0000 +2018;1;9;495;0 +2019;1;9;505;0 +2021;1;9;515;0;SRRRRRDDA0000 +2022;1;9;525;0;GRRGRRDDA0000 +2023;1;9;535;0 +2024;1;9;545;0 +2025;1;9;555;0 +2026;1;9;565;0 +2026;1;9;575;0 +2027;1;9;585;0 +2028;1;9;595;0;GRRGRSDDA0000 +2029;1;9;605;0;GRRGGGDDA0000 +2030;1;9;615;0 +2031;1;9;625;0;GRRGGGDDA0000 +2033;1;9;635;0 +2034;1;9;645;0;GRRGGGDDA0000 +2035;1;9;655;0 +2036;1;9;665;0 +2037;1;9;675;0 +2037;1;9;685;0 +2038;1;9;695;0 +2039;1;9;5;0 +2040;1;9;15;0 +2041;1;9;25;0;GRRGGGDDA0000 +2043;1;9;35;0 +2044;1;9;45;0 +2045;1;9;55;0 +2046;1;9;65;0 +2047;1;9;75;0 +2048;1;9;85;0 +2048;1;9;95;0 +2049;1;9;105;0 +2050;1;9;115;0 +2051;1;9;125;0;GRRGGGDDA0000 +2052;1;9;135;0 +2054;1;9;145;0 +2055;1;9;155;0 +2056;1;9;165;0 +2057;1;9;175;0 +2058;1;9;185;0 +2059;1;9;195;0 +2059;1;9;205;0 +2060;1;9;215;0;GRRAGGDDA0000 +2061;1;9;225;0;ARRAGGDDA0000 +2062;1;9;235;0 +2063;1;9;245;0 +2064;1;9;255;0;RRRRGGDDA0000 +2066;1;9;265;0 +2067;1;9;275;0;RGRRGGGDA0000 +2068;1;9;285;0 +2069;1;9;295;0;RGRRAGGDA0000 +2070;1;9;305;0;RGRRAAGDA0000 +2070;1;9;315;0 +2071;1;9;325;0;RGRRAAGDA0000 +2072;1;9;335;0;RGRRRRGDA0000 +2073;1;9;345;0 +2074;1;9;355;0;RGGRRRGGA0000 +2076;1;9;365;0 +2077;1;9;375;0 +2078;1;9;385;0 +2079;1;9;395;0;RRGRRRDGA0000 +2080;1;9;405;0 +2080;1;9;415;0 +2081;1;9;425;0;RRGRRRDGA0000 +2082;1;9;435;0 +2083;1;9;445;0 +2084;1;9;455;0 +2085;1;9;465;0 +2086;1;9;475;0;RRRRRRDDA0000 +2088;1;9;485;0 +2089;1;9;495;0 +2090;1;9;505;0 +2091;1;9;515;0;SRRRRRDDA0000 +2092;1;9;525;0;GRRGRRDDA0000 +2092;1;9;535;0 +2093;1;9;545;0 +2094;1;9;555;0 +2095;1;9;565;0 +2096;1;9;575;0 +2098;1;9;585;0 +2099;1;9;595;0;GRRGRSDDA0000 +2100;1;9;605;0;GRRGGGDDA0000 +2101;1;9;615;0;GRRGGGDDA0000 +2102;1;9;625;0 +2103;1;9;635;0 +2103;1;9;645;0 +2104;1;9;655;0 +2105;1;9;665;0 +2106;1;9;675;0 +2107;1;9;685;0 +2109;1;9;695;0 +2110;1;9;5;0 +2111;1;9;15;0;GRRGGGDDA0000 +2112;1;9;25;0 +2113;1;9;35;0 +2113;1;9;45;0 +2114;1;9;55;0 +2115;1;9;65;0 +2116;1;9;75;0 +2117;1;9;85;0 +2118;1;9;95;0 +2120;1;9;105;0 +2121;1;9;115;0;GRRGGGDDA0000 +2122;1;9;125;0 +2123;1;9;135;0 +2124;1;9;145;0 +2125;1;9;155;0 +2125;1;9;165;0 +2126;1;9;175;0 +2127;1;9;185;0 +2128;1;9;195;0 +2129;1;9;205;0 +2130;1;9;215;0;GRRAGGDDA0000 +2132;1;9;225;0;ARRAGGDDA0000 +2133;1;9;235;0 +2134;1;9;245;0 +2135;1;9;255;0;RRRRGGDDA0000 +2136;1;9;265;0 +2136;1;9;275;0;RGRRGGGDA0000 +2137;1;9;285;0 +2138;1;9;295;0;RGRRAGGDA0000 +2139;1;9;305;0;RGRRAAGDA0000 +2140;1;9;315;0 +2142;1;9;325;0 +2143;1;9;335;0;RGRRRRGDA0000 +2144;1;9;345;0 +2145;1;9;355;0;RGGRRRGGA0000 +2146;1;9;365;0 +2147;1;9;375;0 +2147;1;9;385;0 +2148;1;9;395;0;RRGRRRDGA0000 +2149;1;9;405;0 +2150;1;9;415;0 +2151;1;9;425;0;RRGRRRDGA0000 +2152;1;9;435;0 +2154;1;9;445;0 +2155;1;9;455;0 +2156;1;9;465;0 +2157;1;9;475;0;RRRRRRDDA0000 +2158;1;9;485;0 +2158;1;9;495;0 +2159;1;9;505;0 +2160;1;9;515;0;SRRRRRDDA0000 +2161;1;9;525;0;GRRGRRDDA0000 +2162;1;9;535;0 +2163;1;9;545;0 +2165;1;9;555;0 +2166;1;9;565;0 +2167;1;9;575;0 +2168;1;9;585;0 +2169;1;9;595;0;GRRGRSDDA0000 +2169;1;9;605;0;GRRGGGDDA0000 +2170;1;9;615;0 +2171;1;9;625;0;GRRGGGDDA0000 +2172;1;9;635;0 +2173;1;9;645;0 +2174;1;9;655;0 +2176;1;9;665;0 +2177;1;9;675;0 +2178;1;9;685;0 +2179;1;9;695;0 +2180;1;9;5;0 +2180;1;9;15;0 +2181;1;9;25;0;GRRGGGDDA0000 +2182;1;9;35;0 +2183;1;9;45;0 +2184;1;9;55;0 +2185;1;9;65;0 +2187;1;9;75;0 +2188;1;9;85;0 +2189;1;9;95;0 +2190;1;9;105;0 +2191;1;9;115;0;GRRGGGDDA0000 +2192;1;9;125;0 +2192;1;9;135;0 +2193;1;9;145;0 +2194;1;9;155;0 +2195;1;9;165;0 +2197;1;9;175;0 +2198;1;9;185;0 +2199;1;9;195;0 +2200;1;9;205;0 +2201;1;9;215;0;GRRAGGDDA0000 +2202;1;9;225;0;ARRAGGDDA0000 +2202;1;9;235;0 +2203;1;9;245;0 +2204;1;9;255;0;RRRRGGDDA0000 +2205;1;9;265;0 +2206;1;9;275;0;RGRRGGGDA0000 +2208;1;9;285;0 +2209;1;9;295;0;RGRRAGGDA0000 +2210;1;9;305;0;RGRRAAGDA0000 +2211;1;9;315;0;RGRRAAGDA0000 +2212;1;9;325;0 +2213;1;9;335;0;RGRRRRGDA0000 +2214;1;9;345;0 +2214;1;9;355;0;RGGRRRGGA0000 +2215;1;9;365;0 +2216;1;9;375;0 +2217;1;9;385;0 +2218;1;9;395;0;RRGRRRDGA0000 +2220;1;9;405;0 +2221;1;9;415;0;RRGRRRDGA0000 +2222;1;9;425;0 +2223;1;9;435;0 +2224;1;9;445;0 +2225;1;9;455;0 +2225;1;9;465;0 +2226;1;9;475;0;RRRRRRDDA0000 +2227;1;9;485;0 +2228;1;9;495;0 +2229;1;9;505;0 +2231;1;9;515;0;SRRRRRDDA0000 +2232;1;9;525;0;GRRGRRDDA0000 +2233;1;9;535;0 +2234;1;9;545;0 +2235;1;9;555;0 +2235;1;9;565;0 +2236;1;9;575;0 +2237;1;9;585;0 +2238;1;9;595;0;GRRGRSDDA0000 +2239;1;9;605;0;GRRGGGDDA0000 +2240;1;9;615;0 +2242;1;9;625;0 +2243;1;9;635;0 +2244;1;9;645;0 +2245;1;9;655;0 +2246;1;9;665;0 +2247;1;9;675;0 +2247;1;9;685;0 +2248;1;9;695;0 +2249;1;9;5;0 +2250;1;9;15;0 +2251;1;9;25;0;GRRGGGDDA0000 +2253;1;9;35;0 +2254;1;9;45;0 +2255;1;9;55;0 +2256;1;9;65;0 +2257;1;9;75;0 +2258;1;9;85;0 +2258;1;9;95;0 +2259;1;9;105;0 +2260;1;9;115;0 +2261;1;9;125;0;GRRGGGDDA0000 +2262;1;9;135;0 +2264;1;9;145;0 +2265;1;9;155;0 +2266;1;9;165;0 +2267;1;9;175;0 +2268;1;9;185;0 +2269;1;9;195;0 +2269;1;9;205;0 +2270;1;9;215;0;GRRAGGDDA0000 +2271;1;9;225;0;ARRAGGDDA0000 +2272;1;9;235;0 +2273;1;9;245;0 +2275;1;9;255;0;RRRRGGDDA0000 +2276;1;9;265;0 +2277;1;9;275;0;RGRRGGGDA0000 +2278;1;9;285;0 +2279;1;9;295;0;RGRRAGGDA0000 +2280;1;9;305;0;RGRRAAGDA0000 +2280;1;9;315;0 +2281;1;9;325;0;RGRRAAGDA0000 +2282;1;9;335;0;RGRRRRGDA0000 +2283;1;9;345;0 +2285;1;9;355;0;RGGRRRGGA0000 +2286;1;9;365;0 +2287;1;9;375;0 +2288;1;9;385;0 +2289;1;9;395;0;RRGRRRDGA0000 +2290;1;9;405;0 +2291;1;9;415;0;RRGRRRDGA0000 +2292;1;9;425;0 +2292;1;9;435;0 +2293;1;9;445;0 +2294;1;9;455;0 +2295;1;9;465;0 +2297;1;9;475;0;RRRRRRDDA0000 +2298;1;9;485;0 +2299;1;9;495;0 +2300;1;9;505;0 +2301;1;9;515;0;SRRRRRDDA0000 +2302;1;9;525;0;GRRGRRDDA0000 +2302;1;9;535;0 +2303;1;9;545;0 +2304;1;9;555;0 +2305;1;9;565;0 +2306;1;9;575;0 +2308;1;9;585;0 +2309;1;9;595;0;GRRGRSDDA0000 +2310;1;9;605;0;GRRGGGDDA0000 +2311;1;9;615;0;GRRGGGDDA0000 +2312;1;9;625;0 +2313;1;9;635;0 +2314;1;9;645;0 +2314;1;9;655;0 +2315;1;9;665;0 +2316;1;9;675;0 +2317;1;9;685;0 +2319;1;9;695;0 +2320;1;9;5;0 +2321;1;9;15;0;GRRGGGDDA0000 +2322;1;9;25;0 +2323;1;9;35;0 +2324;1;9;45;0 +2325;1;9;55;0 +2325;1;9;65;0 +2326;1;9;75;0 +2327;1;9;85;0 +2328;1;9;95;0 +2330;1;9;105;0 +2331;1;9;115;0;GRRGGGDDA0000 +2332;1;9;125;0 +2333;1;9;135;0 +2334;1;9;145;0 +2335;1;9;155;0 +2335;1;9;165;0 +2336;1;9;175;0 +2337;1;9;185;0 +2338;1;9;195;0 +2339;1;9;205;0 +2341;1;9;215;0;GRRAGGDDA0000 +2342;1;9;225;0;ARRAGGDDA0000 +2343;1;9;235;0 +2344;1;9;245;0 +2345;1;9;255;0;RRRRGGDDA0000 +2346;1;9;265;0 +2347;1;9;275;0;RGRRGGGDA0000 +2347;1;9;285;0 +2348;1;9;295;0;RGRRAGGDA0000 +2349;1;9;305;0;RGRRAAGDA0000 +2351;1;9;315;0;RGRRAAGDA0000 +2352;1;9;325;0 +2353;1;9;335;0;RGRRRRGDA0000 +2354;1;9;345;0 +2355;1;9;355;0;RGGRRRGGA0000 +2356;1;9;365;0 +2357;1;9;375;0 +2357;1;9;385;0 +2358;1;9;395;0;RRGRRRDGA0000 +2359;1;9;405;0 +2360;1;9;415;0 +2362;1;9;425;0 +2363;1;9;435;0 +2364;1;9;445;0 +2365;1;9;455;0 +2366;1;9;465;0 +2367;1;9;475;0;RRRRRRDDA0000 +2368;1;9;485;0 +2368;1;9;495;0 +2369;1;9;505;0 +2370;1;9;515;0;SRRRRRDDA0000 +2371;1;9;525;0;GRRGRRDDA0000 +2372;1;9;535;0 +2374;1;9;545;0 +2375;1;9;555;0 +2376;1;9;565;0 +2377;1;9;575;0 +2378;1;9;585;0 +2379;1;9;595;0;GRRGRSDDA0000 +2379;1;9;605;0;GRRGGGDDA0000 +2380;1;9;615;0 +2381;1;9;625;0;GRRGGGDDA0000 +2382;1;9;635;0 +2383;1;9;645;0 +2385;1;9;655;0;GRRGGGDDA0000 +2386;1;9;665;0 +2387;1;9;675;0 +2388;1;9;685;0 +2389;1;9;695;0 +2390;1;9;5;0 +2390;1;9;15;0 +2391;1;9;25;0;GRRGGGDDA0000 +2392;1;9;35;0 +2393;1;9;45;0 +2395;1;9;55;0 +2396;1;9;65;0 +2397;1;9;75;0 +2398;1;9;85;0 +2399;1;9;95;0 +2400;1;9;105;0 +2401;1;9;115;0;GRRGGGDDA0000 +2401;1;9;125;0;GRRGGGDDA0000 +2402;1;9;135;0 +2403;1;9;145;0 +2404;1;9;155;0 +2406;1;9;165;0 +2407;1;9;175;0 +2408;1;9;185;0 +2409;1;9;195;0 +2410;1;9;205;0 +2411;1;9;215;0;GRRAGGDDA0000 +2412;1;9;225;0;ARRAGGDDA0000 +2413;1;9;235;0 +2413;1;9;245;0 +2414;1;9;255;0;RRRRGGDDA0000 +2415;1;9;265;0 +2416;1;9;275;0;RGRRGGGDA0000 +2418;1;9;285;0 +2419;1;9;295;0;RGRRAGGDA0000 +2420;1;9;305;0;RGRRAAGDA0000 +2421;1;9;315;0;RGRRAAGDA0000 +2422;1;9;325;0 +2423;1;9;335;0;RGRRRRGDA0000 +2423;1;9;345;0 +2424;1;9;355;0;RGGRRRGGA0000 +2425;1;9;365;0 +2426;1;9;375;0 +2427;1;9;385;0 +2429;1;9;395;0;RRGRRRDGA0000 +2430;1;9;405;0 +2431;1;9;415;0;RRGRRRDGA0000 +2432;1;9;425;0 +2433;1;9;435;0 +2434;1;9;445;0 +2435;1;9;455;0 +2435;1;9;465;0 +2436;1;9;475;0;RRRRRRDDA0000 +2437;1;9;485;0 +2438;1;9;495;0 +2440;1;9;505;0 +2441;1;9;515;0;SRRRRRDDA0000 +2442;1;9;525;0;GRRGRRDDA0000 +2443;1;9;535;0 +2444;1;9;545;0 +2445;1;9;555;0 +2445;1;9;565;0 +2446;1;9;575;0 +2447;1;9;585;0 +2448;1;9;595;0;GRRGRSDDA0000 +2449;1;9;605;0;GRRGGGDDA0000 +2451;1;9;615;0;GRRGGGDDA0000 +2452;1;9;625;0 +2453;1;9;635;0 +2454;1;9;645;0 +2455;1;9;655;0 +2456;1;9;665;0 +2457;1;9;675;0 +2457;1;9;685;0 +2458;1;9;695;0 +2459;1;9;5;0 +2460;1;9;15;0 +2462;1;9;25;0 +2463;1;9;35;0 +2464;1;9;45;0 +2465;1;9;55;0 +2466;1;9;65;0 +2467;1;9;75;0 +2468;1;9;85;0 +2468;1;9;95;0 +2469;1;9;105;0 +2470;1;9;115;0 +2471;1;9;125;0;GRRGGGDDA0000 +2473;1;9;135;0 +2474;1;9;145;0 +2475;1;9;155;0 +2476;1;9;165;0 +2477;1;9;175;0 +2478;1;9;185;0 +2479;1;9;195;0 +2479;1;9;205;0 +2480;1;9;215;0;GRRAGGDDA0000 +2481;1;9;225;0;ARRAGGDDA0000 +2483;1;9;235;0 +2484;1;9;245;0 +2485;1;9;255;0;RRRRGGDDA0000 +2486;1;9;265;0 +2487;1;9;275;0;RGRRGGGDA0000 +2488;1;9;285;0 +2489;1;9;295;0;RGRRAGGDA0000 +2490;1;9;305;0;RGRRAAGDA0000 +2490;1;9;315;0 +2491;1;9;325;0;RGRRAAGDA0000 +2492;1;9;335;0;RGRRRRGDA0000 +2494;1;9;345;0 +2495;1;9;355;0;RGGRRRGGA0000 +2496;1;9;365;0 +2497;1;9;375;0 +2498;1;9;385;0 +2499;1;9;395;0;RRGRRRDGA0000 +2500;1;9;405;0 +2501;1;9;415;0;RRGRRRDGA0000 +2501;1;9;425;0;RRGRRRDGA0000 +2502;1;9;435;0 +2503;1;9;445;0 +2504;1;9;455;0 +2506;1;9;465;0 +2507;1;9;475;0;RRRRRRDDA0000 +2508;1;9;485;0 +2509;1;9;495;0 +2510;1;9;505;0 +2511;1;9;515;0;SRRRRRDDA0000 +2512;1;9;525;0;GRRGRRDDA0000 +2513;1;9;535;0 +2513;1;9;545;0 +2514;1;9;555;0 +2515;1;9;565;0 +2517;1;9;575;0 +2518;1;9;585;0 +2519;1;9;595;0;GRRGRSDDA0000 +2520;1;9;605;0;GRRGGGDDA0000 +2521;1;9;615;0;GRRGGGDDA0000 +2522;1;9;625;0 +2523;1;9;635;0 +2523;1;9;645;0 +2524;1;9;655;0 +2525;1;9;665;0 +2527;1;9;675;0 +2528;1;9;685;0 +2529;1;9;695;0 +2530;1;9;5;0 +2531;1;9;15;0;GRRGGGDDA0000 +2532;1;9;25;0 +2533;1;9;35;0 +2534;1;9;45;0 +2535;1;9;55;0 +2535;1;9;65;0 +2536;1;9;75;0 +2538;1;9;85;0 +2539;1;9;95;0 +2540;1;9;105;0 +2541;1;9;115;0;GRRGGGDDA0000 +2542;1;9;125;0 +2543;1;9;135;0 +2544;1;9;145;0 +2545;1;9;155;0 +2546;1;9;165;0 +2546;1;9;175;0 +2547;1;9;185;0 +2548;1;9;195;0;GRRAGGDDA0000 +2550;1;9;205;0;ARRAGGDDA0000 +2551;1;9;215;0;ARRAGGDDA0000 +2552;1;9;225;0 +2553;1;9;235;0;RRRRGGDDA0000 +2554;1;9;245;0 +2555;1;9;255;0;RGRRGGGDA0000 +2556;1;9;265;0 +2557;1;9;275;0;RGRRAGGDA0000 +2557;1;9;285;0;RGRRAAGDA0000 +2558;1;9;295;0 +2559;1;9;305;0 +2561;1;9;315;0;RGRRRRGDA0000 +2562;1;9;325;0 +2563;1;9;335;0;RGGRRRGGA0000 +2564;1;9;345;0 +2565;1;9;355;0 +2566;1;9;365;0 +2567;1;9;375;0;RRGRRRDGA0000 +2568;1;9;385;0 +2568;1;9;395;0 +2569;1;9;405;0 +2570;1;9;415;0 +2572;1;9;425;0 +2573;1;9;435;0 +2574;1;9;445;0 +2575;1;9;455;0;RRRRRRDDA0000 +2576;1;9;465;0 +2577;1;9;475;0 +2578;1;9;485;0 +2579;1;9;495;0;SRRRRRDDA0000 +2579;1;9;505;0;GRRGRRDDA0000 +2580;1;9;515;0 +2581;1;9;525;0;GRRGRRDDA0000 +2583;1;9;535;0 +2584;1;9;545;0 +2585;1;9;555;0 +2586;1;9;565;0 +2587;1;9;575;0;GRRGRSDDA0000 +2588;1;9;585;0;GRRGGGDDA0000 +2589;1;9;595;0 +2590;1;9;605;0 +2590;1;9;615;0 +2591;1;9;625;0;GRRGGGDDA0000 +2592;1;9;635;0 +2594;1;9;645;0 +2595;1;9;655;0 +2596;1;9;665;0 +2597;1;9;675;0 +2598;1;9;685;0 +2599;1;9;695;0 +2600;1;9;5;0 +2601;1;9;15;0;GRRGGGDDA0000 +2601;1;9;25;0;GRRGGGDDA0000 +2602;1;9;35;0 +2604;1;9;45;0 +2605;1;9;55;0 +2606;1;9;65;0 +2607;1;9;75;0 +2608;1;9;85;0 +2609;1;9;95;0 +2610;1;9;105;0 +2611;1;9;115;0;GRRGGGDDA0000 +2611;1;9;125;0;GRRGGGDDA0000 +2612;1;9;135;0 +2613;1;9;145;0 +2614;1;9;155;0 +2616;1;9;165;0 +2617;1;9;175;0 +2618;1;9;185;0 +2619;1;9;195;0 +2620;1;9;205;0 +2621;1;9;215;0;GRRAGGDDA0000 +2622;1;9;225;0;ARRAGGDDA0000 +2623;1;9;235;0 +2623;1;9;245;0 +2624;1;9;255;0;RRRRGGDDA0000 +2626;1;9;265;0 +2627;1;9;275;0;RGRRGGGDA0000 +2628;1;9;285;0 +2629;1;9;295;0;RGRRAGGDA0000 +2630;1;9;305;0;RGRRAAGDA0000 +2631;1;9;315;0;RGRRAAGDA0000 +2632;1;9;325;0 +2633;1;9;335;0;RGRRRRGDA0000 +2634;1;9;345;0 +2634;1;9;355;0;RGGRRRGGA0000 +2635;1;9;365;0 +2636;1;9;375;0 +2638;1;9;385;0 +2639;1;9;395;0;RRGRRRDGA0000 +2640;1;9;405;0 +2641;1;9;415;0;RRGRRRDGA0000 +2642;1;9;425;0 +2643;1;9;435;0 +2644;1;9;445;0 +2645;1;9;455;0 +2645;1;9;465;0 +2646;1;9;475;0;RRRRRRDDA0000 +2647;1;9;485;0 +2649;1;9;495;0 +2650;1;9;505;0 +2651;1;9;515;0;SRRRRRDDA0000 +2652;1;9;525;0;GRRGRRDDA0000 +2653;1;9;535;0 +2654;1;9;545;0 +2655;1;9;555;0 +2656;1;9;565;0 +2656;1;9;575;0 +2657;1;9;585;0 +2658;1;9;595;0;GRRGRSDDA0000 +2660;1;9;605;0;GRRGGGDDA0000 +2661;1;9;615;0;GRRGGGDDA0000 +2662;1;9;625;0 +2663;1;9;635;0 +2664;1;9;645;0 +2665;1;9;655;0 +2666;1;9;665;0 +2667;1;9;675;0 +2667;1;9;685;0 +2668;1;9;695;0 +2670;1;9;5;0 +2671;1;9;15;0;GRRGGGDDA0000 +2672;1;9;25;0 +2673;1;9;35;0 +2674;1;9;45;0 +2675;1;9;55;0 +2676;1;9;65;0 +2677;1;9;75;0 +2678;1;9;85;0 +2678;1;9;95;0 +2679;1;9;105;0 +2681;1;9;115;0;GRRGGGDDA0000 +2682;1;9;125;0 +2683;1;9;135;0 +2684;1;9;145;0 +2685;1;9;155;0 +2686;1;9;165;0 +2687;1;9;175;0 +2688;1;9;185;0 +2689;1;9;195;0 +2689;1;9;205;0;GRRAGGDDA0000 +2690;1;9;215;0;ARRAGGDDA0000 +2691;1;9;225;0;ARRAGGDDA0000 +2693;1;9;235;0 +2694;1;9;245;0;RRRRGGDDA0000 +2695;1;9;255;0 +2696;1;9;265;0;RGRRGGGDA0000 +2697;1;9;275;0 +2698;1;9;285;0;RGRRAGGDA0000 +2699;1;9;295;0;RGRRAAGDA0000 +2700;1;9;305;0 +2700;1;9;315;0 +2701;1;9;325;0;RGRRRRGDA0000 +2702;1;9;335;0 +2704;1;9;345;0;RGGRRRGGA0000 +2705;1;9;355;0 +2706;1;9;365;0 +2707;1;9;375;0 +2708;1;9;385;0;RRGRRRDGA0000 +2709;1;9;395;0 +2710;1;9;405;0 +2711;1;9;415;0;RRGRRRDGA0000 +2711;1;9;425;0;RRGRRRDGA0000 +2712;1;9;435;0 +2713;1;9;445;0 +2715;1;9;455;0 +2716;1;9;465;0;RRRRRRDDA0000 +2717;1;9;475;0 +2718;1;9;485;0 +2719;1;9;495;0 +2720;1;9;505;0;SRRRRRDDA0000 +2721;1;9;515;0;GRRGRRDDA0000 +2722;1;9;525;0 +2723;1;9;535;0 +2723;1;9;545;0 +2724;1;9;555;0 +2726;1;9;565;0 +2727;1;9;575;0 +2728;1;9;585;0;GRRGRSDDA0000 +2729;1;9;595;0;GRRGGGDDA0000 +2730;1;9;605;0 +2731;1;9;615;0;GRRGGGDDA0000 +2732;1;9;625;0 +2733;1;9;635;0 +2733;1;9;645;0 +2734;1;9;655;0 +2736;1;9;665;0 +2737;1;9;675;0 +2738;1;9;685;0 +2739;1;9;695;0 +2740;1;9;5;0 +2741;1;9;15;0;GRRGGGDDA0000 +2742;1;9;25;0 +2743;1;9;35;0 +2744;1;9;45;0 +2745;1;9;55;0 +2745;1;9;65;0 +2747;1;9;75;0 +2748;1;9;85;0 +2749;1;9;95;0 +2750;1;9;105;0 +2751;1;9;115;0;GRRGGGDDA0000 +2752;1;9;125;0 +2753;1;9;135;0 +2754;1;9;145;0 +2755;1;9;155;0 +2756;1;9;165;0 +2757;1;9;175;0 +2758;1;9;185;0 +2759;1;9;195;0 +2760;1;9;205;0 +2761;1;9;215;0;GRRAGGDDA0000 +2762;1;9;225;0;ARRAGGDDA0000 +2763;1;9;235;0 +2764;1;9;245;0 +2765;1;9;255;0;RRRRGGDDA0000 +2766;1;9;265;0 +2767;1;9;275;0;RGRRGGGDA0000 +2768;1;9;285;0 +2769;1;9;295;0;RGRRAGGDA0000 +2770;1;9;305;0;RGRRAAGDA0000 +2771;1;9;315;0;RGRRAAGDA0000 +2772;1;9;325;0 +2773;1;9;335;0;RGRRRRGDA0000 +2774;1;9;345;0 +2775;1;9;355;0;RGGRRRGGA0000 +2776;1;9;365;0 +2777;1;9;375;0 +2778;1;9;385;0 +2779;1;9;395;0;RRGRRRDGA0000 +2780;1;9;405;0 +2781;1;9;415;0;RRGRRRDGA0000 +2782;1;9;425;0 +2783;1;9;435;0 +2784;1;9;445;0 +2785;1;9;455;0 +2786;1;9;465;0 +2787;1;9;475;0;RRRRRRDDA0000 +2788;1;9;485;0 +2789;1;9;495;0 +2790;1;9;505;0 +2791;1;9;515;0;SRRRRRDDA0000 +2792;1;9;525;0;GRRGRRDDA0000 +2793;1;9;535;0 +2794;1;9;545;0 +2795;1;9;555;0 +2796;1;9;565;0 +2797;1;9;575;0 +2798;1;9;585;0 +2799;1;9;595;0;GRRGRSDDA0000 +2800;1;9;605;0;GRRGGGDDA0000 +2801;1;9;615;0;GRRGGGDDA0000 +2802;1;9;625;0 +2803;1;9;635;0 +2804;1;9;645;0 +2805;1;9;655;0 +2806;1;9;665;0 +2807;1;9;675;0 +2808;1;9;685;0 +2809;1;9;695;0 +2810;1;9;5;0 +2811;1;9;15;0;GRRGGGDDA0000 +2812;1;9;25;0 +2813;1;9;35;0 +2814;1;9;45;0 +2815;1;9;50;2 +2816;1;9;50;0 +2817;1;9;55;0 +2818;1;9;65;0 +2819;1;9;75;0 +2820;1;9;85;0 +2821;1;9;95;0;GRRGGGDDA0000 +2822;1;9;105;0 +2823;1;9;115;0 +2824;1;9;125;0 +2825;1;9;135;0 +2826;1;9;145;0 +2827;1;9;155;0 +2828;1;9;165;0 +2829;1;9;175;0 +2830;1;9;185;0;GRRAGGDDA0000 +2831;1;9;195;0;ARRAGGDDA0000 +2832;1;9;205;0 +2833;1;9;215;0 +2834;1;9;225;0;RRRRGGDDA0000 +2835;1;9;235;0 +2836;1;9;245;0;RGRRGGGDA0000 +2837;1;9;255;0 +2838;1;9;265;0;RGRRAGGDA0000 +2839;1;9;275;0;RGRRAAGDA0000 +2840;1;9;285;0 +2841;1;9;295;0;RGRRAAGDA0000 +2842;1;9;305;0;RGRRRRGDA0000 +2843;1;9;315;0 +2844;1;9;325;0;RGGRRRGGA0000 +2845;1;9;335;0 +2846;1;9;345;0 +2847;1;9;355;0 +2848;1;9;365;0;RRGRRRDGA0000 +2849;1;9;375;0 +2850;1;9;385;0 +2851;1;9;395;0;RRGRRRDGA0000 +2852;1;9;405;0 +2853;1;9;415;0 +2854;1;9;425;0 +2855;1;9;435;0 +2856;1;9;445;0;RRRRRRDDA0000 +2857;1;9;455;0 +2858;1;9;465;0 +2859;1;9;475;0 +2860;1;9;485;0;SRRRRRDDA0000 +2861;1;9;495;0;GRRGRRDDA0000 +2862;1;9;505;0 +2863;1;9;515;0 +2864;1;9;525;0 +2865;1;9;535;0 +2866;1;9;545;0 +2867;1;9;555;0 +2868;1;9;565;0;GRRGRSDDA0000 +2869;1;9;575;0;GRRGGGDDA0000 +2870;1;9;585;0 +2871;1;9;595;0;GRRGGGDDA0000 +2872;1;9;605;0 +2873;1;9;615;0 +2874;1;9;625;0 +2875;1;9;635;0 +2876;1;9;645;0 +2877;1;9;655;0 +2878;1;9;665;0 +2879;1;9;675;0 +2880;1;9;685;0 +2881;1;9;695;0;GRRGGGDDA0000 +2882;1;9;5;0 +2883;1;9;15;0 +2884;1;9;25;0 +2885;1;9;35;0 +2886;1;9;45;0 +2887;1;9;55;0 +2888;1;9;65;0 +2889;1;9;75;0 +2890;1;9;85;0 +2891;1;9;95;0;GRRGGGDDA0000 +2892;1;9;105;0 +2893;1;9;115;0 +2894;1;9;125;0 +2895;1;9;135;0 +2896;1;9;145;0 +2897;1;9;155;0 +2898;1;9;165;0 +2899;1;9;175;0 +2900;1;9;185;0;GRRAGGDDA0000 +2901;1;9;195;0;ARRAGGDDA0000 +2902;1;9;205;0 +2903;1;9;215;0 +2904;1;9;225;0;RRRRGGDDA0000 +2905;1;9;235;0 +2906;1;9;245;0;RGRRGGGDA0000 +2907;1;9;255;0 +2908;1;9;265;0;RGRRAGGDA0000 +2909;1;9;275;0;RGRRAAGDA0000 +2910;1;9;285;0 +2911;1;9;295;0;RGRRAAGDA0000 +2912;1;9;305;0;RGRRRRGDA0000 +2913;1;9;315;0 +2914;1;9;325;0;RGGRRRGGA0000 +2915;1;9;335;0 +2916;1;9;345;0 +2917;1;9;355;0 +2918;1;9;365;0;RRGRRRDGA0000 +2919;1;9;375;0 +2920;1;9;385;0 +2921;1;9;395;0;RRGRRRDGA0000 +2922;1;9;405;0 +2923;1;9;415;0 +2924;1;9;425;0 +2925;1;9;435;0 +2926;1;9;445;0;RRRRRRDDA0000 +2927;1;9;455;0 +2928;1;9;465;0 +2929;1;9;475;0 +2930;1;9;485;0;SRRRRRDDA0000 +2931;1;9;495;0;GRRGRRDDA0000 +2932;1;9;505;0 +2933;1;9;515;0 +2934;1;9;525;0 +2935;1;9;535;0 +2936;1;9;545;0 +2937;1;9;555;0 +2938;1;9;565;0;GRRGRSDDA0000 +2939;1;9;575;0;GRRGGGDDA0000 +2940;1;9;585;0 +2941;1;9;595;0;GRRGGGDDA0000 +2942;1;9;605;0 +2943;1;9;615;0 +2944;1;9;625;0 +2945;1;9;635;0 +2946;1;9;645;0 +2947;1;9;655;0 +2948;1;9;665;0 +2949;1;9;675;0 +2950;1;9;685;0 +2951;1;9;695;0;GRRGGGDDA0000 +2952;1;9;5;0 +2953;1;9;15;0 +2954;1;9;25;0 +2955;1;9;35;0 +2956;1;9;45;0 +2957;1;9;55;0 +2958;1;9;65;0 +2959;1;9;75;0;GRRGGGDDA0000 +2960;1;9;85;0 +2961;1;9;95;0;GRRGGGDDA0000 +2962;1;9;105;0 +2963;1;9;115;0 +2964;1;9;125;0 +2965;1;9;135;0 +2966;1;9;145;0 +2967;1;9;155;0 +2968;1;9;165;0 +2969;1;9;175;0 +2970;1;9;185;0 +2971;1;9;195;0;GRRGGGDDA0000 +2972;1;9;205;0 +2973;1;9;215;0;GRRAGGDDA0000 +2974;1;9;225;0;ARRAGGDDA0000 +2975;1;9;235;0 +2976;1;9;245;0 +2977;1;9;255;0;RRRRGGDDA0000 +2978;1;9;265;0 +2979;1;9;275;0;RGRRGGGDA0000 +2980;1;9;285;0 +2981;1;9;295;0;RGRRAGGDA0000 +2982;1;9;305;0;RGRRAAGDA0000 +2983;1;9;315;0 +2984;1;9;325;0 +2985;1;9;335;0;RGRRRRGDA0000 +2986;1;9;345;0 +2987;1;9;355;0;RGGRRRGGA0000 +2988;1;9;365;0 +2989;1;9;375;0 +2990;1;9;385;0 +2991;1;9;395;0;RRGRRRDGA0000 +2992;1;9;405;0 +2993;1;9;415;0 +2994;1;9;425;0 +2995;1;9;435;0 +2996;1;9;445;0 +2997;1;9;455;0 +2998;1;9;465;0 +2999;1;9;475;0;RRRRRRDDA0000 +3000;1;9;485;0 +3001;1;9;495;0;RRRRRRDDA0000 +3002;1;9;505;0 +3003;1;9;515;0;SRRRRRDDA0000 +3004;1;9;525;0;GRRGRRDDA0000 +3005;1;9;535;0 +3006;1;9;545;0 +3007;1;9;555;0 +3008;1;9;565;0 +3009;1;9;575;0 +3010;1;9;585;0 +3011;1;9;595;0;GRRGRSDDA0000 +3012;1;9;605;0;GRRGGGDDA0000 +3013;1;9;615;0 +3014;1;9;625;0 +3015;1;9;635;0 +3016;1;9;645;0 +3017;1;9;655;0 +3018;1;9;665;0 +3019;1;9;675;0 +3020;1;9;685;0 +3021;1;9;695;0;GRRGGGDDA0000 +3022;1;9;5;0 +3023;1;9;15;0 +3024;1;9;25;0 +3025;1;9;35;0 +3026;1;9;45;0 +3027;1;9;55;0 +3028;1;9;65;0 +3029;1;9;75;0 +3030;1;9;85;0 +3031;1;9;95;0;GRRGGGDDA0000 +3032;1;9;105;0 +3033;1;9;115;0 +3034;1;9;125;0 +3035;1;9;135;0 +3036;1;9;145;0 +3037;1;9;155;0 +3038;1;9;165;0 +3039;1;9;175;0 +3040;1;9;185;0 +3041;1;9;195;0;GRRGGGDDA0000 +3042;1;9;205;0 +3043;1;9;215;0;GRRAGGDDA0000 +3044;1;9;225;0;ARRAGGDDA0000 +3045;1;9;235;0 +3046;1;9;245;0 +3047;1;9;255;0;RRRRGGDDA0000 +3048;1;9;265;0 +3049;1;9;275;0;RGRRGGGDA0000 +3050;1;9;285;0 +3051;1;9;295;0;RGRRAGGDA0000 +3052;1;9;305;0;RGRRAAGDA0000 +3053;1;9;315;0 +3054;1;9;325;0 +3055;1;9;335;0;RGRRRRGDA0000 +3056;1;9;345;0 +3057;1;9;355;0;RGGRRRGGA0000 +3058;1;9;365;0 +3059;1;9;375;0 +3060;1;9;385;0 +3061;1;9;395;0;RRGRRRDGA0000 +3062;1;9;405;0 +3063;1;9;415;0 +3064;1;9;425;0 +3065;1;9;435;0 +3066;1;9;445;0 +3067;1;9;455;0 +3068;1;9;465;0 +3069;1;9;475;0;RRRRRRDDA0000 +3070;1;9;485;0 +3071;1;9;495;0;RRRRRRDDA0000 +3072;1;9;505;0 +3073;1;9;515;0;SRRRRRDDA0000 +3074;1;9;525;0;GRRGRRDDA0000 +3075;1;9;535;0 +3076;1;9;545;0 +3077;1;9;555;0 +3078;1;9;565;0 +3079;1;9;575;0 +3080;1;9;585;0 +3081;1;9;595;0;GRRGRSDDA0000 +3082;1;9;605;0;GRRGGGDDA0000 +3083;1;9;615;0 +3084;1;9;625;0 +3085;1;9;635;0 +3086;1;9;645;0 +3087;1;9;655;0 +3088;1;9;665;0 +3089;1;9;675;0 +3090;1;9;685;0 +3091;1;9;695;0;GRRGGGDDA0000 +3092;1;9;5;0 +3093;1;9;15;0 +3094;1;9;25;0 +3095;1;9;35;0 +3096;1;9;45;0 +3097;1;9;55;0 +3098;1;9;65;0 +3099;1;9;75;0 +3100;1;9;85;0 +3101;1;9;95;0;GRRGGGDDA0000 +3102;1;9;105;0 +3103;1;9;115;0 +3104;1;9;125;0 +3105;1;9;135;0 +3106;1;9;145;0 +3107;1;9;155;0 +3108;1;9;165;0 +3109;1;9;175;0 +3110;1;9;185;0 +3111;1;9;195;0;GRRGGGDDA0000 +3112;1;9;205;0 +3113;1;9;215;0;GRRAGGDDA0000 +3114;1;9;225;0;ARRAGGDDA0000 +3115;1;9;235;0 +3116;1;9;245;0 +3117;1;9;255;0;RRRRGGDDA0000 +3118;1;9;265;0 +3119;1;9;275;0;RGRRGGGDA0000 +3120;1;9;285;0 +3121;1;9;295;0;RGRRAGGDA0000 +3122;1;9;305;0;RGRRAAGDA0000 +3123;1;9;315;0 +3124;1;9;325;0 +3125;1;9;335;0;RGRRRRGDA0000 +3126;1;9;345;0 +3127;1;9;355;0;RGGRRRGGA0000 +3128;1;9;365;0 +3129;1;9;375;0 +3130;1;9;385;0 +3131;1;9;395;0;RRGRRRDGA0000 +3132;1;9;405;0 +3133;1;9;415;0 +3134;1;9;425;0 +3135;1;9;435;0 +3136;1;9;445;0 +3137;1;9;455;0 +3138;1;9;465;0 +3139;1;9;475;0;RRRRRRDDA0000 +3140;1;9;485;0 +3141;1;9;495;0;RRRRRRDDA0000 +3142;1;9;505;0 +3143;1;9;515;0;SRRRRRDDA0000 +3144;1;9;525;0;GRRGRRDDA0000 +3145;1;9;535;0 +3146;1;9;545;0 +3147;1;9;555;0 +3148;1;9;565;0 +3149;1;9;575;0 +3150;1;9;585;0 +3151;1;9;595;0;GRRGRSDDA0000 +3152;1;9;605;0;GRRGGGDDA0000 +3153;1;9;615;0 +3154;1;9;625;0 +3155;1;9;635;0 +3156;1;9;645;0 +3157;1;9;655;0 +3158;1;9;665;0 +3159;1;9;675;0 +3160;1;9;685;0 +3161;1;9;695;0;GRRGGGDDA0000 +3162;1;9;5;0 +3163;1;9;15;0 +3164;1;9;25;0 +3165;1;9;35;0 +3166;1;9;45;0 +3167;1;9;55;0 +3168;1;9;65;0 +3169;1;9;75;0 +3170;1;9;85;0 +3171;1;9;95;0;GRRGGGDDA0000 +3172;1;9;105;0 +3173;1;9;115;0 +3174;1;9;125;0 +3175;1;9;135;0 +3176;1;9;145;0 +3177;1;9;155;0 +3178;1;9;165;0 +3179;1;9;175;0 +3180;1;9;185;0 +3181;1;9;195;0;GRRGGGDDA0000 +3182;1;9;205;0 +3183;1;9;215;0;GRRAGGDDA0000 +3184;1;9;225;0;ARRAGGDDA0000 +3185;1;9;235;0 +3186;1;9;245;0 +3187;1;9;255;0;RRRRGGDDA0000 +3188;1;9;265;0 +3189;1;9;275;0;RGRRGGGDA0000 +3190;1;9;285;0 +3191;1;9;295;0;RGRRAGGDA0000 +3192;1;9;305;0;RGRRAAGDA0000 +3193;1;9;315;0 +3194;1;9;325;0 +3195;1;9;335;0;RGRRRRGDA0000 +3196;1;9;345;0 +3197;1;9;355;0;RGGRRRGGA0000 +3198;1;9;365;0 +3199;1;9;375;0 +3200;1;9;385;0 +3201;1;9;395;0;RRGRRRDGA0000 +3202;1;9;405;0 +3203;1;9;415;0 +3204;1;9;425;0 +3205;1;9;435;0 +3206;1;9;445;0 +3207;1;9;455;0 +3208;1;9;465;0 +3209;1;9;475;0;RRRRRRDDA0000 +3210;1;9;485;0 +3211;1;9;495;0;RRRRRRDDA0000 +3212;1;9;505;0 +3213;1;9;515;0;SRRRRRDDA0000 +3214;1;9;525;0;GRRGRRDDA0000 +3215;1;9;535;0 +3216;1;9;545;0 +3217;1;9;555;0 +3218;1;9;565;0 +3219;1;9;575;0 +3220;1;9;585;0 +3221;1;9;595;0;GRRGRSDDA0000 +3222;1;9;605;0;GRRGGGDDA0000 +3223;1;9;615;0 +3224;1;9;625;0 +3225;1;9;635;0 +3226;1;9;645;0 +3227;1;9;655;0 +3228;1;9;665;0 +3229;1;9;675;0 +3230;1;9;685;0 +3231;1;9;695;0;GRRGGGDDA0000 +3232;1;9;5;0 +3233;1;9;15;0 +3234;1;9;25;0 +3235;1;9;35;0 +3236;1;9;45;0 +3237;1;9;55;0 +3238;1;9;65;0 +3239;1;9;75;0 +3240;1;9;85;0 +3241;1;9;95;0;GRRGGGDDA0000 +3242;1;9;105;0 +3243;1;9;115;0 +3244;1;9;125;0 +3245;1;9;135;0 +3246;1;9;145;0 +3247;1;9;155;0 +3248;1;9;165;0 +3249;1;9;175;0 +3250;1;9;185;0 +3251;1;9;195;0;GRRGGGDDA0000 +3252;1;9;205;0 +3253;1;9;215;0;GRRAGGDDA0000 +3254;1;9;225;0;ARRAGGDDA0000 +3255;1;9;235;0 +3256;1;9;245;0 +3257;1;9;255;0;RRRRGGDDA0000 +3258;1;9;265;0 +3259;1;9;275;0;RGRRGGGDA0000 +3260;1;9;285;0 +3261;1;9;295;0;RGRRAGGDA0000 +3262;1;9;305;0;RGRRAAGDA0000 +3263;1;9;315;0 +3264;1;9;325;0 +3265;1;9;335;0;RGRRRRGDA0000 +3266;1;9;345;0 +3267;1;9;355;0;RGGRRRGGA0000 +3268;1;9;365;0 +3269;1;9;375;0 +3270;1;9;385;0 +3271;1;9;395;0;RRGRRRDGA0000 +3272;1;9;405;0 +3273;1;9;415;0 +3274;1;9;425;0 +3275;1;9;435;0 +3276;1;9;445;0 +3277;1;9;455;0 +3278;1;9;465;0 +3279;1;9;475;0;RRRRRRDDA0000 +3280;1;9;485;0 +3281;1;9;495;0;RRRRRRDDA0000 +3282;1;9;505;0 +3283;1;9;515;0;SRRRRRDDA0000 +3284;1;9;525;0;GRRGRRDDA0000 +3285;1;9;535;0 +3286;1;9;545;0 +3287;1;9;555;0 +3288;1;9;565;0 +3289;1;9;575;0 +3290;1;9;585;0 +3291;1;9;595;0;GRRGRSDDA0000 +3292;1;9;605;0;GRRGGGDDA0000 +3293;1;9;615;0 +3294;1;9;625;0 +3295;1;9;635;0 +3296;1;9;645;0 +3297;1;9;655;0 +3298;1;9;665;0 +3299;1;9;675;0 +3300;1;9;685;0 +3301;1;9;695;0;GRRGGGDDA0000 +3302;1;9;5;0 +3303;1;9;15;0 +3304;1;9;25;0 +3305;1;9;35;0 +3306;1;9;45;0 +3307;1;9;55;0 +3308;1;9;65;0 +3309;1;9;75;0 +3310;1;9;85;0 +3311;1;9;95;0;GRRGGGDDA0000 +3312;1;9;105;0 +3313;1;9;115;0 +3314;1;9;125;0 +3315;1;9;135;0 +3316;1;9;145;0 +3317;1;9;155;0 +3318;1;9;165;0 +3319;1;9;175;0 +3320;1;9;185;0 +3321;1;9;195;0;GRRGGGDDA0000 +3322;1;9;205;0 +3323;1;9;215;0;GRRAGGDDA0000 +3324;1;9;225;0;ARRAGGDDA0000 +3325;1;9;235;0 +3326;1;9;245;0 +3327;1;9;255;0;RRRRGGDDA0000 +3328;1;9;265;0 +3329;1;9;275;0;RGRRGGGDA0000 +3330;1;9;285;0 +3331;1;9;295;0;RGRRAGGDA0000 +3332;1;9;305;0;RGRRAAGDA0000 +3333;1;9;315;0 +3334;1;9;325;0 +3335;1;9;335;0;RGRRRRGDA0000 +3336;1;9;345;0 +3337;1;9;355;0;RGGRRRGGA0000 +3338;1;9;365;0 +3339;1;9;375;0 +3340;1;9;385;0 +3341;1;9;395;0;RRGRRRDGA0000 +3342;1;9;405;0 +3343;1;9;415;0 +3344;1;9;425;0 +3345;1;9;435;0 +3346;1;9;445;0 +3347;1;9;455;0;RRGRRRDGA0000 +3348;1;9;465;0;RRGRRRDGA0000 +3349;1;9;475;0;RRRRRRDDA0000 +3350;1;9;485;0 +3351;1;9;495;0;RRRRRRDDA0000 +3352;1;9;505;0 +3353;1;9;515;0;SRRRRRDDA0000 +3354;1;9;525;0;GRRGRRDDA0000 +3355;1;9;535;0 +3356;1;9;545;0 +3357;1;9;555;0 +3358;1;9;565;0 +3359;1;9;575;0 +3360;1;9;585;0 +3361;1;9;595;0;GRRGRSDDA0000 +3362;1;9;605;0;GRRGGGDDA0000 +3363;1;9;615;0 +3364;1;9;625;0 +3365;1;9;635;0 +3366;1;9;645;0 +3367;1;9;655;0 +3368;1;9;665;0 +3369;1;9;675;0 +3370;1;9;685;0 +3371;1;9;695;0;GRRGGGDDA0000 +3372;1;9;5;0 +3373;1;9;15;0 +3374;1;9;25;0 +3375;1;9;35;0 +3376;1;9;45;0 +3377;1;9;55;0 +3378;1;9;65;0 +3379;1;9;75;0 +3380;1;9;85;0 +3381;1;9;95;0;GRRGGGDDA0000 +3382;1;9;105;0 +3383;1;9;115;0 +3384;1;9;125;0 +3385;1;9;135;0 +3386;1;9;145;0 +3387;1;9;155;0 +3388;1;9;165;0 +3389;1;9;175;0 +3390;1;9;185;0 +3391;1;9;195;0;GRRGGGDDA0000 +3392;1;9;205;0 +3393;1;9;215;0;GRRAGGDDA0000 +3394;1;9;225;0;ARRAGGDDA0000 +3395;1;9;235;0 +3396;1;9;245;0 +3397;1;9;255;0;RRRRGGDDA0000 +3398;1;9;265;0 +3399;1;9;275;0;RGRRGGGDA0000 +3400;1;9;285;0 +3401;1;9;295;0;RGRRAGGDA0000 +3402;1;9;305;0;RGRRAAGDA0000 +3403;1;9;315;0 +3404;1;9;325;0 +3405;1;9;335;0;RGRRRRGDA0000 +3406;1;9;345;0 +3407;1;9;355;0;RGGRRRGGA0000 +3408;1;9;365;0 +3409;1;9;375;0 +3410;1;9;385;0 +3411;1;9;395;0;RRGRRRDGA0000 +3412;1;9;405;0 +3413;1;9;415;0 +3414;1;9;425;0 +3415;1;9;435;0 +3416;1;9;445;0 +3417;1;9;455;0 +3418;1;9;465;0 +3419;1;9;475;0;RRRRRRDDA0000 +3420;1;9;485;0 +3421;1;9;495;0;RRRRRRDDA0000 +3422;1;9;505;0 +3423;1;9;515;0;SRRRRRDDA0000 +3424;1;9;525;0;GRRGRRDDA0000 +3425;1;9;535;0 +3426;1;9;545;0 +3427;1;9;555;0 +3428;1;9;565;0 +3429;1;9;575;0 +3430;1;9;585;0 +3431;1;9;595;0;GRRGRSDDA0000 +3432;1;9;605;0;GRRGGGDDA0000 +3433;1;9;615;0 +3434;1;9;625;0 +3435;1;9;635;0 +3436;1;9;645;0 +3437;1;9;655;0 +3438;1;9;665;0 +3439;1;9;675;0 +3440;1;9;685;0 +3441;1;9;695;0;GRRGGGDDA0000 +3442;1;9;5;0 +3443;1;9;15;0 +3444;1;9;25;0 +3445;1;9;35;0 +3446;1;9;45;0 +3447;1;9;50;2 +3448;1;9;50;2 +3449;1;9;50;2 +3450;1;9;50;2 +3451;1;9;50;2;GRRGGGDDA0000 +3452;1;9;50;2 +3453;1;9;50;2 +3454;1;9;50;2 +3455;1;9;50;2 +3456;1;9;50;2 +3457;1;9;50;2 +3458;1;9;50;2 +3459;1;9;50;2 +3460;1;9;50;2 +3461;1;9;50;2;GRRGGGDDA0000 +3462;1;9;50;2 +3463;1;9;50;2 +3464;1;9;50;2 +3465;1;9;50;2 +3466;1;9;50;2 +3467;1;9;50;2 +3468;1;9;50;2 +3469;1;9;50;2 +3470;1;9;50;2 +3471;1;9;50;2;GRRGGGDDA0000 +3472;1;9;50;2 +3473;1;9;50;2 +3474;1;9;50;2 +3475;1;9;50;2 +3476;1;9;50;2 +3477;1;9;50;2 +3478;1;9;50;2 +3479;1;9;50;2 +3480;1;9;50;2 +3481;1;9;50;2;GRRGGGDDA0000 +3482;1;9;50;2 +3483;1;9;50;2 +3484;1;9;50;2 +3485;1;9;50;2 +3486;1;9;50;2 +3487;1;9;50;2 +3488;1;9;50;2 +3489;1;9;50;2 +3490;1;9;50;2 +3491;1;9;50;2;GRRGGGDDA0000 +3492;1;9;50;2 +3493;1;9;50;2 +3494;1;9;50;2 +3495;1;9;50;2 +3496;1;9;50;2 +3497;1;9;50;2 +3498;1;9;50;2 +3499;1;9;50;2 +3500;1;9;50;2 +3501;1;9;50;2;GRRGGGDDA0000 +3502;1;9;50;2 +3503;1;9;50;2 +3504;1;9;50;2 +3505;1;9;50;2 +3506;1;9;50;2 +3507;1;9;50;2 +3508;1;9;50;2 +3509;1;9;50;2 +3510;1;9;50;2 +3511;1;9;50;2;GRRGGGDDA0000 +3512;1;9;50;2 +3513;1;9;50;2 +3514;1;9;50;0 +3515;1;9;60;0 +3516;1;9;70;0 +3517;1;9;80;0 +3518;1;9;90;0 +3519;1;9;100;0 +3520;1;9;110;0 +3521;1;9;120;0;GRRGGGDDA0000 +3522;1;9;130;0 +3523;1;9;140;0 +3524;1;9;150;0 +3525;1;9;160;0 +3526;1;9;170;0 +3527;1;9;180;0 +3528;1;9;190;0 +3529;1;9;200;0 +3530;1;9;210;0 +3531;1;9;220;0;GRRAGGDDA0000 +3532;1;9;230;0;ARRAGGDDA0000 +3533;1;9;240;0 +3534;1;9;250;0 +3535;1;9;260;0;RRRRGGDDA0000 +3536;1;9;270;0 +3537;1;9;280;0;RGRRGGGDA0000 +3538;1;9;290;0 +3539;1;9;300;0;RGRRAGGDA0000 +3540;1;9;310;0;RGRRAAGDA0000 +3541;1;9;320;0;RGRRAAGDA0000 +3542;1;9;330;0 +3543;1;9;340;0;RGRRRRGDA0000 +3544;1;9;350;0 +3545;1;9;360;0;RGGRRRGGA0000 +3546;1;9;370;0 +3547;1;9;380;0 +3548;1;9;390;0 +3549;1;9;400;0;RRGRRRDGA0000 +3550;1;9;410;0 +3551;1;9;420;0;RRGRRRDGA0000 +3552;1;9;430;0 +3553;1;9;440;0 +3554;1;9;450;0 +3555;1;9;460;0 +3556;1;9;470;0 +3557;1;9;480;0;RRRRRRDDA0000 +3558;1;9;490;0 +3559;1;9;500;0 +3560;1;9;510;0 +3561;1;9;520;0;SRRRRRDDA0000 +3562;1;9;530;0;GRRGRRDDA0000 +3563;1;9;540;0 +3564;1;9;550;0 +3565;1;9;560;0 +3566;1;9;570;0 +3567;1;9;580;0 +3568;1;9;590;0 +3569;1;9;600;0;GRRGRSDDA0000 +3570;1;9;610;0;GRRGGGDDA0000 +3571;1;9;620;0;GRRGGGDDA0000 +3572;1;9;630;0 +3573;1;9;640;0 +3574;1;9;650;0 +3575;1;9;660;0 +3576;1;9;670;0 +3577;1;9;680;0 +3578;1;9;690;0 +3579;1;9;0;0 +3580;1;9;10;0 +3581;1;9;20;0;GRRGGGDDA0000 +3582;1;9;30;0 +3583;1;9;40;0 +3584;1;9;50;0 +3585;1;9;60;0 +3586;1;9;70;0 +3587;1;9;80;0 +3588;1;9;90;0 +3589;1;9;100;0 +3590;1;9;110;0 +3591;1;9;120;0;GRRGGGDDA0000 +3592;1;9;130;0 +3593;1;9;140;0 +3594;1;9;150;0 +3595;1;9;160;0 +3596;1;9;170;0 +3597;1;9;180;0 +3598;1;9;190;0 +3599;1;9;200;0;GRRAGGDDA0000 +3600;1;9;210;0;ARRAGGDDA0000 diff --git a/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/BS1_TBA A 32 Schloßgraben_ Alexanderstraße_20110614_160000.TXT b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/BS1_TBA A 32 Schloßgraben_ Alexanderstraße_20110614_160000.TXT new file mode 100755 index 00000000..18baedcd Binary files /dev/null and b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/BS1_TBA A 32 Schloßgraben_ Alexanderstraße_20110614_160000.TXT differ diff --git a/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/Rilsa.pdf b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/Rilsa.pdf new file mode 100755 index 00000000..497165da Binary files /dev/null and b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/Rilsa.pdf differ diff --git a/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/Rilsa_Beispielsammlung.pdf b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/Rilsa_Beispielsammlung.pdf new file mode 100755 index 00000000..9e64f731 Binary files /dev/null and b/ws2012/Bachelor Thesis/Literatur/RiLSA_2010/Rilsa_Beispielsammlung.pdf differ