/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ġor Ġmore Ċ Ġ* Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ċ Ġ* Ġthis Ġwork Ġfor Ġadditional Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* ĠThe ĠASF Ġlicenses Ġthis Ġfile Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ċ Ġ* Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ċ Ġ* Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . apache . jmeter . threads . open model Ċ Ċ import Ġorg . apache . jmeter . threads . open model . Thread Schedule Step . Ar ri vals Step Ċ import Ġorg . apache . jmeter . threads . open model . Thread Schedule Step . Rate Step Ċ import Ġjava . util . Primitive Iterator Ċ import Ġjava . util . Random Ċ Ċ /** Ċ Ġ* ĠGenerates Ġtimestamps Ġfor Ġevents Ġaccording Ġto Ġthe Ġschedule . Ċ Ġ* ĠThe Ġresulting Ġtimestamps Ġare Ġin Ġseconds : Ġ` 0 .. total Duration `. Ċ Ġ*/ Ċ internal Ġclass ĠThread Schedule Process Generator ( ĊĠĠĠ Ġprivate Ġval Ġrandom : ĠRandom , ĊĠĠĠ Ġprivate Ġval Ġschedule : ĠThread Schedule Ċ ) Ġ: ĠPrimitive Iterator . Of Double Ġ{ ĊĠĠĠ Ġ// Ġposition Ġof ĠAr rival Step ĊĠĠĠ Ġprivate Ġvar Ġpos Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġval Ġpo isson R amp Ġ= ĠPo isson Ar ri vals R amp () ĊĠĠĠ Ġprivate Ġval Ġeven R amp Ġ= ĠEven Ar ri vals R amp () ĊĠĠĠ Ġprivate Ġvar Ġgen : ĠPrimitive Iterator . Of Double Ġ= Ġpo isson R amp ĊĊĠĠĠ Ġ// ĠThe Ġtimes Ġare Ġin Ġseconds ĊĠĠĠ Ġprivate Ġvar Ġtime Offset Ġ= Ġ 0 . 0 ĊĠĠĠ Ġprivate Ġvar Ġlast Duration Ġ= Ġ 0 . 0 ĊĠĠĠ Ġprivate Ġvar Ġbegin Rate Ġ= Ġ 0 . 0 ĊĠĠĠ Ġprivate Ġvar Ġend Rate Ġ= Ġ 0 . 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġar rival Step : ĠAr ri vals Step ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTotal Ġschedule Ġduration Ġin Ġseconds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtotal Duration Ġ= Ġschedule . steps . sum Of Ġ{ Ġ( it Ġas ? ĠAr ri vals Step )?. duration Ġ?: Ġ 0 . 0 Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Element Ġremoval Ġis Ġnot Ġsupported ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġtimestamp Ġof Ġthe Ġnext Ġevent Ġin Ġseconds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġnext Double (): ĠDouble Ġ= Ġtime Offset Ġ+ Ġgen . next Double () ĊĊĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ!= Ġ- 1 Ġ&& Ġgen . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Offset Ġ+= Ġlast Duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Duration Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġnext Ġar ri vals ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! find Next Arrival Step ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Duration Ġ= Ġar rival Step . duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġnext Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen Ġ= Ġwhen Ġ( arrival Step . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread Schedule Step . Arrival Type . E VEN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeven R amp . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare ( begin Rate Ġ= Ġbegin Rate , Ġend Rate Ġ= Ġend Rate , Ġduration Ġ= Ġlast Duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread Schedule Step . Arrival Type . RANDOM Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpo isson R amp . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare ( begin Rate Ġ= Ġbegin Rate , Ġend Rate Ġ= Ġend Rate , Ġduration Ġ= Ġlast Duration , Ġrandom Ġ= Ġrandom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! gen . hasNext ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Next Arrival Step (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsteps Ġ= Ġschedule . steps ĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġnext Ġbegin Rate Ġand Ġar rival Step ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ== Ġsteps . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġstep Ġ= Ġsteps [ pos ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRate Step Ġ-> Ġbegin Rate Ġ= Ġstep . rate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAr ri vals Step Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġar rival Step Ġ= Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġnext Ġstep Ġis ĠRate Step , Ġthen Ġtreat Ġit Ġas Ġthe Ġend Rate ĊĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġuse Ġend Rate == begin Rate ĊĠĠĠĠĠĠĠ Ġend Rate Ġ= Ġ( steps . get OrNull ( pos Ġ+ Ġ 1 ) Ġas ? ĠRate Step )?. rate Ġ?: Ġbegin Rate ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ