/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠFlip k art ĠInternet ĠP vt ĠLtd Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ package Ġcom . flip k art . mad man . parser Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġcom . flip k art . mad man . component . model . v ast . V AST Data Ċ import Ġcom . flip k art . mad man . component . model . v map . Ad Break Ċ import Ġcom . flip k art . mad man . component . model . v map . Ad Source Ċ import Ġcom . flip k art . mad man . component . model . v map . V MAP Data Ċ import Ġcom . flip k art . mad man . parser . exception . Parser Exception Ċ import Ġcom . flip k art . mad man . parser . helper . Parser ErrorCode Ċ import Ġcom . flip k art . mad man . parser . helper . Xml Parser Helper Ċ import Ġcom . flip k art . mad man . parser . helper . Xml Parser Helper . skip Ċ import Ġorg . xml pull . v 1 . Xml Pull Parser Ċ import Ġorg . xml pull . v 1 . Xml Pull Parser Exception Ċ import Ġjava . io . IOException Ċ import Ġjava . io . String Reader Ċ import Ġjava . util . concurrent . Executor Ċ Ċ /** Ċ Ġ* ĠThe Ġdefault Ġparser Ġclass Ġdeleg ates Ġthe Ġparsing Ġof ĠV MAP Ġand ĠV AST Ġto Ġtheir Ġrespective Ġparsers Ċ Ġ* Ċ Ġ* Ġ 1 . Ġ[ V MAP Parser ] Ġfor Ġ[ V MAP Data ] Ċ Ġ* Ġ 2 . Ġ[ V AST Parser ] Ġfor Ġ[ V AST Data ] Ċ Ġ* Ċ Ġ* ĠIt Ġallows Ġto Ġoverride Ġthe Ġimplementation Ġof Ġboth Ġthe Ġparsers Ġif Ġrequired . Ċ Ġ* Ċ Ġ* Ġ@ author Ġan ir ud hr aman an Ċ Ġ*/ Ċ class ĠXml Parser Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġpull Parser : ĠXml Pull Parser , ĊĠĠĠ Ġprivate Ġval Ġv map Parser : ĠParser < V MAP Data >, ĊĠĠĠ Ġprivate Ġval Ġvast Parser : ĠParser < V AST Data >, ĊĠĠĠ Ġprivate Ġval Ġhandler : ĠHandler , ĊĠĠĠ Ġprivate Ġval Ġexecutor : ĠExecutor Ċ ) Ġ{ ĊĊĠĠĠ Ġinterface ĠParser Listener < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġparsing Ġis Ġcomplete ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġon Ġmain Ġthread ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ MainThread ĊĠĠĠĠĠĠĠ Ġfun ĠonSuccess ( t : ĠT ?) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġparsing Ġfails ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġon Ġmain Ġthread ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ MainThread ĊĠĠĠĠĠĠĠ Ġfun Ġon Failure ( type : ĠInt , Ġmessage : ĠString ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse ( xml String : ĠString , Ġlistener : ĠParser Listener < V MAP Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** Ġexecute Ġon Ġbackground Ġthread Ġ**/ ĊĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġparse On Background Thread ( xml String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġpost Ġon Ġmain Ġthread Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Success ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParser Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġpost Ġon Ġmain Ġthread Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e . errorCode , Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġpost Ġon Ġmain Ġthread Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Parser ErrorCode . PAR SING _ ERROR , Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠXml Pull Parser Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġpost Ġon Ġmain Ġthread Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( Parser ErrorCode . PAR SING _ ERROR , Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġ@ Throws ( Parser Exception :: class , ĠIOException :: class , ĠXml Pull Parser Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġparse On Background Thread ( xml String : ĠString ): ĠV MAP Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġpull Parser . setInput ( String Reader ( xml String )) ĊĠĠĠĠĠĠĠ Ġvar Ġevent Ġ= Ġpull Parser . eventType ĊĠĠĠĠĠĠĠ Ġwhile Ġ( event Ġ!= ĠXml Pull Parser . END _ DOCUMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠXml Pull Parser . START _ TAG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( pull Parser . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV MAP Data . V MAP _ XML _ TAG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġdelegate Ġto Ġ[ V MAP Parser ] Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv map Parser . parse ( xml String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV AST Data . V AST _ XML _ TAG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġdelegate Ġto Ġ[ V AST Parser ] Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvast Data Ġ= Ġvast Parser . parse ( xml String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwrap V AST In V MAP ( v ast Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip ( pull Parser ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġ= Ġpull Parser . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrap V AST In V MAP ( v ast Data : ĠV AST Data ?): ĠV MAP Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠV MAP Data () ĊĠĠĠĠĠĠĠ Ġdata . ad Break s Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Ad Break (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġad Source Ġ= ĠAd Source (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvast Ad Data Ġ= Ġvast Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġdata . version Ġ= Ġ" 1 . 0 " ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġpull Parser : ĠXml Pull Parser ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġv map Parser : ĠParser < V MAP Data >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġvast Parser : ĠParser < V AST Data >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Xml Pull Parser ( pull Parser : ĠXml Pull Parser ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pull Parser Ġ= Ġpull Parser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset V MAP Parser ( v map Parser : ĠParser < V MAP Data >): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . v map Parser Ġ= Ġv map Parser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset V AST Parser ( v ast Parser : ĠParser < V AST Data >): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . v ast Parser Ġ= Ġvast Parser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( handler : ĠHandler , Ġexecutor : ĠExecutor ): ĠXml Parser Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpull Parser Ġ= Ġpull Parser Ġ?: ĠXml Parser Helper . createNew Parser () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvast Parser Ġ= Ġvast Parser Ġ?: ĠV AST Parser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpull Parser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv map Parser Ġ= Ġv map Parser Ġ?: ĠV MAP Parser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpull Parser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvast Parser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠXml Parser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpull Parser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv map Parser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvast Parser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ