001: /*
002: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.xml.internal.rngom.binary;
027:
028: import com.sun.xml.internal.rngom.ast.om.ParsedPattern;
029: import com.sun.xml.internal.rngom.binary.visitor.PatternFunction;
030: import com.sun.xml.internal.rngom.binary.visitor.PatternVisitor;
031: import org.xml.sax.SAXException;
032:
033: public abstract class Pattern implements ParsedPattern {
034: private boolean nullable;
035: private int hc;
036: private int contentType;
037:
038: static final int TEXT_HASH_CODE = 1;
039: static final int ERROR_HASH_CODE = 3;
040: static final int EMPTY_HASH_CODE = 5;
041: static final int NOT_ALLOWED_HASH_CODE = 7;
042: static final int CHOICE_HASH_CODE = 11;
043: static final int GROUP_HASH_CODE = 13;
044: static final int INTERLEAVE_HASH_CODE = 17;
045: static final int ONE_OR_MORE_HASH_CODE = 19;
046: static final int ELEMENT_HASH_CODE = 23;
047: static final int VALUE_HASH_CODE = 27;
048: static final int ATTRIBUTE_HASH_CODE = 29;
049: static final int DATA_HASH_CODE = 31;
050: static final int LIST_HASH_CODE = 37;
051: static final int AFTER_HASH_CODE = 41;
052:
053: static int combineHashCode(int hc1, int hc2, int hc3) {
054: return hc1 * hc2 * hc3;
055: }
056:
057: static int combineHashCode(int hc1, int hc2) {
058: return hc1 * hc2;
059: }
060:
061: static final int EMPTY_CONTENT_TYPE = 0;
062: static final int ELEMENT_CONTENT_TYPE = 1;
063: static final int MIXED_CONTENT_TYPE = 2;
064: static final int DATA_CONTENT_TYPE = 3;
065:
066: Pattern(boolean nullable, int contentType, int hc) {
067: this .nullable = nullable;
068: this .contentType = contentType;
069: this .hc = hc;
070: }
071:
072: Pattern() {
073: this .nullable = false;
074: this .hc = hashCode();
075: this .contentType = EMPTY_CONTENT_TYPE;
076: }
077:
078: void checkRecursion(int depth) throws SAXException {
079: }
080:
081: Pattern expand(SchemaPatternBuilder b) {
082: return this ;
083: }
084:
085: /**
086: * Returns true if the pattern is nullable.
087: *
088: * <p>
089: * A pattern is nullable when it can match the empty sequence.
090: */
091: public final boolean isNullable() {
092: return nullable;
093: }
094:
095: boolean isNotAllowed() {
096: return false;
097: }
098:
099: static final int START_CONTEXT = 0;
100: static final int ELEMENT_CONTEXT = 1;
101: static final int ELEMENT_REPEAT_CONTEXT = 2;
102: static final int ELEMENT_REPEAT_GROUP_CONTEXT = 3;
103: static final int ELEMENT_REPEAT_INTERLEAVE_CONTEXT = 4;
104: static final int ATTRIBUTE_CONTEXT = 5;
105: static final int LIST_CONTEXT = 6;
106: static final int DATA_EXCEPT_CONTEXT = 7;
107:
108: void checkRestrictions(int context, DuplicateAttributeDetector dad,
109: Alphabet alpha) throws RestrictionViolationException {
110: }
111:
112: // Know that other is not null
113: abstract boolean samePattern(Pattern other);
114:
115: final int patternHashCode() {
116: return hc;
117: }
118:
119: final int getContentType() {
120: return contentType;
121: }
122:
123: boolean containsChoice(Pattern p) {
124: return this == p;
125: }
126:
127: public abstract void accept(PatternVisitor visitor);
128:
129: public abstract Object apply(PatternFunction f);
130:
131: // DPattern applyForPattern(PatternFunction f) {
132: // return (DPattern)apply(f);
133: // }
134:
135: static boolean contentTypeGroupable(int ct1, int ct2) {
136: if (ct1 == EMPTY_CONTENT_TYPE || ct2 == EMPTY_CONTENT_TYPE)
137: return true;
138: if (ct1 == DATA_CONTENT_TYPE || ct2 == DATA_CONTENT_TYPE)
139: return false;
140: return true;
141: }
142:
143: }
|