package Ġcom . l ug g soft . pml . core Ċ Ċ import Ġcom . l ug g soft . pml . Selector Ċ import Ġcom . l ug g soft . pml . core . ast . Deep Selector Element Ċ import Ġcom . l ug g soft . pml . core . ast . Expression Ċ import Ġcom . l ug g soft . pml . core . ast . Flat Selector Element Ċ import Ġcom . l ug g soft . pml . core . ast . Name Element Matcher Ċ import Ġcom . l ug g soft . pml . core . ast . Selector Element Ċ import Ġcom . l ug g soft . pml . core . ast . W ild Element Matcher Ċ import Ġcom . l ug g soft . pml . core . box ing . to Boolean Box Ċ import Ġcom . l ug g soft . pml . core . box ing . to Box Ċ import Ġcom . l ug g soft . pml . core . naming . NodeName Provider Ċ import Ġcom . l ug g soft . pml . core . naming . Un resolved NodeName Exception Ċ import Ġjava . util . Array Deque Ċ Ċ class ĠDefault Selector Evaluator ( ĊĠĠĠ Ġprivate Ġval ĠnodeName Provider : ĠNode Name Provider , ĊĠĠĠ Ġprivate Ġval Ġexpression Evaluator : ĠExpression Evaluator , ĊĠĠĠ Ġprivate Ġval Ġselector Formatter : ĠSelector Formatter , Ċ ) Ġ: ĠSelector Evaluator Ċ { ĊĠĠĠ Ġoverride Ġfun Ġ< T Node Ġ: ĠAny > Ġevaluate ( selector : ĠSelector , Ġnodes : ĠList < T Node >): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ@ formatter : off ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . evaluate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector . selector Elements . let (:: Array Deque ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnodes . let (:: Array Deque ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( exception : ĠException ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (" Failed Ġto Ġevaluate Ġthe Ġselector : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( this . selector Formatter . format Selector ( selector )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSelector Evaluation Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠstringBuilder . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcause Ġ= Ġexception , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ@ formatter : on ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Node Ġ: ĠAny > Ġevaluate ( selector Element Deque : ĠArray Deque < Selector Element >, Ġnode Deque : ĠArray Deque < T Node >): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( selector Element Deque . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode Deque . isEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġselector Element Ġ= Ġselector Element Deque . remove First ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFlat Selector Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Deque . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode Deque . remove First () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġelement Matcher Ġ= Ġselector Element . element Matcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠName Element Matcher Ġ-> Ġthis . evaluate Name Element Matcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Matcher Ġ= Ġelement Matcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ild Element Matcher Ġ-> Ġthis . evaluate W ild Element Matcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Matcher Ġ= Ġelement Matcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeep Selector Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġelement Matcher Ġ= Ġselector Element . element Matcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠName Element Matcher Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( node Deque . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode Deque . remove First () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . evaluate Name Element Matcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Matcher Ġ= Ġelement Matcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ild Element Matcher Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( node Deque . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode Deque . remove First () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . evaluate W ild Element Matcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Matcher Ġ= Ġelement Matcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Node Ġ: ĠAny > Ġevaluate W ild Element Matcher ( node : ĠT Node , Ġelement Matcher : ĠW ild Element Matcher , Ġselector Element Deque : ĠArray Deque < Selector Element >, Ġnode Deque : ĠArray Deque < T Node >): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġelement Matcher . expression ĊĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . evaluate Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġexpression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . evaluate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . evaluate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Node Ġ: ĠAny > Ġevaluate Name Element Matcher ( node : ĠT Node , Ġelement Matcher : ĠName Element Matcher , Ġselector Element Deque : ĠArray Deque < Selector Element >, Ġnode Deque : ĠArray Deque < T Node >): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnodeName Ġ= Ġthis . nodeName Provider . getNode Name ( node :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠUn resolved NodeName Exception (" Could Ġnot Ġresolve Ġnode Ġname Ġfor Ġnode Ġ${ node :: class }") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! nodeName . equals ( element Matcher . name , Ġignore Case Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġelement Matcher . expression ĊĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . evaluate Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġexpression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . evaluate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . evaluate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector Element Deque Ġ= Ġselector Element Deque . clone (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Deque Ġ= Ġnode Deque . clone (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Node Ġ: ĠAny > Ġevaluate Expression ( node : ĠT Node , Ġexpression : ĠExpression ): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Box Ġ= Ġnode . to Box () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . expression Evaluator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. evaluate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġexpression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Box Ġ= Ġnode Box , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Box Ġ= Ġnode Box , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Boolean Box () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ĊĠĠĠ Ġ} Ċ } ĊĊ