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: * Content model any node.
022: *
023: * @xerces.internal
024: *
025: * @version $Id: CMAny.java 572057 2007-09-02 18:03:20Z mrglavas $
026: */
027: public class CMAny extends CMNode {
028:
029: //
030: // Data
031: //
032:
033: /**
034: * The any content model type. This value is one of the following:
035: * XMLContentSpec.CONTENTSPECNODE_ANY,
036: * XMLContentSpec.CONTENTSPECNODE_ANY_OTHER,
037: * XMLContentSpec.CONTENTSPECNODE_ANY_LOCAL.
038: */
039: private final int fType;
040:
041: /**
042: * URI of the any content model. This value is set if the type is
043: * of the following:
044: * XMLContentSpec.CONTENTSPECNODE_ANY,
045: * XMLContentSpec.CONTENTSPECNODE_ANY_OTHER.
046: */
047: private final String fURI;
048:
049: /**
050: * Part of the algorithm to convert a regex directly to a DFA
051: * numbers each leaf sequentially. If its -1, that means its an
052: * epsilon node. Zero and greater are non-epsilon positions.
053: */
054: private int fPosition = -1;
055:
056: //
057: // Constructors
058: //
059:
060: /** Constructs a content model any. */
061: public CMAny(int type, String uri, int position) {
062: super (type);
063:
064: // Store the information
065: fType = type;
066: fURI = uri;
067: fPosition = position;
068: }
069:
070: //
071: // Package methods
072: //
073:
074: final int getType() {
075: return fType;
076: }
077:
078: final String getURI() {
079: return fURI;
080: }
081:
082: final int getPosition() {
083: return fPosition;
084: }
085:
086: final void setPosition(int newPosition) {
087: fPosition = newPosition;
088: }
089:
090: //
091: // CMNode methods
092: //
093:
094: // package
095:
096: public boolean isNullable() {
097: // Leaf nodes are never nullable unless its an epsilon node
098: return (fPosition == -1);
099: }
100:
101: public String toString() {
102: StringBuffer strRet = new StringBuffer();
103: strRet.append('(');
104: strRet.append("##any:uri=");
105: strRet.append(fURI);
106: strRet.append(')');
107: if (fPosition >= 0) {
108: strRet.append(" (Pos:").append(Integer.toString(fPosition))
109: .append(')');
110: }
111: return strRet.toString();
112: }
113:
114: // protected
115:
116: protected void calcFirstPos(CMStateSet toSet) {
117: // If we are an epsilon node, then the first pos is an empty set
118: if (fPosition == -1)
119: toSet.zeroBits();
120:
121: // Otherwise, its just the one bit of our position
122: else
123: toSet.setBit(fPosition);
124: }
125:
126: protected void calcLastPos(CMStateSet toSet) {
127: // If we are an epsilon node, then the last pos is an empty set
128: if (fPosition == -1)
129: toSet.zeroBits();
130:
131: // Otherwise, its just the one bit of our position
132: else
133: toSet.setBit(fPosition);
134: }
135:
136: } // class CMAny
|