/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" PLATFORM _ CLASS _ MAP PED _ TO _ K OT LIN ") Ċ Ċ package Ġandroid . arch . persistence . room . processor Ċ Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġandroid . arch . persistence . room . Insert Ċ import Ġandroid . arch . persistence . room . On Conflict Strategy . IGNORE Ċ import Ġandroid . arch . persistence . room . On Conflict Strategy . REPLACE Ċ import Ġandroid . arch . persistence . room . vo . Insertion Method Ċ import Ġandroid . arch . persistence . room . vo . Insertion Method . Type Ċ import Ġandroid . arch . persistence . room . vo . Shortcut QueryParameter Ċ import Ġcom . google . auto . common . More Types Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . lang . model . type . Type Kind Ċ import Ġjavax . lang . model . type . Type Kind . LONG Ċ import Ġjavax . lang . model . type . Type Kind . VOID Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ class ĠInsert ion Method Processor ( base Context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining : ĠDecl ared Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutable Element : ĠExec utable Element ) Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= Ġbase Context . fork ( executable Element ) ĊĠĠĠ Ġfun Ġprocess (): ĠInsert ion Method Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= ĠShort cut Method Processor ( context , Ġcontaining , Ġexecutable Element ) ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġdelegate . extract Annotation ( Insert :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessor Errors . MISSING _ INSERT _ AN NOT ATION ) ĊĊĠĠĠĠĠĠĠ Ġval Ġon Conflict Ġ= ĠOn Conflict Processor . extract From ( annotation ) ĊĠĠĠĠĠĠĠ Ġcontext . checker . check ( on Conflict Ġ<= ĠIG NORE Ġ&& Ġon Conflict Ġ>= ĠREPLACE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutable Element , ĠProcessor Errors . INVALID _ ON _ CONF LI CT _ VALUE ) ĊĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġdelegate . extract ReturnType () ĊĠĠĠĠĠĠĠ Ġval Ġreturn TypeName Ġ= ĠType Name . get ( returnType ) ĊĠĠĠĠĠĠĠ Ġcontext . checker . not Un bound ( return TypeName , Ġexecutable Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessor Errors . CAN NOT _ USE _ UN BOUND _ GENER ICS _ IN _ INSERT ION _ METHO DS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( entities , Ġparams ) Ġ= Ġdelegate . extract Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Param Error Ġ= ĠProcessor Errors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. INSERT ION _ DO ES _ NOT _ HAVE _ ANY _ PARAMETERS _ TO _ INSERT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġwe Ġcan Ġsupport Ġmore Ġtypes ĊĠĠĠĠĠĠĠ Ġvar Ġinsertion Type Ġ= Ġget Insertion Type ( returnType ) ĊĠĠĠĠĠĠĠ Ġcontext . checker . check ( insertion Type Ġ!= Ġnull , Ġexecutable Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessor Errors . INVALID _ INSERT ION _ METHOD _ RETURN _ TYPE ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( insertion Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacceptable Ġ= Ġacceptable Types ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insertion Type Ġ! in Ġacceptable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . logger . e ( executable Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessor Errors . insertion Method ReturnType Mismatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsertion Type . return TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacceptable . map Ġ{ Ġit . return TypeName Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclear Ġit , Ġno Ġreason Ġto Ġgenerate Ġcode Ġfor Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsertion Type Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠInsert ion Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġexecutable Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġexecutable Element . simple Name . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities Ġ= Ġentities , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Conflict Ġ= Ġon Conflict , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsertion Type Ġ= Ġinsertion Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" PLATFORM _ CLASS _ MAP PED _ TO _ K OT LIN ") ĊĠĠĠ Ġprivate Ġfun Ġget Insertion Type ( returnType : ĠType Mirror ): ĠInsert ion Method . Type ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġwe Ġneed Ġto Ġsupport Ġmore Ġtypes Ġhere . ĊĠĠĠĠĠĠĠ Ġfun Ġis Long Primitive Type ( type Mirror : ĠType Mirror ) Ġ= Ġtype Mirror . kind Ġ== ĠLONG ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Long Box Type ( type Mirror : ĠType Mirror ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMore Types . is Type ( type Mirror ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMore Types . is TypeOf ( java . lang . Long :: class . java , Ġtype Mirror ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Long Type ( type Mirror : ĠType Mirror ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Long Primitive Type ( type Mirror ) Ġ|| Ġis Long Box Type ( type Mirror ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( returnType . kind Ġ== ĠVOID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . INSERT _ VOID ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( returnType . kind Ġ== ĠType Kind . ARRAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Type Ġ= ĠMore Types . as Array ( returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġarray Type . component Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Long Primitive Type ( param )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . INSERT _ ID _ ARRAY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Long Box Type ( param )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . INSERT _ ID _ ARRAY _ BOX ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( More Types . is Type ( returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠMore Types . is TypeOf ( List :: class . java , ĠreturnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclared Ġ= ĠMore Types . as Declared ( returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġdeclared . type Arguments . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Long Box Type ( param )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . INSERT _ ID _ LIST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Long Type ( returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . INSERT _ SINGLE _ ID ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġval ĠVOID _ SET Ġby Ġlazy Ġ{ Ġset Of ( Type . INSERT _ VOID ) Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġval ĠS INGLE _ ITEM _ SET Ġby Ġlazy Ġ{ Ġset Of ( Type . INSERT _ VOID , ĠType . INSERT _ SINGLE _ ID ) Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġval ĠMULTI PLE _ ITEM _ SET Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( Type . INSERT _ VOID , ĠType . INSERT _ ID _ ARRAY , ĠType . INSERT _ ID _ ARRAY _ BOX , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . INSERT _ ID _ LIST ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġacceptable Types ( params Ġ: ĠList < Shortcut QueryParameter >) Ġ: ĠSet < Insertion Method . Type > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVOID _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVOID _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . first (). is Multiple ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMULTI PLE _ ITEM _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS INGLE _ ITEM _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ