package Ġorg . code p ond . ro omp ro vider . provider Ċ Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġorg . code p ond . ro omp ro vider . Context Ċ import Ġorg . code p ond . ro omp ro vider . contract . Contract Ċ import Ġorg . code p ond . ro omp ro vider . contract . Database Ċ import Ġorg . code p ond . ro omp ro vider . ext . Android Type Names Ċ import Ġorg . code p ond . ro omp ro vider . ext . get Package Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . util . Element Filter Ċ Ċ class ĠContent Provider Writer ( private Ġval Ġdatabase : ĠDatabase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontract : ĠContract , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĊĠĠĠ Ġfun Ġwrite () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( entity Ġin Ġdatabase . entities ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠType Spec . class Builder ("${ entity . name . capitalize ()} Content Provider "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( Modifier . PUBLIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuperclass ( Android Type Names . CONTENT _ PROVIDER ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Method ( Method Spec . method Builder (" onCreate ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Override :: class . java ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( TypeName . BOOLEAN ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġtrue ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Element Ġ= Ġcontext . processing Env . element Utils . getType Element ( Android Type Names . CONTENT _ PROVIDER . canonical Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= ĠElement Filter . methods In ( class Element . enc losed Elements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Provider Ġ= ĠClass Name . get ( database . element . get Package ( context ), Ġ"${ database . name . capitalize ()} Provider ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Contract Ġ= ĠClass Name . get ( database . element . get Package ( context ), Ġ"${ database . name . capitalize ()} Contract ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it . simple Name . toString ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" onCreate " Ġ-> Ġadd Method ( Method Spec . over riding ( it ). add Statement (" return Ġtrue "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" query " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . modifiers . contains ( Modifier . AB STR ACT )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Method ( Method Spec . over riding ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ("\ $ T Ġlocal Selection ", ClassName . get (" java . lang ", Ġ" String ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" switch Ġ(\ $ T . MATCH ER . match ( arg 0 )) {\ n ", database Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" case Ġ\$ T .${ entity . name . toUpperCase ()} _ ITEM :\ n ", database Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadd Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġentity . fields ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( field . primaryKey ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code (" local Selection Ġ= Ġ( \" ${ field . name } Ġ= Ġ\" Ġ+ Ġarg 0 . getLast Path Segment ()) Ġ+ Ġ( arg 2 == null Ġ|| Ġarg 2 . trim (). isEmpty () Ġ? Ġ\" \" Ġ: Ġ\" ĠAND Ġ\" + arg 2 );\ n ", Android Type Names . BASE _ COLUMNS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! add ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code (" local Selection Ġ= Ġ(\ $ T ._ ID Ġ+ Ġ\" Ġ= Ġ\" Ġ+ Ġarg 0 . getLast Path Segment ()) Ġ+ Ġ( arg 2 == null Ġ|| Ġarg 2 . trim (). isEmpty () Ġ? Ġ\" \" Ġ: Ġ\" ĠAND Ġ\" + arg 2 );\ n ", Android Type Names . BASE _ COLUMNS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" break ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" default :\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" local Selection Ġ= Ġarg 2 ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" break ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ("\ $ T Ġquery Builder Ġ= Ġ\$ T . builder (\ $ S )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Type Names . SUPPORT _ SQL ITE _ QUERY _ BUILDER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Type Names . SUPPORT _ SQL ITE _ QUERY _ BUILDER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" query Builder . columns ( arg 1 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" query Builder . selection ( local Selection , arg 3 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" query Builder . orderBy ( arg 4 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ("\ $ T Ġquery Ġ= Ġquery Builder . create ()", Android Type Names . SUPPORT _ SQL ITE _ QUERY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ("\ $ T Ġc Ġ= Ġ\$ T . Companion . get Db (). query ( query )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Type Names . CURSOR , ClassName . get ( database . element . get Package ( context ), Ġ"${ database . element . simple Name } ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġc "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getType " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Method ( Method Spec . over riding ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement ("\ $ T Ġvalue ", ClassName . get (" java . lang ", Ġ" String ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" switch Ġ(\ $ T . MATCH ER . match ( arg 0 )) {\ n ", database Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" case Ġ\$ T .${ entity . name . toUpperCase ()} _ ITEM :\ n ", database Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" value Ġ= Ġ\$ T .${ entity . name . capitalize ()}. CONTENT _ ITEM _ TYPE ;\ n ", database Contract ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" break ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" default :\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" value Ġ= Ġ\$ T .${ entity . name . capitalize ()}. CONTENT _ TYPE ;\ n ", database Contract ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" break ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġvalue "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" insert " Ġ-> Ġadd Method ( Method Spec . over riding ( it ). add Statement (" return Ġnull "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" delete " Ġ-> Ġadd Method ( Method Spec . over riding ( it ). add Statement (" return Ġ 0 "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" update " Ġ-> Ġadd Method ( Method Spec . over riding ( it ). add Statement (" return Ġ 0 "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠJava File . builder ( entity . element . get Package ( context ), Ġprovider . build ()). build (). writeTo ( context . processing Env . filer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġ} Ċ } Ċ