1 /* 2 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.xml.internal.rngom.binary; 27 28 import com.sun.xml.internal.rngom.binary.visitor.PatternFunction; 29 import com.sun.xml.internal.rngom.binary.visitor.PatternVisitor; 30 import org.xml.sax.Locator; 31 import org.xml.sax.SAXException; 32 33 public class ListPattern extends Pattern { 34 Pattern p; 35 Locator locator; 36 37 ListPattern(Pattern p, Locator locator) { 38 super(false, 39 DATA_CONTENT_TYPE, 40 combineHashCode(LIST_HASH_CODE, p.hashCode())); 41 this.p = p; 42 this.locator = locator; 43 } 44 45 Pattern expand(SchemaPatternBuilder b) { 46 Pattern ep = p.expand(b); 47 if (ep != p) 48 return b.makeList(ep, locator); 49 else 50 return this; 51 } 52 53 void checkRecursion(int depth) throws SAXException { 54 p.checkRecursion(depth); 55 } 56 57 boolean samePattern(Pattern other) { 58 return (other instanceof ListPattern 59 && p == ((ListPattern)other).p); 60 } 61 62 public void accept(PatternVisitor visitor) { 63 visitor.visitList(p); 64 } 65 66 public Object apply(PatternFunction f) { 67 return f.caseList(this); 68 } 69 70 void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha) 71 throws RestrictionViolationException { 72 switch (context) { 73 case DATA_EXCEPT_CONTEXT: 74 throw new RestrictionViolationException("data_except_contains_list"); 75 case START_CONTEXT: 76 throw new RestrictionViolationException("start_contains_list"); 77 case LIST_CONTEXT: 78 throw new RestrictionViolationException("list_contains_list"); 79 } 80 try { 81 p.checkRestrictions(LIST_CONTEXT, dad, null); 82 } 83 catch (RestrictionViolationException e) { 84 e.maybeSetLocator(locator); 85 throw e; 86 } 87 } 88 89 Pattern getOperand() { 90 return p; 91 } 92 }