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 }