View Javadoc
1   /*
2    * reserved comment block
3    * DO NOT REMOVE OR ALTER!
4    */
5   /*
6    * Copyright 1999-2002,2004 The Apache Software Foundation.
7    *
8    * Licensed under the Apache License, Version 2.0 (the "License");
9    * you may not use this file except in compliance with the License.
10   * You may obtain a copy of the License at
11   *
12   *      http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  
21  package com.sun.org.apache.xerces.internal.impl.xs.models;
22  
23  import com.sun.org.apache.xerces.internal.impl.dtd.models.CMNode;
24  import com.sun.org.apache.xerces.internal.impl.dtd.models.CMStateSet;
25  import com.sun.org.apache.xerces.internal.impl.xs.XSParticleDecl;
26  
27  /**
28   *
29   * Content model Uni-Op node.
30   *
31   * @xerces.internal
32   *
33   * @author Neil Graham, IBM
34   * @version $$
35   */
36  public class XSCMUniOp extends CMNode {
37      // -------------------------------------------------------------------
38      //  Constructors
39      // -------------------------------------------------------------------
40      public XSCMUniOp(int type, CMNode childNode) {
41          super(type);
42  
43          // Insure that its one of the types we require
44          if ((type() != XSParticleDecl.PARTICLE_ZERO_OR_ONE)
45          &&  (type() != XSParticleDecl.PARTICLE_ZERO_OR_MORE)
46          &&  (type() != XSParticleDecl.PARTICLE_ONE_OR_MORE)) {
47              throw new RuntimeException("ImplementationMessages.VAL_UST");
48          }
49  
50          // Store the node and init any data that needs it
51          fChild = childNode;
52      }
53  
54  
55      // -------------------------------------------------------------------
56      //  Package, final methods
57      // -------------------------------------------------------------------
58      final CMNode getChild() {
59          return fChild;
60      }
61  
62  
63      // -------------------------------------------------------------------
64      //  Package, inherited methods
65      // -------------------------------------------------------------------
66      public boolean isNullable() {
67          //
68          //  For debugging purposes, make sure we got rid of all non '*'
69          //  repetitions. Otherwise, '*' style nodes are always nullable.
70          //
71          if (type() == XSParticleDecl.PARTICLE_ONE_OR_MORE)
72                  return fChild.isNullable();
73              else
74                  return true;
75      }
76  
77  
78      // -------------------------------------------------------------------
79      //  Protected, inherited methods
80      // -------------------------------------------------------------------
81      protected void calcFirstPos(CMStateSet toSet) {
82          // Its just based on our child node's first pos
83          toSet.setTo(fChild.firstPos());
84      }
85  
86      protected void calcLastPos(CMStateSet toSet) {
87          // Its just based on our child node's last pos
88          toSet.setTo(fChild.lastPos());
89      }
90  
91      /**
92       * Allows the user to set arbitrary data on this content model
93       * node. This is used by the a{n,m} optimization that runs
94       * in constant space. For convenience, set user data in
95       * children node too.
96       */
97      @Override
98      public void setUserData(Object userData) {
99          super.setUserData(userData);
100         fChild.setUserData(userData);
101     }
102 
103 
104     // -------------------------------------------------------------------
105     //  Private data members
106     //
107     //  fChild
108     //      This is the reference to the one child that we have for this
109     //      unary operation.
110     // -------------------------------------------------------------------
111     private CMNode  fChild;
112 } // XSCMUniOp