001    package com.thaiopensource.relaxng.impl;
002    
003    import com.thaiopensource.xml.util.Name;
004    
005    class StartAttributeDerivFunction extends StartTagOpenDerivFunction {
006      StartAttributeDerivFunction(Name name, ValidatorPatternBuilder builder) {
007        super(name, builder);
008      }
009    
010      public Object caseElement(ElementPattern p) {
011        return getPatternBuilder().makeNotAllowed();
012      }
013    
014      public Object caseGroup(GroupPattern p) {
015        final Pattern p1 = p.getOperand1();
016        final Pattern p2 = p.getOperand2();
017        return getPatternBuilder().makeChoice(
018                                              memoApply(p1).applyForPattern(new ApplyAfterFunction(getPatternBuilder()) {
019                                                  Pattern apply(Pattern x) {
020                                                    return getPatternBuilder().makeGroup(x, p2);
021                                                  }
022                                                }),
023                                              memoApply(p2).applyForPattern(new ApplyAfterFunction(getPatternBuilder()) {
024                                                  Pattern apply(Pattern x) {
025                                                    return getPatternBuilder().makeGroup(p1, x);
026                                                  }
027                                                }));
028      }
029    
030      public Object caseAttribute(AttributePattern p) {
031        if (!p.getNameClass().contains(getName()))
032          return getPatternBuilder().makeNotAllowed();
033        return getPatternBuilder().makeAfter(p.getContent(),
034                                             getPatternBuilder().makeEmpty());
035      }
036    
037      PatternMemo apply(PatternMemo memo) {
038        return memo.startAttributeDeriv(this);
039      }
040    }