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 }