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 }