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 }