001    package com.thaiopensource.relaxng.impl;
002    
003    import org.xml.sax.SAXException;
004    
005    class OneOrMorePattern extends Pattern {
006      private final Pattern p;
007    
008      OneOrMorePattern(Pattern p) {
009        super(p.isNullable(),
010              p.getContentType(),
011              combineHashCode(ONE_OR_MORE_HASH_CODE, p.hashCode()));
012        this.p = p;
013      }
014    
015      Pattern expand(SchemaPatternBuilder b) {
016        Pattern ep = p.expand(b);
017        if (ep != p)
018          return b.makeOneOrMore(ep);
019        else
020          return this;
021      }
022    
023      void checkRecursion(int depth) throws SAXException {
024        p.checkRecursion(depth);
025      }
026    
027      void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha)
028        throws RestrictionViolationException {
029        switch (context) {
030        case START_CONTEXT:
031          throw new RestrictionViolationException("start_contains_one_or_more");
032        case DATA_EXCEPT_CONTEXT:
033          throw new RestrictionViolationException("data_except_contains_one_or_more");
034        }
035        
036        p.checkRestrictions(context == ELEMENT_CONTEXT
037                            ? ELEMENT_REPEAT_CONTEXT
038                            : context,
039                            dad,
040                            alpha);
041        if (context != LIST_CONTEXT
042            && !contentTypeGroupable(p.getContentType(), p.getContentType()))
043          throw new RestrictionViolationException("one_or_more_string");
044      }
045    
046      boolean samePattern(Pattern other) {
047        return (other instanceof OneOrMorePattern
048                && p == ((OneOrMorePattern)other).p);
049      }
050    
051      void accept(PatternVisitor visitor) {
052        visitor.visitOneOrMore(p);
053      }
054    
055      Object apply(PatternFunction f) {
056        return f.caseOneOrMore(this);
057      }
058    
059      Pattern getOperand() {
060        return p;
061      }
062    }