001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.xerces.impl.dtd.models;
019:
020: /**
021: * A content model node.
022: *
023: * @xerces.internal
024: *
025: * @version $Id: CMNode.java 573322 2007-09-06 16:48:47Z peterjm $
026: */
027: public abstract class CMNode {
028: // -------------------------------------------------------------------
029: // Constructors
030: // -------------------------------------------------------------------
031: public CMNode(int type) {
032: fType = type;
033: }
034:
035: // -------------------------------------------------------------------
036: // Package, abstract methods
037: // -------------------------------------------------------------------
038: // made this public so it could be implemented and used outside this package -neilg.
039: public abstract boolean isNullable();
040:
041: // -------------------------------------------------------------------
042: // Package final methods
043: // -------------------------------------------------------------------
044: public final int type() {
045: return fType;
046: }
047:
048: // made this public so it could be implemented and used outside this package -neilg.
049: public final CMStateSet firstPos() {
050: if (fFirstPos == null) {
051: fFirstPos = new CMStateSet(fMaxStates);
052: calcFirstPos(fFirstPos);
053: }
054: return fFirstPos;
055: }
056:
057: // made this public so it could be implemented and used outside this package -neilg.
058: public final CMStateSet lastPos() {
059: if (fLastPos == null) {
060: fLastPos = new CMStateSet(fMaxStates);
061: calcLastPos(fLastPos);
062: }
063: return fLastPos;
064: }
065:
066: final void setFollowPos(CMStateSet setToAdopt) {
067: fFollowPos = setToAdopt;
068: }
069:
070: public final void setMaxStates(int maxStates) {
071: fMaxStates = maxStates;
072: }
073:
074: public boolean isCompactedForUPA() {
075: return fCompactedForUPA;
076: }
077:
078: public void setIsCompactUPAModel(boolean value) {
079: fCompactedForUPA = value;
080: }
081:
082: // -------------------------------------------------------------------
083: // Protected, abstract methods
084: // -------------------------------------------------------------------
085: protected abstract void calcFirstPos(CMStateSet toSet);
086:
087: protected abstract void calcLastPos(CMStateSet toSet);
088:
089: // -------------------------------------------------------------------
090: // Private data members
091: //
092: // fType
093: // The type of node. This indicates whether its a leaf or an
094: // operation. Though we also do derived classes for these types,
095: // it is too expensive to use runtime typing to find this out.
096: // This is one of the ContentSpecNode.NODE_XXX types.
097: //
098: // fFirstPos
099: // The set of NFA states that represent the entry states of this
100: // node in the DFA.
101: //
102: // fFollowPos
103: // The set of NFA states that can be gotten to from from this
104: // node in the DFA.
105: //
106: // fLastPos
107: // The set of NFA states that represent the final states of this
108: // node in the DFA.
109: //
110: // fMaxStates
111: // The maximum number of states that the NFA has, which means the
112: // max number of NFA states that have to be traced in the state
113: // sets during the building of the DFA. Its unfortunate that it
114: // has to be stored redundantly, but we need to fault in the
115: // state set members and they have to be sized to this size. We
116: // init to to -1 so it will cause an error if its used without
117: // being initialized.
118: // -------------------------------------------------------------------
119: private final int fType;
120: private CMStateSet fFirstPos = null;
121: private CMStateSet fFollowPos = null;
122: private CMStateSet fLastPos = null;
123: private int fMaxStates = -1;
124:
125: /*
126: * This boolean is true if the model represented by the CMNode does not represent
127: * the true model from the schema, but has had its min/maxOccurs modified for a
128: * more compact representation (for purposes of UPA).
129: */
130: private boolean fCompactedForUPA = false;
131: };
|