package Ġorg . mit all ast . queue . cr dt . rest Ċ Ċ import Ġcom . google . inject . Inject Ċ import Ġio . netty . handler . codec . http . HttpMethod Ċ import Ġio . v avr . concurrent . Future Ċ import Ġio . v avr . control . Option Ċ import Ġorg . mit all ast . queue . cr dt . Cr dt Service Ċ import Ġorg . mit all ast . queue . cr dt . com mut ative . G Counter Ċ import Ġorg . mit all ast . queue . cr dt . routing . ResourceType Ċ import Ġorg . mit all ast . queue . rest . RestController Ċ Ċ class ĠRest G Counter Ġ@ Inject Ġconstructor ( controller : ĠRest Controller , Ġprivate Ġval Ġcr dt Service : ĠCr dt Service ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġid : ĠLong Ġ-> Ġthis . create ( id ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . param (). to Long (" id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). future Either ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). created (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). bad Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). handle ( HttpMethod . POST , ĠHttpMethod . PUT , Ġ"_ cr dt /{ id }/ g - counter ") ĊĊĠĠĠĠĠĠĠ Ġcontroller . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġid : ĠLong Ġ-> Ġthis . value ( id ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . param (). to Long (" id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). optional ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). handle ( HttpMethod . GET , Ġ"_ cr dt /{ id }/ g - counter / value ") ĊĊĠĠĠĠĠĠĠ Ġcontroller . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġid : ĠLong Ġ-> Ġthis . increment ( id ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . param (). to Long (" id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). optional ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). handle ( HttpMethod . POST , ĠHttpMethod . PUT , Ġ"_ cr dt /{ id }/ g - counter / increment ") ĊĊĠĠĠĠĠĠĠ Ġcontroller . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġid : ĠLong , Ġvalue : ĠLong Ġ-> Ġthis . add ( id , Ġvalue ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . param (). to Long (" id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . param (). to Long (" value "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). optional ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . response (). text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). handle ( HttpMethod . POST , ĠHttpMethod . PUT , Ġ"_ cr dt /{ id }/ g - counter / add ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ( id : ĠLong ): ĠFuture < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcr dt Service . add Resource ( id , ĠResource Type . G Counter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalue ( id : ĠLong ): ĠOption < Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġcr dt Service . bucket ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( bucket Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOption . none () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbucket . registry (). cr dt Opt ( id , ĠG Counter :: class . java ). map Ġ{ Ġit . value () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġincrement ( id : ĠLong ): ĠOption < Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġcr dt Service . bucket ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( bucket Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOption . none () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbucket . registry (). cr dt Opt ( id , ĠG Counter :: class . java ). map Ġ{ Ġit . increment () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd ( id : ĠLong , Ġvalue : ĠLong ): ĠOption < Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġcr dt Service . bucket ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( bucket Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOption . none () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbucket . registry (). cr dt Opt ( id , ĠG Counter :: class . java ). map Ġ{ Ġc Ġ-> Ġc . add ( value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ