001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.lang; 018 019 import org.apache.commons.lang.math.NumberUtils; 020 021 /** 022 * <p>Operations on boolean primitives and Boolean objects.</p> 023 * 024 * <p>This class tries to handle <code>null</code> input gracefully. 025 * An exception will not be thrown for a <code>null</code> input. 026 * Each method documents its behaviour in more detail.</p> 027 * 028 * <p>#ThreadSafe#</p> 029 * @author Apache Software Foundation 030 * @author Matthew Hawthorne 031 * @author Gary Gregory 032 * @since 2.0 033 * @version $Id: BooleanUtils.java 1057037 2011-01-09 21:35:32Z niallp $ 034 */ 035 public class BooleanUtils { 036 037 /** 038 * <p><code>BooleanUtils</code> instances should NOT be constructed in standard programming. 039 * Instead, the class should be used as <code>BooleanUtils.toBooleanObject(true);</code>.</p> 040 * 041 * <p>This constructor is public to permit tools that require a JavaBean instance 042 * to operate.</p> 043 */ 044 public BooleanUtils() { 045 super(); 046 } 047 048 // Boolean utilities 049 //-------------------------------------------------------------------------- 050 /** 051 * <p>Negates the specified boolean.</p> 052 * 053 * <p>If <code>null</code> is passed in, <code>null</code> will be returned.</p> 054 * 055 * <pre> 056 * BooleanUtils.negate(Boolean.TRUE) = Boolean.FALSE; 057 * BooleanUtils.negate(Boolean.FALSE) = Boolean.TRUE; 058 * BooleanUtils.negate(null) = null; 059 * </pre> 060 * 061 * @param bool the Boolean to negate, may be null 062 * @return the negated Boolean, or <code>null</code> if <code>null</code> input 063 */ 064 public static Boolean negate(Boolean bool) { 065 if (bool == null) { 066 return null; 067 } 068 return (bool.booleanValue() ? Boolean.FALSE : Boolean.TRUE); 069 } 070 071 // boolean Boolean methods 072 //----------------------------------------------------------------------- 073 /** 074 * <p>Checks if a <code>Boolean</code> value is <code>true</code>, 075 * handling <code>null</code> by returning <code>false</code>.</p> 076 * 077 * <pre> 078 * BooleanUtils.isTrue(Boolean.TRUE) = true 079 * BooleanUtils.isTrue(Boolean.FALSE) = false 080 * BooleanUtils.isTrue(null) = false 081 * </pre> 082 * 083 * @param bool the boolean to check, null returns <code>false</code> 084 * @return <code>true</code> only if the input is non-null and true 085 * @since 2.1 086 */ 087 public static boolean isTrue(Boolean bool) { 088 if (bool == null) { 089 return false; 090 } 091 return bool.booleanValue() ? true : false; 092 } 093 094 /** 095 * <p>Checks if a <code>Boolean</code> value is <i>not</i> <code>true</code>, 096 * handling <code>null</code> by returning <code>true</code>.</p> 097 * 098 * <pre> 099 * BooleanUtils.isNotTrue(Boolean.TRUE) = false 100 * BooleanUtils.isNotTrue(Boolean.FALSE) = true 101 * BooleanUtils.isNotTrue(null) = true 102 * </pre> 103 * 104 * @param bool the boolean to check, null returns <code>true</code> 105 * @return <code>true</code> if the input is null or false 106 * @since 2.3 107 */ 108 public static boolean isNotTrue(Boolean bool) { 109 return !isTrue(bool); 110 } 111 112 /** 113 * <p>Checks if a <code>Boolean</code> value is <code>false</code>, 114 * handling <code>null</code> by returning <code>false</code>.</p> 115 * 116 * <pre> 117 * BooleanUtils.isFalse(Boolean.TRUE) = false 118 * BooleanUtils.isFalse(Boolean.FALSE) = true 119 * BooleanUtils.isFalse(null) = false 120 * </pre> 121 * 122 * @param bool the boolean to check, null returns <code>false</code> 123 * @return <code>true</code> only if the input is non-null and false 124 * @since 2.1 125 */ 126 public static boolean isFalse(Boolean bool) { 127 if (bool == null) { 128 return false; 129 } 130 return bool.booleanValue() ? false : true; 131 } 132 133 /** 134 * <p>Checks if a <code>Boolean</code> value is <i>not</i> <code>false</code>, 135 * handling <code>null</code> by returning <code>true</code>.</p> 136 * 137 * <pre> 138 * BooleanUtils.isNotFalse(Boolean.TRUE) = true 139 * BooleanUtils.isNotFalse(Boolean.FALSE) = false 140 * BooleanUtils.isNotFalse(null) = true 141 * </pre> 142 * 143 * @param bool the boolean to check, null returns <code>true</code> 144 * @return <code>true</code> if the input is null or true 145 * @since 2.3 146 */ 147 public static boolean isNotFalse(Boolean bool) { 148 return !isFalse(bool); 149 } 150 151 //----------------------------------------------------------------------- 152 /** 153 * <p>Boolean factory that avoids creating new Boolean objecs all the time.</p> 154 * 155 * <p>This method was added to JDK1.4 but is available here for earlier JDKs.</p> 156 * 157 * <pre> 158 * BooleanUtils.toBooleanObject(false) = Boolean.FALSE 159 * BooleanUtils.toBooleanObject(true) = Boolean.TRUE 160 * </pre> 161 * 162 * @param bool the boolean to convert 163 * @return Boolean.TRUE or Boolean.FALSE as appropriate 164 */ 165 public static Boolean toBooleanObject(boolean bool) { 166 return bool ? Boolean.TRUE : Boolean.FALSE; 167 } 168 169 /** 170 * <p>Converts a Boolean to a boolean handling <code>null</code> 171 * by returning <code>false</code>.</p> 172 * 173 * <pre> 174 * BooleanUtils.toBoolean(Boolean.TRUE) = true 175 * BooleanUtils.toBoolean(Boolean.FALSE) = false 176 * BooleanUtils.toBoolean(null) = false 177 * </pre> 178 * 179 * @param bool the boolean to convert 180 * @return <code>true</code> or <code>false</code>, 181 * <code>null</code> returns <code>false</code> 182 */ 183 public static boolean toBoolean(Boolean bool) { 184 if (bool == null) { 185 return false; 186 } 187 return bool.booleanValue() ? true : false; 188 } 189 190 /** 191 * <p>Converts a Boolean to a boolean handling <code>null</code>.</p> 192 * 193 * <pre> 194 * BooleanUtils.toBooleanDefaultIfNull(Boolean.TRUE, false) = true 195 * BooleanUtils.toBooleanDefaultIfNull(Boolean.FALSE, true) = false 196 * BooleanUtils.toBooleanDefaultIfNull(null, true) = true 197 * </pre> 198 * 199 * @param bool the boolean to convert 200 * @param valueIfNull the boolean value to return if <code>null</code> 201 * @return <code>true</code> or <code>false</code> 202 */ 203 public static boolean toBooleanDefaultIfNull(Boolean bool, boolean valueIfNull) { 204 if (bool == null) { 205 return valueIfNull; 206 } 207 return bool.booleanValue() ? true : false; 208 } 209 210 // Integer to Boolean methods 211 //----------------------------------------------------------------------- 212 /** 213 * <p>Converts an int to a boolean using the convention that <code>zero</code> 214 * is <code>false</code>.</p> 215 * 216 * <pre> 217 * BooleanUtils.toBoolean(0) = false 218 * BooleanUtils.toBoolean(1) = true 219 * BooleanUtils.toBoolean(2) = true 220 * </pre> 221 * 222 * @param value the int to convert 223 * @return <code>true</code> if non-zero, <code>false</code> 224 * if zero 225 */ 226 public static boolean toBoolean(int value) { 227 return value == 0 ? false : true; 228 } 229 230 /** 231 * <p>Converts an int to a Boolean using the convention that <code>zero</code> 232 * is <code>false</code>.</p> 233 * 234 * <pre> 235 * BooleanUtils.toBoolean(0) = Boolean.FALSE 236 * BooleanUtils.toBoolean(1) = Boolean.TRUE 237 * BooleanUtils.toBoolean(2) = Boolean.TRUE 238 * </pre> 239 * 240 * @param value the int to convert 241 * @return Boolean.TRUE if non-zero, Boolean.FALSE if zero, 242 * <code>null</code> if <code>null</code> 243 */ 244 public static Boolean toBooleanObject(int value) { 245 return value == 0 ? Boolean.FALSE : Boolean.TRUE; 246 } 247 248 /** 249 * <p>Converts an Integer to a Boolean using the convention that <code>zero</code> 250 * is <code>false</code>.</p> 251 * 252 * <p><code>null</code> will be converted to <code>null</code>.</p> 253 * 254 * <pre> 255 * BooleanUtils.toBoolean(new Integer(0)) = Boolean.FALSE 256 * BooleanUtils.toBoolean(new Integer(1)) = Boolean.TRUE 257 * BooleanUtils.toBoolean(new Integer(null)) = null 258 * </pre> 259 * 260 * @param value the Integer to convert 261 * @return Boolean.TRUE if non-zero, Boolean.FALSE if zero, 262 * <code>null</code> if <code>null</code> input 263 */ 264 public static Boolean toBooleanObject(Integer value) { 265 if (value == null) { 266 return null; 267 } 268 return value.intValue() == 0 ? Boolean.FALSE : Boolean.TRUE; 269 } 270 271 /** 272 * <p>Converts an int to a boolean specifying the conversion values.</p> 273 * 274 * <pre> 275 * BooleanUtils.toBoolean(0, 1, 0) = false 276 * BooleanUtils.toBoolean(1, 1, 0) = true 277 * BooleanUtils.toBoolean(2, 1, 2) = false 278 * BooleanUtils.toBoolean(2, 2, 0) = true 279 * </pre> 280 * 281 * @param value the Integer to convert 282 * @param trueValue the value to match for <code>true</code> 283 * @param falseValue the value to match for <code>false</code> 284 * @return <code>true</code> or <code>false</code> 285 * @throws IllegalArgumentException if no match 286 */ 287 public static boolean toBoolean(int value, int trueValue, int falseValue) { 288 if (value == trueValue) { 289 return true; 290 } else if (value == falseValue) { 291 return false; 292 } 293 // no match 294 throw new IllegalArgumentException("The Integer did not match either specified value"); 295 } 296 297 /** 298 * <p>Converts an Integer to a boolean specifying the conversion values.</p> 299 * 300 * <pre> 301 * BooleanUtils.toBoolean(new Integer(0), new Integer(1), new Integer(0)) = false 302 * BooleanUtils.toBoolean(new Integer(1), new Integer(1), new Integer(0)) = true 303 * BooleanUtils.toBoolean(new Integer(2), new Integer(1), new Integer(2)) = false 304 * BooleanUtils.toBoolean(new Integer(2), new Integer(2), new Integer(0)) = true 305 * BooleanUtils.toBoolean(null, null, new Integer(0)) = true 306 * </pre> 307 * 308 * @param value the Integer to convert 309 * @param trueValue the value to match for <code>true</code>, 310 * may be <code>null</code> 311 * @param falseValue the value to match for <code>false</code>, 312 * may be <code>null</code> 313 * @return <code>true</code> or <code>false</code> 314 * @throws IllegalArgumentException if no match 315 */ 316 public static boolean toBoolean(Integer value, Integer trueValue, Integer falseValue) { 317 if (value == null) { 318 if (trueValue == null) { 319 return true; 320 } else if (falseValue == null) { 321 return false; 322 } 323 } else if (value.equals(trueValue)) { 324 return true; 325 } else if (value.equals(falseValue)) { 326 return false; 327 } 328 // no match 329 throw new IllegalArgumentException("The Integer did not match either specified value"); 330 } 331 332 /** 333 * <p>Converts an int to a Boolean specifying the conversion values.</p> 334 * 335 * <pre> 336 * BooleanUtils.toBooleanObject(0, 0, 2, 3) = Boolean.TRUE 337 * BooleanUtils.toBooleanObject(2, 1, 2, 3) = Boolean.FALSE 338 * BooleanUtils.toBooleanObject(3, 1, 2, 3) = null 339 * </pre> 340 * 341 * @param value the Integer to convert 342 * @param trueValue the value to match for <code>true</code> 343 * @param falseValue the value to match for <code>false</code> 344 * @param nullValue the value to to match for <code>null</code> 345 * @return Boolean.TRUE, Boolean.FALSE, or <code>null</code> 346 * @throws IllegalArgumentException if no match 347 */ 348 public static Boolean toBooleanObject(int value, int trueValue, int falseValue, int nullValue) { 349 if (value == trueValue) { 350 return Boolean.TRUE; 351 } else if (value == falseValue) { 352 return Boolean.FALSE; 353 } else if (value == nullValue) { 354 return null; 355 } 356 // no match 357 throw new IllegalArgumentException("The Integer did not match any specified value"); 358 } 359 360 /** 361 * <p>Converts an Integer to a Boolean specifying the conversion values.</p> 362 * 363 * <pre> 364 * BooleanUtils.toBooleanObject(new Integer(0), new Integer(0), new Integer(2), new Integer(3)) = Boolean.TRUE 365 * BooleanUtils.toBooleanObject(new Integer(2), new Integer(1), new Integer(2), new Integer(3)) = Boolean.FALSE 366 * BooleanUtils.toBooleanObject(new Integer(3), new Integer(1), new Integer(2), new Integer(3)) = null 367 * </pre> 368 * 369 * @param value the Integer to convert 370 * @param trueValue the value to match for <code>true</code>, 371 * may be <code>null</code> 372 * @param falseValue the value to match for <code>false</code>, 373 * may be <code>null</code> 374 * @param nullValue the value to to match for <code>null</code>, 375 * may be <code>null</code> 376 * @return Boolean.TRUE, Boolean.FALSE, or <code>null</code> 377 * @throws IllegalArgumentException if no match 378 */ 379 public static Boolean toBooleanObject(Integer value, Integer trueValue, Integer falseValue, Integer nullValue) { 380 if (value == null) { 381 if (trueValue == null) { 382 return Boolean.TRUE; 383 } else if (falseValue == null) { 384 return Boolean.FALSE; 385 } else if (nullValue == null) { 386 return null; 387 } 388 } else if (value.equals(trueValue)) { 389 return Boolean.TRUE; 390 } else if (value.equals(falseValue)) { 391 return Boolean.FALSE; 392 } else if (value.equals(nullValue)) { 393 return null; 394 } 395 // no match 396 throw new IllegalArgumentException("The Integer did not match any specified value"); 397 } 398 399 // Boolean to Integer methods 400 //----------------------------------------------------------------------- 401 /** 402 * <p>Converts a boolean to an int using the convention that 403 * <code>zero</code> is <code>false</code>.</p> 404 * 405 * <pre> 406 * BooleanUtils.toInteger(true) = 1 407 * BooleanUtils.toInteger(false) = 0 408 * </pre> 409 * 410 * @param bool the boolean to convert 411 * @return one if <code>true</code>, zero if <code>false</code> 412 */ 413 public static int toInteger(boolean bool) { 414 return bool ? 1 : 0; 415 } 416 417 /** 418 * <p>Converts a boolean to an Integer using the convention that 419 * <code>zero</code> is <code>false</code>.</p> 420 * 421 * <pre> 422 * BooleanUtils.toIntegerObject(true) = new Integer(1) 423 * BooleanUtils.toIntegerObject(false) = new Integer(0) 424 * </pre> 425 * 426 * @param bool the boolean to convert 427 * @return one if <code>true</code>, zero if <code>false</code> 428 */ 429 public static Integer toIntegerObject(boolean bool) { 430 return bool ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO; 431 } 432 433 /** 434 * <p>Converts a Boolean to a Integer using the convention that 435 * <code>zero</code> is <code>false</code>.</p> 436 * 437 * <p><code>null</code> will be converted to <code>null</code>.</p> 438 * 439 * <pre> 440 * BooleanUtils.toIntegerObject(Boolean.TRUE) = new Integer(1) 441 * BooleanUtils.toIntegerObject(Boolean.FALSE) = new Integer(0) 442 * </pre> 443 * 444 * @param bool the Boolean to convert 445 * @return one if Boolean.TRUE, zero if Boolean.FALSE, <code>null</code> if <code>null</code> 446 */ 447 public static Integer toIntegerObject(Boolean bool) { 448 if (bool == null) { 449 return null; 450 } 451 return bool.booleanValue() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO; 452 } 453 454 /** 455 * <p>Converts a boolean to an int specifying the conversion values.</p> 456 * 457 * <pre> 458 * BooleanUtils.toInteger(true, 1, 0) = 1 459 * BooleanUtils.toInteger(false, 1, 0) = 0 460 * </pre> 461 * 462 * @param bool the to convert 463 * @param trueValue the value to return if <code>true</code> 464 * @param falseValue the value to return if <code>false</code> 465 * @return the appropriate value 466 */ 467 public static int toInteger(boolean bool, int trueValue, int falseValue) { 468 return bool ? trueValue : falseValue; 469 } 470 471 /** 472 * <p>Converts a Boolean to an int specifying the conversion values.</p> 473 * 474 * <pre> 475 * BooleanUtils.toInteger(Boolean.TRUE, 1, 0, 2) = 1 476 * BooleanUtils.toInteger(Boolean.FALSE, 1, 0, 2) = 0 477 * BooleanUtils.toInteger(null, 1, 0, 2) = 2 478 * </pre> 479 * 480 * @param bool the Boolean to convert 481 * @param trueValue the value to return if <code>true</code> 482 * @param falseValue the value to return if <code>false</code> 483 * @param nullValue the value to return if <code>null</code> 484 * @return the appropriate value 485 */ 486 public static int toInteger(Boolean bool, int trueValue, int falseValue, int nullValue) { 487 if (bool == null) { 488 return nullValue; 489 } 490 return bool.booleanValue() ? trueValue : falseValue; 491 } 492 493 /** 494 * <p>Converts a boolean to an Integer specifying the conversion values.</p> 495 * 496 * <pre> 497 * BooleanUtils.toIntegerObject(true, new Integer(1), new Integer(0)) = new Integer(1) 498 * BooleanUtils.toIntegerObject(false, new Integer(1), new Integer(0)) = new Integer(0) 499 * </pre> 500 * 501 * @param bool the to convert 502 * @param trueValue the value to return if <code>true</code>, 503 * may be <code>null</code> 504 * @param falseValue the value to return if <code>false</code>, 505 * may be <code>null</code> 506 * @return the appropriate value 507 */ 508 public static Integer toIntegerObject(boolean bool, Integer trueValue, Integer falseValue) { 509 return bool ? trueValue : falseValue; 510 } 511 512 /** 513 * <p>Converts a Boolean to an Integer specifying the conversion values.</p> 514 * 515 * <pre> 516 * BooleanUtils.toIntegerObject(Boolean.TRUE, new Integer(1), new Integer(0), new Integer(2)) = new Integer(1) 517 * BooleanUtils.toIntegerObject(Boolean.FALSE, new Integer(1), new Integer(0), new Integer(2)) = new Integer(0) 518 * BooleanUtils.toIntegerObject(null, new Integer(1), new Integer(0), new Integer(2)) = new Integer(2) 519 * </pre> 520 * 521 * @param bool the Boolean to convert 522 * @param trueValue the value to return if <code>true</code>, 523 * may be <code>null</code> 524 * @param falseValue the value to return if <code>false</code>, 525 * may be <code>null</code> 526 * @param nullValue the value to return if <code>null</code>, 527 * may be <code>null</code> 528 * @return the appropriate value 529 */ 530 public static Integer toIntegerObject(Boolean bool, Integer trueValue, Integer falseValue, Integer nullValue) { 531 if (bool == null) { 532 return nullValue; 533 } 534 return bool.booleanValue() ? trueValue : falseValue; 535 } 536 537 // String to Boolean methods 538 //----------------------------------------------------------------------- 539 /** 540 * <p>Converts a String to a Boolean.</p> 541 * 542 * <p><code>'true'</code>, <code>'on'</code> or <code>'yes'</code> 543 * (case insensitive) will return <code>true</code>. 544 * <code>'false'</code>, <code>'off'</code> or <code>'no'</code> 545 * (case insensitive) will return <code>false</code>. 546 * Otherwise, <code>null</code> is returned.</p> 547 * 548 * <pre> 549 * BooleanUtils.toBooleanObject(null) = null 550 * BooleanUtils.toBooleanObject("true") = Boolean.TRUE 551 * BooleanUtils.toBooleanObject("false") = Boolean.FALSE 552 * BooleanUtils.toBooleanObject("on") = Boolean.TRUE 553 * BooleanUtils.toBooleanObject("ON") = Boolean.TRUE 554 * BooleanUtils.toBooleanObject("off") = Boolean.FALSE 555 * BooleanUtils.toBooleanObject("oFf") = Boolean.FALSE 556 * BooleanUtils.toBooleanObject("blue") = null 557 * </pre> 558 * 559 * @param str the String to check 560 * @return the Boolean value of the string, 561 * <code>null</code> if no match or <code>null</code> input 562 */ 563 public static Boolean toBooleanObject(String str) { 564 // Previously used equalsIgnoreCase, which was fast for interned 'true'. 565 // Non interned 'true' matched 15 times slower. 566 // 567 // Optimisation provides same performance as before for interned 'true'. 568 // Similar performance for null, 'false', and other strings not length 2/3/4. 569 // 'true'/'TRUE' match 4 times slower, 'tRUE'/'True' 7 times slower. 570 if (str == "true") { 571 return Boolean.TRUE; 572 } 573 if (str == null) { 574 return null; 575 } 576 switch (str.length()) { 577 case 1: { 578 char ch0 = str.charAt(0); 579 if ((ch0 == 'y' || ch0 == 'Y') || 580 (ch0 == 't' || ch0 == 'T')) 581 { 582 return Boolean.TRUE; 583 } 584 if ((ch0 == 'n' || ch0 == 'N') || 585 (ch0 == 'f' || ch0 == 'F')) 586 { 587 return Boolean.FALSE; 588 } 589 break; 590 } 591 case 2: { 592 char ch0 = str.charAt(0); 593 char ch1 = str.charAt(1); 594 if ((ch0 == 'o' || ch0 == 'O') && 595 (ch1 == 'n' || ch1 == 'N') ) 596 { 597 return Boolean.TRUE; 598 } 599 if ((ch0 == 'n' || ch0 == 'N') && 600 (ch1 == 'o' || ch1 == 'O') ) 601 { 602 return Boolean.FALSE; 603 } 604 break; 605 } 606 case 3: { 607 char ch0 = str.charAt(0); 608 char ch1 = str.charAt(1); 609 char ch2 = str.charAt(2); 610 if ((ch0 == 'y' || ch0 == 'Y') && 611 (ch1 == 'e' || ch1 == 'E') && 612 (ch2 == 's' || ch2 == 'S') ) 613 { 614 return Boolean.TRUE; 615 } 616 if ((ch0 == 'o' || ch0 == 'O') && 617 (ch1 == 'f' || ch1 == 'F') && 618 (ch2 == 'f' || ch2 == 'F') ) 619 { 620 return Boolean.FALSE; 621 } 622 break; 623 } 624 case 4: { 625 char ch0 = str.charAt(0); 626 char ch1 = str.charAt(1); 627 char ch2 = str.charAt(2); 628 char ch3 = str.charAt(3); 629 if ((ch0 == 't' || ch0 == 'T') && 630 (ch1 == 'r' || ch1 == 'R') && 631 (ch2 == 'u' || ch2 == 'U') && 632 (ch3 == 'e' || ch3 == 'E') ) 633 { 634 return Boolean.TRUE; 635 } 636 break; 637 } 638 case 5: { 639 char ch0 = str.charAt(0); 640 char ch1 = str.charAt(1); 641 char ch2 = str.charAt(2); 642 char ch3 = str.charAt(3); 643 char ch4 = str.charAt(4); 644 if ((ch0 == 'f' || ch0 == 'F') && 645 (ch1 == 'a' || ch1 == 'A') && 646 (ch2 == 'l' || ch2 == 'L') && 647 (ch3 == 's' || ch3 == 'S') && 648 (ch4 == 'e' || ch4 == 'E') ) 649 { 650 return Boolean.FALSE; 651 } 652 break; 653 } 654 } 655 656 return null; 657 } 658 659 /** 660 * <p>Converts a String to a Boolean throwing an exception if no match.</p> 661 * 662 * <pre> 663 * BooleanUtils.toBooleanObject("true", "true", "false", "null") = Boolean.TRUE 664 * BooleanUtils.toBooleanObject("false", "true", "false", "null") = Boolean.FALSE 665 * BooleanUtils.toBooleanObject("null", "true", "false", "null") = null 666 * </pre> 667 * 668 * @param str the String to check 669 * @param trueString the String to match for <code>true</code> 670 * (case sensitive), may be <code>null</code> 671 * @param falseString the String to match for <code>false</code> 672 * (case sensitive), may be <code>null</code> 673 * @param nullString the String to match for <code>null</code> 674 * (case sensitive), may be <code>null</code> 675 * @return the Boolean value of the string, 676 * <code>null</code> if either the String matches <code>nullString</code> 677 * or if <code>null</code> input and <code>nullString</code> is 678 * <code>null</code> 679 * @throws IllegalArgumentException if the String doesn't match 680 */ 681 public static Boolean toBooleanObject(String str, String trueString, String falseString, String nullString) { 682 if (str == null) { 683 if (trueString == null) { 684 return Boolean.TRUE; 685 } else if (falseString == null) { 686 return Boolean.FALSE; 687 } else if (nullString == null) { 688 return null; 689 } 690 } else if (str.equals(trueString)) { 691 return Boolean.TRUE; 692 } else if (str.equals(falseString)) { 693 return Boolean.FALSE; 694 } else if (str.equals(nullString)) { 695 return null; 696 } 697 // no match 698 throw new IllegalArgumentException("The String did not match any specified value"); 699 } 700 701 // String to boolean methods 702 //----------------------------------------------------------------------- 703 /** 704 * <p>Converts a String to a boolean (optimised for performance).</p> 705 * 706 * <p><code>'true'</code>, <code>'on'</code> or <code>'yes'</code> 707 * (case insensitive) will return <code>true</code>. Otherwise, 708 * <code>false</code> is returned.</p> 709 * 710 * <p>This method performs 4 times faster (JDK1.4) than 711 * <code>Boolean.valueOf(String)</code>. However, this method accepts 712 * 'on' and 'yes' as true values. 713 * 714 * <pre> 715 * BooleanUtils.toBoolean(null) = false 716 * BooleanUtils.toBoolean("true") = true 717 * BooleanUtils.toBoolean("TRUE") = true 718 * BooleanUtils.toBoolean("tRUe") = true 719 * BooleanUtils.toBoolean("on") = true 720 * BooleanUtils.toBoolean("yes") = true 721 * BooleanUtils.toBoolean("false") = false 722 * BooleanUtils.toBoolean("x gti") = false 723 * </pre> 724 * 725 * @param str the String to check 726 * @return the boolean value of the string, <code>false</code> if no match or the String is null 727 */ 728 public static boolean toBoolean(String str) { 729 return toBoolean(toBooleanObject(str)); 730 } 731 732 /** 733 * <p>Converts a String to a Boolean throwing an exception if no match found.</p> 734 * 735 * <p>null is returned if there is no match.</p> 736 * 737 * <pre> 738 * BooleanUtils.toBoolean("true", "true", "false") = true 739 * BooleanUtils.toBoolean("false", "true", "false") = false 740 * </pre> 741 * 742 * @param str the String to check 743 * @param trueString the String to match for <code>true</code> 744 * (case sensitive), may be <code>null</code> 745 * @param falseString the String to match for <code>false</code> 746 * (case sensitive), may be <code>null</code> 747 * @return the boolean value of the string 748 * @throws IllegalArgumentException if the String doesn't match 749 */ 750 public static boolean toBoolean(String str, String trueString, String falseString) { 751 if (str == null) { 752 if (trueString == null) { 753 return true; 754 } else if (falseString == null) { 755 return false; 756 } 757 } else if (str.equals(trueString)) { 758 return true; 759 } else if (str.equals(falseString)) { 760 return false; 761 } 762 // no match 763 throw new IllegalArgumentException("The String did not match either specified value"); 764 } 765 766 // Boolean to String methods 767 //----------------------------------------------------------------------- 768 /** 769 * <p>Converts a Boolean to a String returning <code>'true'</code>, 770 * <code>'false'</code>, or <code>null</code>.</p> 771 * 772 * <pre> 773 * BooleanUtils.toStringTrueFalse(Boolean.TRUE) = "true" 774 * BooleanUtils.toStringTrueFalse(Boolean.FALSE) = "false" 775 * BooleanUtils.toStringTrueFalse(null) = null; 776 * </pre> 777 * 778 * @param bool the Boolean to check 779 * @return <code>'true'</code>, <code>'false'</code>, 780 * or <code>null</code> 781 */ 782 public static String toStringTrueFalse(Boolean bool) { 783 return toString(bool, "true", "false", null); 784 } 785 786 /** 787 * <p>Converts a Boolean to a String returning <code>'on'</code>, 788 * <code>'off'</code>, or <code>null</code>.</p> 789 * 790 * <pre> 791 * BooleanUtils.toStringOnOff(Boolean.TRUE) = "on" 792 * BooleanUtils.toStringOnOff(Boolean.FALSE) = "off" 793 * BooleanUtils.toStringOnOff(null) = null; 794 * </pre> 795 * 796 * @param bool the Boolean to check 797 * @return <code>'on'</code>, <code>'off'</code>, 798 * or <code>null</code> 799 */ 800 public static String toStringOnOff(Boolean bool) { 801 return toString(bool, "on", "off", null); 802 } 803 804 /** 805 * <p>Converts a Boolean to a String returning <code>'yes'</code>, 806 * <code>'no'</code>, or <code>null</code>.</p> 807 * 808 * <pre> 809 * BooleanUtils.toStringYesNo(Boolean.TRUE) = "yes" 810 * BooleanUtils.toStringYesNo(Boolean.FALSE) = "no" 811 * BooleanUtils.toStringYesNo(null) = null; 812 * </pre> 813 * 814 * @param bool the Boolean to check 815 * @return <code>'yes'</code>, <code>'no'</code>, 816 * or <code>null</code> 817 */ 818 public static String toStringYesNo(Boolean bool) { 819 return toString(bool, "yes", "no", null); 820 } 821 822 /** 823 * <p>Converts a Boolean to a String returning one of the input Strings.</p> 824 * 825 * <pre> 826 * BooleanUtils.toString(Boolean.TRUE, "true", "false", null) = "true" 827 * BooleanUtils.toString(Boolean.FALSE, "true", "false", null) = "false" 828 * BooleanUtils.toString(null, "true", "false", null) = null; 829 * </pre> 830 * 831 * @param bool the Boolean to check 832 * @param trueString the String to return if <code>true</code>, 833 * may be <code>null</code> 834 * @param falseString the String to return if <code>false</code>, 835 * may be <code>null</code> 836 * @param nullString the String to return if <code>null</code>, 837 * may be <code>null</code> 838 * @return one of the three input Strings 839 */ 840 public static String toString(Boolean bool, String trueString, String falseString, String nullString) { 841 if (bool == null) { 842 return nullString; 843 } 844 return bool.booleanValue() ? trueString : falseString; 845 } 846 847 // boolean to String methods 848 //----------------------------------------------------------------------- 849 /** 850 * <p>Converts a boolean to a String returning <code>'true'</code> 851 * or <code>'false'</code>.</p> 852 * 853 * <pre> 854 * BooleanUtils.toStringTrueFalse(true) = "true" 855 * BooleanUtils.toStringTrueFalse(false) = "false" 856 * </pre> 857 * 858 * @param bool the Boolean to check 859 * @return <code>'true'</code>, <code>'false'</code>, 860 * or <code>null</code> 861 */ 862 public static String toStringTrueFalse(boolean bool) { 863 return toString(bool, "true", "false"); 864 } 865 866 /** 867 * <p>Converts a boolean to a String returning <code>'on'</code> 868 * or <code>'off'</code>.</p> 869 * 870 * <pre> 871 * BooleanUtils.toStringOnOff(true) = "on" 872 * BooleanUtils.toStringOnOff(false) = "off" 873 * </pre> 874 * 875 * @param bool the Boolean to check 876 * @return <code>'on'</code>, <code>'off'</code>, 877 * or <code>null</code> 878 */ 879 public static String toStringOnOff(boolean bool) { 880 return toString(bool, "on", "off"); 881 } 882 883 /** 884 * <p>Converts a boolean to a String returning <code>'yes'</code> 885 * or <code>'no'</code>.</p> 886 * 887 * <pre> 888 * BooleanUtils.toStringYesNo(true) = "yes" 889 * BooleanUtils.toStringYesNo(false) = "no" 890 * </pre> 891 * 892 * @param bool the Boolean to check 893 * @return <code>'yes'</code>, <code>'no'</code>, 894 * or <code>null</code> 895 */ 896 public static String toStringYesNo(boolean bool) { 897 return toString(bool, "yes", "no"); 898 } 899 900 /** 901 * <p>Converts a boolean to a String returning one of the input Strings.</p> 902 * 903 * <pre> 904 * BooleanUtils.toString(true, "true", "false") = "true" 905 * BooleanUtils.toString(false, "true", "false") = "false" 906 * </pre> 907 * 908 * @param bool the Boolean to check 909 * @param trueString the String to return if <code>true</code>, 910 * may be <code>null</code> 911 * @param falseString the String to return if <code>false</code>, 912 * may be <code>null</code> 913 * @return one of the two input Strings 914 */ 915 public static String toString(boolean bool, String trueString, String falseString) { 916 return bool ? trueString : falseString; 917 } 918 919 // xor methods 920 // ---------------------------------------------------------------------- 921 /** 922 * <p>Performs an xor on a set of booleans.</p> 923 * 924 * <pre> 925 * BooleanUtils.xor(new boolean[] { true, true }) = false 926 * BooleanUtils.xor(new boolean[] { false, false }) = false 927 * BooleanUtils.xor(new boolean[] { true, false }) = true 928 * </pre> 929 * 930 * @param array an array of <code>boolean<code>s 931 * @return <code>true</code> if the xor is successful. 932 * @throws IllegalArgumentException if <code>array</code> is <code>null</code> 933 * @throws IllegalArgumentException if <code>array</code> is empty. 934 */ 935 public static boolean xor(boolean[] array) { 936 // Validates input 937 if (array == null) { 938 throw new IllegalArgumentException("The Array must not be null"); 939 } else if (array.length == 0) { 940 throw new IllegalArgumentException("Array is empty"); 941 } 942 943 // Loops through array, comparing each item 944 int trueCount = 0; 945 for (int i = 0; i < array.length; i++) { 946 // If item is true, and trueCount is < 1, increments count 947 // Else, xor fails 948 if (array[i]) { 949 if (trueCount < 1) { 950 trueCount++; 951 } else { 952 return false; 953 } 954 } 955 } 956 957 // Returns true if there was exactly 1 true item 958 return trueCount == 1; 959 } 960 961 /** 962 * <p>Performs an xor on an array of Booleans.</p> 963 * 964 * <pre> 965 * BooleanUtils.xor(new Boolean[] { Boolean.TRUE, Boolean.TRUE }) = Boolean.FALSE 966 * BooleanUtils.xor(new Boolean[] { Boolean.FALSE, Boolean.FALSE }) = Boolean.FALSE 967 * BooleanUtils.xor(new Boolean[] { Boolean.TRUE, Boolean.FALSE }) = Boolean.TRUE 968 * </pre> 969 * 970 * @param array an array of <code>Boolean<code>s 971 * @return <code>true</code> if the xor is successful. 972 * @throws IllegalArgumentException if <code>array</code> is <code>null</code> 973 * @throws IllegalArgumentException if <code>array</code> is empty. 974 * @throws IllegalArgumentException if <code>array</code> contains a <code>null</code> 975 */ 976 public static Boolean xor(Boolean[] array) { 977 if (array == null) { 978 throw new IllegalArgumentException("The Array must not be null"); 979 } else if (array.length == 0) { 980 throw new IllegalArgumentException("Array is empty"); 981 } 982 boolean[] primitive = null; 983 try { 984 primitive = ArrayUtils.toPrimitive(array); 985 } catch (NullPointerException ex) { 986 throw new IllegalArgumentException("The array must not contain any null elements"); 987 } 988 return xor(primitive) ? Boolean.TRUE : Boolean.FALSE; 989 } 990 991 }