package Ġde . u ul m . se . co uched it . processing . graphic . services Ċ Ċ import Ġcom . google . inject . Inject Ċ import Ġcom . google . inject . Singleton Ċ import Ġde . u ul m . se . co uched it . model . base . Element Ċ import Ġde . u ul m . se . co uched it . model . base . Element Reference Ċ import Ġde . u ul m . se . co uched it . model . graphic . hot spot s . Line Fraction Hot Spot Definition Ċ import Ġde . u ul m . se . co uched it . model . graphic . shapes . Line Ċ import Ġde . u ul m . se . co uched it . model . graphic . shapes . Point Ċ import Ġde . u ul m . se . co uched it . processing . comp artment . services . Compartment Geometry Generator Ċ import Ġde . u ul m . se . co uched it . processing . hot spot . services . Hot Spot Provider Ċ import Ġde . u ul m . se . co uched it . processing . spatial . services . ge ometric . J TS Geometry Provider Ċ import Ġde . u ul m . se . co uched it . processing . spatial . services . ge ometric . Shape Extractor Ċ import Ġde . u ul m . se . co uched it . processing . spatial . services . ge ometric . Shape Provider Ċ import Ġde . u ul m . se . co uched it . util . collection . TTL Map Ċ import Ġde . u ul m . se . co uched it . util . extensions . get Typed Ċ import Ġorg . location tech . jts . linear ref . Length Indexed Line Ċ import Ġjava . util .* Ċ Ċ @ Singleton Ċ class ĠLine Fraction Hot Spot Provider Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġshape Extractor : ĠShape Extractor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġj ts Geometry Provider : ĠJ TS Geometry Provider Ċ ): ĠHot Spot Provider < Point , ĠLine Fraction Hot Spot Definition > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpoint Cache Ġ= ĠTTL Map < Int , ĠPoint >() ĊĊĠĠĠ Ġprivate Ġval Ġelement Cache Keys Ġ= Ġmutable Map Of < Element Reference <* >, ĠInt >() ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Shape ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh Ref : ĠElement Reference < Line Fraction Hot Spot Definition >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements : ĠMap < Element Reference <* >, ĠElement > ĊĠĠĠ Ġ): ĠPoint ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh sd Ġ= Ġelements . get Typed ( h Ref ) Ġ?: Ġthrow ĠIllegalArgumentException (" Elements Ġmap Ġmust Ġcontain Ġ$ h Ref ") ĊĊĠĠĠĠĠĠĠ Ġval Ġline Shape Ġ= Ġshape Extractor . extract Shape ( h sd . a , Ġelements ) Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ h sd . a } Ġdid Ġnot Ġprevent Ġa ĠLine !" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcache Key Ġ= Ġgenerate Cache Hash ( line Shape , Ġh sd . offset ) ĊĊĠĠĠĠĠĠĠ Ġval Ġold CacheKey Ġ= Ġelement Cache Keys [ h Ref ] ĊĠĠĠĠĠĠĠ Ġif ( old CacheKey Ġ!= Ġnull Ġ&& Ġold CacheKey Ġ!= Ġcache Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Cache . remove ( old CacheKey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelement Cache Keys [ h Ref ] Ġ= Ġcache Key ĊĊĠĠĠĠĠĠĠ Ġpoint Cache [ cacheKey ]?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgeometry Ġ= Ġj ts Geometry Provider . to Geometry ( line Shape , Ġh sd . a . id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġgeometry . geometry . length ĊĊĠĠĠĠĠĠĠ Ġval Ġindexed Line Ġ= ĠLength Indexed Line ( geometry . geometry ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpoint Geometry Ġ= Ġindexed Line . extract Point ( h sd . offset Ġ* Ġlength ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠPoint ( point Geometry . x , Ġpoint Geometry . y ) ĊĊĠĠĠĠĠĠĠ Ġpoint Cache . put ( cacheKey , point ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpoint ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Cache Hash ( line : ĠLine , Ġfraction : ĠDouble ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObjects . hash ( line , Ġfraction ) ĊĠĠĠ Ġ} Ċ } Ċ