001    package com.thaiopensource.relaxng.impl;
002    
003    class GroupPattern extends BinaryPattern {
004      GroupPattern(Pattern p1, Pattern p2) {
005        super(p1.isNullable() && p2.isNullable(),
006              combineHashCode(GROUP_HASH_CODE, p1.hashCode(), p2.hashCode()),
007              p1,
008              p2);
009      }
010    
011      Pattern expand(SchemaPatternBuilder b) {
012        Pattern ep1 = p1.expand(b);
013        Pattern ep2 = p2.expand(b);
014        if (ep1 != p1 || ep2 != p2)
015          return b.makeGroup(ep1, ep2);
016        else
017          return this;
018      }
019    
020      void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) throws RestrictionViolationException {
021        switch (context) {
022        case START_CONTEXT:
023          throw new RestrictionViolationException("start_contains_group");
024        case DATA_EXCEPT_CONTEXT:
025          throw new RestrictionViolationException("data_except_contains_group");
026        }
027        super.checkRestrictions(context == ELEMENT_REPEAT_CONTEXT
028                                ? ELEMENT_REPEAT_GROUP_CONTEXT
029                                : context,
030                                dad,
031                                alpha);
032        if (context != LIST_CONTEXT
033            && !contentTypeGroupable(p1.getContentType(), p2.getContentType()))
034          throw new RestrictionViolationException("group_string");
035      }
036    
037      void accept(PatternVisitor visitor) {
038        visitor.visitGroup(p1, p2);
039      }
040      Object apply(PatternFunction f) {
041        return f.caseGroup(this);
042      }
043    }