View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  
21  package org.apache.directory.api.ldap.model.filter;
22  
23  
24  import java.util.List;
25  
26  import org.apache.directory.api.i18n.I18n;
27  
28  
29  /**
30   * Node representing an Not connector in a filter operation
31   * 
32   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
33   */
34  public class NotNode extends BranchNode
35  {
36      /**
37       * Creates a NotNode using a logical NOT operator and a list of children.
38       * 
39       * A Not node could contain only one child
40       * 
41       * @param childList the child nodes under this branch node.
42       */
43      public NotNode( List<ExprNode> childList )
44      {
45          super( AssertionType.NOT );
46  
47          if ( childList != null )
48          {
49              setChildren( childList );
50          }
51      }
52  
53  
54      /**
55       * Creates a NotNode using a logical NOT operator and the given child.
56       * 
57       * @param child the child node under this branch node.
58       */
59      public NotNode( ExprNode child )
60      {
61          super( AssertionType.NOT );
62  
63          if ( child != null )
64          {
65              addNode( child );
66          }
67      }
68  
69  
70      /**
71       * Creates an empty NotNode
72       */
73      public NotNode()
74      {
75          this( ( ExprNode ) null );
76      }
77  
78  
79      /**
80       * Adds a child node to this NOT node node
81       * 
82       * @param node the child expression to add to this NOT node
83       */
84      @Override
85      public void addNode( ExprNode node )
86      {
87          if ( ( children == null ) || ( !children.isEmpty() ) )
88          {
89              throw new IllegalStateException( I18n.err( I18n.ERR_04159 ) );
90          }
91  
92          children.add( node );
93      }
94  
95  
96      /**
97       * Adds a child node to this NOT node at the head rather than the tail. 
98       * 
99       * @param node the child expression to add to this branch node
100      */
101     @Override
102     public void addNodeToHead( ExprNode node )
103     {
104         if ( !children.isEmpty() )
105         {
106             throw new IllegalStateException( I18n.err( I18n.ERR_04159 ) );
107         }
108 
109         children.add( node );
110     }
111 
112 
113     /**
114      * Sets the list of children under this node.
115      * 
116      * @param childList the list of children to set.
117      */
118     @Override
119     public void setChildren( List<ExprNode> childList )
120     {
121         if ( ( childList != null ) && ( childList.size() > 1 ) )
122         {
123             throw new IllegalStateException( I18n.err( I18n.ERR_04159 ) );
124         }
125 
126         children = childList;
127     }
128 
129 
130     /**
131      * Gets the operator for this branch node.
132      * 
133      * @return the operator constant.
134      */
135     public AssertionType getOperator()
136     {
137         return AssertionType.NOT;
138     }
139 
140 
141     /**
142      * Tests whether or not this node is a disjunction (a OR'ed branch).
143      * 
144      * @return true if the operation is a OR, false otherwise.
145      */
146     public boolean isDisjunction()
147     {
148         return false;
149     }
150 
151 
152     /**
153      * Tests whether or not this node is a conjunction (a AND'ed branch).
154      * 
155      * @return true if the operation is a AND, false otherwise.
156      */
157     public boolean isConjunction()
158     {
159         return false;
160     }
161 
162 
163     /**
164      * Tests whether or not this node is a negation (a NOT'ed branch).
165      * 
166      * @return true if the operation is a NOT, false otherwise.
167      */
168     public boolean isNegation()
169     {
170         return true;
171     }
172 
173 
174     /**
175      * @see ExprNode#printRefinementToBuffer(StringBuilder)
176      * 
177      * @param buf The buffer where we store the result
178      * @return The buffer in which the refinement has been appended
179      * @throws UnsupportedOperationException if this node isn't a part of a refinement.
180      */
181     @Override
182     public StringBuilder printRefinementToBuffer( StringBuilder buf )
183     {
184         buf.append( "not: " );
185 
186         // There is only one item for a not refinement
187         children.get( 0 ).printRefinementToBuffer( buf );
188 
189         return buf;
190     }
191 
192 
193     /**
194      * Gets the recursive prefix string represent of the filter from this node
195      * down.
196      * 
197      * @see java.lang.Object#toString()
198      * @return A string representing the AndNode
199      */
200     @Override
201     public String toString()
202     {
203         StringBuilder buf = new StringBuilder();
204         buf.append( "(!" );
205 
206         buf.append( super.toString() );
207 
208         buf.append( getFirstChild() );
209         buf.append( ')' );
210 
211         return buf.toString();
212     }
213 }