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    }