001    package com.thaiopensource.relaxng.impl;
002    
003    class MixedTextDerivFunction extends EndAttributesFunction {
004    
005      MixedTextDerivFunction(ValidatorPatternBuilder builder) {
006        super(builder);
007      }
008    
009      public Object caseText(TextPattern p) {
010        return p;
011      }
012    
013      public Object caseGroup(GroupPattern p) {
014        final Pattern p1 = p.getOperand1();
015        final Pattern p2 = p.getOperand2();
016        final Pattern q1 = memoApply(p1);
017        Pattern tem = (q1 == p1) ? p : getPatternBuilder().makeGroup(q1, p2);
018        if (!p1.isNullable())
019          return tem;
020        return getPatternBuilder().makeChoice(tem, memoApply(p2));
021      }
022    
023      public Object caseInterleave(InterleavePattern p) {
024        final Pattern p1 = p.getOperand1();
025        final Pattern p2 = p.getOperand2();
026        final Pattern q1 = memoApply(p1);
027        final Pattern q2 = memoApply(p2);
028        final Pattern i1 = (q1 == p1) ? p : getPatternBuilder().makeInterleave(q1, p2);
029        final Pattern i2 = (q2 == p2) ? p : getPatternBuilder().makeInterleave(p1, q2);
030        return getPatternBuilder().makeChoice(i1, i2);
031      }
032    
033      public Object caseOneOrMore(OneOrMorePattern p) {
034        return getPatternBuilder().makeGroup(memoApply(p.getOperand()),
035                                             getPatternBuilder().makeOptional(p));
036      }
037    
038      public Object caseOther(Pattern p) {
039        return getPatternBuilder().makeNotAllowed();
040      }
041    
042      PatternMemo apply(PatternMemo memo) {
043        return memo.mixedTextDeriv(this);
044      }
045    }