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 }