KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > org > apache > xerces > internal > impl > xs > models > XSCMBinOp


1 /*
2  * The Apache Software License, Version 1.1
3  *
4  *
5  * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
6  * reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in
17  * the documentation and/or other materials provided with the
18  * distribution.
19  *
20  * 3. The end-user documentation included with the redistribution,
21  * if any, must include the following acknowledgment:
22  * "This product includes software developed by the
23  * Apache Software Foundation (http://www.apache.org/)."
24  * Alternately, this acknowledgment may appear in the software itself,
25  * if and wherever such third-party acknowledgments normally appear.
26  *
27  * 4. The names "Xerces" and "Apache Software Foundation" must
28  * not be used to endorse or promote products derived from this
29  * software without prior written permission. For written
30  * permission, please contact apache@apache.org.
31  *
32  * 5. Products derived from this software may not be called "Apache",
33  * nor may "Apache" appear in their name, without prior written
34  * permission of the Apache Software Foundation.
35  *
36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENCEUENTIAL DAMAGES (INCLUDING, BUT NOT
42  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47  * SUCH DAMAGE.
48  * ====================================================================
49  *
50  * This software consists of voluntary contributions made by many
51  * individuals on behalf of the Apache Software Foundation and was
52  * originally based on software copyright (c) 1999, International
53  * Business Machines, Inc., http://www.apache.org. For more
54  * information on the Apache Software Foundation, please see
55  * <http://www.apache.org/>.
56  */

57
58 package com.sun.org.apache.xerces.internal.impl.xs.models;
59
60 import com.sun.org.apache.xerces.internal.impl.dtd.models.CMNode;
61 import com.sun.org.apache.xerces.internal.impl.dtd.models.CMStateSet;
62 import com.sun.org.apache.xerces.internal.impl.xs.XSModelGroupImpl;
63
64 /**
65  *
66  * Content model Bin-Op node.
67  *
68  * @author Neil Graham, IBM
69  * @version $$
70  */

71 public class XSCMBinOp extends CMNode {
72     // -------------------------------------------------------------------
73
// Constructors
74
// -------------------------------------------------------------------
75
public XSCMBinOp(int type, CMNode leftNode, CMNode rightNode)
76     {
77         super(type);
78
79         // Insure that its one of the types we require
80
if ((type() != XSModelGroupImpl.MODELGROUP_CHOICE)
81         && (type() != XSModelGroupImpl.MODELGROUP_SEQUENCE)) {
82             throw new RuntimeException JavaDoc("ImplementationMessages.VAL_BST");
83         }
84
85         // Store the nodes and init any data that needs it
86
fLeftChild = leftNode;
87         fRightChild = rightNode;
88     }
89
90
91     // -------------------------------------------------------------------
92
// Package, final methods
93
// -------------------------------------------------------------------
94
final CMNode getLeft() {
95         return fLeftChild;
96     }
97
98     final CMNode getRight() {
99         return fRightChild;
100     }
101
102
103     // -------------------------------------------------------------------
104
// Package, inherited methods
105
// -------------------------------------------------------------------
106
public boolean isNullable() {
107         //
108
// If its an alternation, then if either child is nullable then
109
// this node is nullable. If its a concatenation, then both of
110
// them have to be nullable.
111
//
112
if (type() == XSModelGroupImpl.MODELGROUP_CHOICE)
113             return (fLeftChild.isNullable() || fRightChild.isNullable());
114         else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE)
115             return (fLeftChild.isNullable() && fRightChild.isNullable());
116         else
117             throw new RuntimeException JavaDoc("ImplementationMessages.VAL_BST");
118     }
119
120
121     // -------------------------------------------------------------------
122
// Protected, inherited methods
123
// -------------------------------------------------------------------
124
protected void calcFirstPos(CMStateSet toSet) {
125         if (type() == XSModelGroupImpl.MODELGROUP_CHOICE) {
126             // Its the the union of the first positions of our children.
127
toSet.setTo(fLeftChild.firstPos());
128             toSet.union(fRightChild.firstPos());
129         }
130          else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE) {
131             //
132
// If our left child is nullable, then its the union of our
133
// children's first positions. Else is our left child's first
134
// positions.
135
//
136
toSet.setTo(fLeftChild.firstPos());
137             if (fLeftChild.isNullable())
138                 toSet.union(fRightChild.firstPos());
139         }
140          else {
141             throw new RuntimeException JavaDoc("ImplementationMessages.VAL_BST");
142         }
143     }
144
145     protected void calcLastPos(CMStateSet toSet) {
146         if (type() == XSModelGroupImpl.MODELGROUP_CHOICE) {
147             // Its the the union of the first positions of our children.
148
toSet.setTo(fLeftChild.lastPos());
149             toSet.union(fRightChild.lastPos());
150         }
151         else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE) {
152             //
153
// If our right child is nullable, then its the union of our
154
// children's last positions. Else is our right child's last
155
// positions.
156
//
157
toSet.setTo(fRightChild.lastPos());
158             if (fRightChild.isNullable())
159                 toSet.union(fLeftChild.lastPos());
160         }
161         else {
162             throw new RuntimeException JavaDoc("ImplementationMessages.VAL_BST");
163         }
164     }
165
166
167     // -------------------------------------------------------------------
168
// Private data members
169
//
170
// fLeftChild
171
// fRightChild
172
// These are the references to the two nodes that are on either
173
// side of this binary operation.
174
// -------------------------------------------------------------------
175
private CMNode fLeftChild;
176     private CMNode fRightChild;
177 } // XSCMBinOp
178

179
Popular Tags