1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.xerces.internal.impl.xs.models;
23 
24 import com.sun.org.apache.xerces.internal.impl.dtd.models.CMNode;
25 import com.sun.org.apache.xerces.internal.impl.dtd.models.CMStateSet;
26 
27 /**
28  * Content model leaf node.
29  *
30  * @xerces.internal
31  *
32  * @author Neil Graham, IBM
33  */
34 public class XSCMLeaf
35     extends CMNode {
36 
37     //
38     // Data
39     //
40 
41     /** This is the leaf: element decl or wildcard decl. */
42     private Object fLeaf = null;
43 
44     /**
45      * Identify the particle: for UPA checking
46      */
47     private int fParticleId = -1;
48 
49     /**
50      * Part of the algorithm to convert a regex directly to a DFA
51      * numbers each leaf sequentially. If its -1, that means its an
52      * epsilon node. Zero and greater are non-epsilon positions.
53      */
54     private int fPosition = -1;
55 
56     //
57     // Constructors
58     //
59 
60     /** Constructs a content model leaf. */
XSCMLeaf(int type, Object leaf, int id, int position)61     public XSCMLeaf(int type, Object leaf, int id, int position)  {
62         super(type);
63 
64         // Store the element index and position
65         fLeaf = leaf;
66         fParticleId = id;
67         fPosition = position;
68     }
69 
70     //
71     // Package methods
72     //
73 
getLeaf()74     final Object getLeaf() {
75         return fLeaf;
76     }
77 
getParticleId()78     final int getParticleId() {
79         return fParticleId;
80     }
81 
getPosition()82     final int getPosition() {
83         return fPosition;
84     }
85 
setPosition(int newPosition)86     final void setPosition(int newPosition) {
87         fPosition = newPosition;
88     }
89 
90     //
91     // CMNode methods
92     //
93 
94     // package
95 
isNullable()96     public boolean isNullable() {
97         // Leaf nodes are never nullable unless its an epsilon node
98         return (fPosition == -1);
99     }
100 
toString()101     public String toString() {
102         StringBuffer strRet = new StringBuffer(fLeaf.toString());
103         if (fPosition >= 0) {
104             strRet.append
105             (
106                 " (Pos:"
107                 + Integer.toString(fPosition)
108                 + ")"
109             );
110         }
111         return strRet.toString();
112     }
113 
114     // protected
115 
calcFirstPos(CMStateSet toSet)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 
calcLastPos(CMStateSet toSet)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 XSCMLeaf
137