001    package com.thaiopensource.relaxng.impl;
002    
003    class EndTagDerivFunction extends AbstractPatternFunction {
004      private final ValidatorPatternBuilder builder;
005    
006      EndTagDerivFunction(ValidatorPatternBuilder builder) {
007        this.builder = builder;
008      }
009    
010      public Object caseOther(Pattern p) {
011        return builder.makeNotAllowed();
012      }
013    
014      public Object caseChoice(ChoicePattern p) {
015        return builder.makeChoice(memoApply(p.getOperand1()),
016                                  memoApply(p.getOperand2()));
017      }
018    
019      public Object caseAfter(AfterPattern p) {
020        if (p.getOperand1().isNullable())
021          return p.getOperand2();
022        else
023          return builder.makeNotAllowed();
024      }
025    
026      final private Pattern memoApply(Pattern p) {
027        return apply(builder.getPatternMemo(p)).getPattern();
028      }
029    
030      private PatternMemo apply(PatternMemo memo) {
031        return memo.endTagDeriv(this);
032      }
033    }