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 }