/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 5 - 2 0 2 1 ĠHall in ĠInformation ĠTechnology ĠAB Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġio . code kv ast . int ake . file _ import . impl Ċ Ċ import Ġio . code kv ast . common . logging . Logger Delegate Ċ import Ġlombok . Required ArgsConstructor Ċ import Ġlombok . extern . slf 4 j . Slf 4 j Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . regex . Pattern Syntax Exception Ċ import Ġjava . util . stream . Collectors Ċ Ċ /** Ġ@ author Ġol le . hall in @ cr isp . se Ċ Ġ*/ Ċ @ Component Ċ @ Required ArgsConstructor Ċ @ Slf 4 j Ċ class ĠSynt hetic Signature Service ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsynthetic Signature DAO : ĠSynt hetic Signature DAO Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfallback Synt hetic Signature Pattern Ġ= ĠPattern . compile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" .* (\\ $ \\ $ .* " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| \\ $ \\ w + \\ $ .* " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| \\ .[ A - Z 0 - 9 _ ]+ \\ (.* \\ )$ " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| \\ $[ a - z ]+ \\ (\\ )$ " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| \\. \\. anonfun \\ .. *" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| \\. \\ .( Enh ancer | Fast Class ) By Spring CG LIB \\. \\ .. *" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| \\. can Equal \\ ( java \\. lang \\. Object \\ )) " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġlogger Ġby ĠLogger Delegate () ĊĊĠĠĠ Ġprivate Ġvar Ġcompiled Patterns : ĠPattern ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpattern Hash Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġis Synt hetic Method ( signature : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompiled Pattern . matcher ( signature ). matches () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcompiled Pattern : ĠPattern ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Patterns Ġ= Ġsynthetic Signature DAO . synt hetic Patterns () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( db Patterns . hashCode () Ġ!= Ġpattern Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid Patterns Ġ= Ġvalidate Patterns ( db Patterns ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Patterns Ġ= Ġif Ġ( valid Patterns . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Found Ġno Ġvalid Ġsynthetic Ġsignature Ġpatterns , Ġusing Ġfallback ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfallback Synt hetic Signature Pattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Combin ing Ġ{} Ġpatterns Ġretrieved Ġfrom Ġthe Ġdatabase ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Patterns . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregexp Ġ= Ġvalid Patterns . stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Synt hetic Signature Pattern :: pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . join ing ("| ", Ġ" (", Ġ") ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ( regexp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern Hash Ġ= Ġdb Patterns . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompiled Patterns !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Patterns ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatterns : ĠList < Synt hetic Signature Pattern > ĊĠĠĠ Ġ): ĠList < Synt hetic Signature Pattern > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠMutable List < Synt hetic Signature Pattern > Ġ= ĠArrayList ( patterns ) ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġresult . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ( pattern . pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPattern Syntax Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġpattern Ġ'{} ': Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynthetic Signature DAO . reject Pattern ( pattern , Ġe . message !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }