001 package com.thaiopensource.relaxng.impl; 002 003 import org.xml.sax.Locator; 004 import org.xml.sax.SAXException; 005 006 class ListPattern extends Pattern { 007 private final Pattern p; 008 private final Locator locator; 009 010 ListPattern(Pattern p, Locator locator) { 011 super(false, 012 DATA_CONTENT_TYPE, 013 combineHashCode(LIST_HASH_CODE, p.hashCode())); 014 this.p = p; 015 this.locator = locator; 016 } 017 018 Pattern expand(SchemaPatternBuilder b) { 019 Pattern ep = p.expand(b); 020 if (ep != p) 021 return b.makeList(ep, locator); 022 else 023 return this; 024 } 025 026 void checkRecursion(int depth) throws SAXException { 027 p.checkRecursion(depth); 028 } 029 030 boolean samePattern(Pattern other) { 031 return (other instanceof ListPattern 032 && p == ((ListPattern)other).p); 033 } 034 035 void accept(PatternVisitor visitor) { 036 visitor.visitList(p); 037 } 038 039 Object apply(PatternFunction f) { 040 return f.caseList(this); 041 } 042 043 void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) 044 throws RestrictionViolationException { 045 switch (context) { 046 case DATA_EXCEPT_CONTEXT: 047 throw new RestrictionViolationException("data_except_contains_list"); 048 case START_CONTEXT: 049 throw new RestrictionViolationException("start_contains_list"); 050 case LIST_CONTEXT: 051 throw new RestrictionViolationException("list_contains_list"); 052 } 053 try { 054 p.checkRestrictions(LIST_CONTEXT, dad, null); 055 } 056 catch (RestrictionViolationException e) { 057 e.maybeSetLocator(locator); 058 throw e; 059 } 060 } 061 062 Pattern getOperand() { 063 return p; 064 } 065 }