001 package com.thaiopensource.relaxng.impl; 002 003 class EndAttributesFunction extends AbstractPatternFunction { 004 private final ValidatorPatternBuilder builder; 005 006 EndAttributesFunction(ValidatorPatternBuilder builder) { 007 this.builder = builder; 008 } 009 010 public Object caseOther(Pattern p) { 011 return p; 012 } 013 014 public Object caseGroup(GroupPattern p) { 015 Pattern p1 = p.getOperand1(); 016 Pattern p2 = p.getOperand2(); 017 Pattern q1 = memoApply(p1); 018 Pattern q2 = memoApply(p2); 019 if (p1 == q1 && p2 == q2) 020 return p; 021 return builder.makeGroup(q1, q2); 022 } 023 024 public Object caseInterleave(InterleavePattern p) { 025 Pattern p1 = p.getOperand1(); 026 Pattern p2 = p.getOperand2(); 027 Pattern q1 = memoApply(p1); 028 Pattern q2 = memoApply(p2); 029 if (p1 == q1 && p2 == q2) 030 return p; 031 return builder.makeInterleave(q1, q2); 032 } 033 034 public Object caseChoice(ChoicePattern p) { 035 Pattern p1 = p.getOperand1(); 036 Pattern p2 = p.getOperand2(); 037 Pattern q1 = memoApply(p1); 038 Pattern q2 = memoApply(p2); 039 if (p1 == q1 && p2 == q2) 040 return p; 041 return builder.makeChoice(q1, q2); 042 } 043 044 public Object caseOneOrMore(OneOrMorePattern p) { 045 Pattern p1 = p.getOperand(); 046 Pattern q1 = memoApply(p1); 047 if (p1 == q1) 048 return p; 049 return builder.makeOneOrMore(p1); 050 } 051 052 public Object caseAfter(AfterPattern p) { 053 Pattern p1 = p.getOperand1(); 054 Pattern q1 = memoApply(p1); 055 if (p1 == q1) 056 return p; 057 return builder.makeAfter(q1, p.getOperand2()); 058 } 059 060 public Object caseAttribute(AttributePattern p) { 061 return builder.makeNotAllowed(); 062 } 063 064 final Pattern memoApply(Pattern p) { 065 return apply(builder.getPatternMemo(p)).getPattern(); 066 } 067 068 PatternMemo apply(PatternMemo memo) { 069 return memo.endAttributes(this); 070 } 071 072 ValidatorPatternBuilder getPatternBuilder() { 073 return builder; 074 } 075 }