001/* 002 * Copyright 2009-2024 Ping Identity Corporation 003 * All Rights Reserved. 004 */ 005/* 006 * Copyright 2009-2024 Ping Identity Corporation 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020/* 021 * Copyright (C) 2009-2024 Ping Identity Corporation 022 * 023 * This program is free software; you can redistribute it and/or modify 024 * it under the terms of the GNU General Public License (GPLv2 only) 025 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only) 026 * as published by the Free Software Foundation. 027 * 028 * This program is distributed in the hope that it will be useful, 029 * but WITHOUT ANY WARRANTY; without even the implied warranty of 030 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 031 * GNU General Public License for more details. 032 * 033 * You should have received a copy of the GNU General Public License 034 * along with this program; if not, see <http://www.gnu.org/licenses>. 035 */ 036package com.unboundid.ldap.sdk.migrate.ldapjdk; 037 038 039 040import java.util.Locale; 041 042import com.unboundid.ldap.sdk.ResultCode; 043import com.unboundid.util.NotExtensible; 044import com.unboundid.util.NotMutable; 045import com.unboundid.util.NotNull; 046import com.unboundid.util.Nullable; 047import com.unboundid.util.ThreadSafety; 048import com.unboundid.util.ThreadSafetyLevel; 049 050 051 052/** 053 * This class defines an exception that may be thrown if an error occurs during 054 * LDAP-related processing. 055 * <BR><BR> 056 * This class is primarily intended to be used in the process of updating 057 * applications which use the Netscape Directory SDK for Java to switch to or 058 * coexist with the UnboundID LDAP SDK for Java. For applications not written 059 * using the Netscape Directory SDK for Java, the 060 * {@link com.unboundid.ldap.sdk.LDAPException} class should be used instead. 061 */ 062@NotExtensible() 063@NotMutable() 064@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 065public class LDAPException 066 extends Exception 067{ 068 /** 069 * The int value for the SUCCESS result code. 070 */ 071 public static final int SUCCESS = ResultCode.SUCCESS_INT_VALUE; 072 073 074 075 /** 076 * The int value for the OPERATION_ERROR result code. 077 */ 078 public static final int OPERATION_ERROR = 079 ResultCode.OPERATIONS_ERROR_INT_VALUE; 080 081 082 083 /** 084 * The int value for the PROTOCOL_ERROR result code. 085 */ 086 public static final int PROTOCOL_ERROR = ResultCode.PROTOCOL_ERROR_INT_VALUE; 087 088 089 090 /** 091 * The int value for the TIME_LIMIT_EXCEEDED result code. 092 */ 093 public static final int TIME_LIMIT_EXCEEDED = 094 ResultCode.TIME_LIMIT_EXCEEDED_INT_VALUE; 095 096 097 098 /** 099 * The int value for the SIZE_LIMIT_EXCEEDED result code. 100 */ 101 public static final int SIZE_LIMIT_EXCEEDED = 102 ResultCode.SIZE_LIMIT_EXCEEDED_INT_VALUE; 103 104 105 106 /** 107 * The int value for the COMPARE_FALSE result code. 108 */ 109 public static final int COMPARE_FALSE = ResultCode.COMPARE_FALSE_INT_VALUE; 110 111 112 113 /** 114 * The int value for the COMPARE_TRUE result code. 115 */ 116 public static final int COMPARE_TRUE = ResultCode.COMPARE_TRUE_INT_VALUE; 117 118 119 120 /** 121 * The int value for the AUTH_METHOD_NOT_SUPPORTED result code. 122 */ 123 public static final int AUTH_METHOD_NOT_SUPPORTED = 124 ResultCode.AUTH_METHOD_NOT_SUPPORTED_INT_VALUE; 125 126 127 128 /** 129 * The int value for the STRONG_AUTH_REQUIRED result code. 130 */ 131 public static final int STRONG_AUTH_REQUIRED = 132 ResultCode.STRONG_AUTH_REQUIRED_INT_VALUE; 133 134 135 136 /** 137 * The int value for the LDAP_PARTIAL_RESULTS result code. 138 */ 139 public static final int LDAP_PARTIAL_RESULTS = 9; 140 141 142 143 /** 144 * The int value for the REFERRAL result code. 145 */ 146 public static final int REFERRAL = ResultCode.REFERRAL_INT_VALUE; 147 148 149 150 /** 151 * The int value for the ADMIN_LIMIT_EXCEEDED result code. 152 */ 153 public static final int ADMIN_LIMIT_EXCEEDED = 154 ResultCode.ADMIN_LIMIT_EXCEEDED_INT_VALUE; 155 156 157 158 /** 159 * The int value for the UNAVAILABLE_CRITICAL_EXTENSION result code. 160 */ 161 public static final int UNAVAILABLE_CRITICAL_EXTENSION = 162 ResultCode.UNAVAILABLE_CRITICAL_EXTENSION_INT_VALUE; 163 164 165 166 /** 167 * The int value for the CONFIDENTIALITY_REQUIRED result code. 168 */ 169 public static final int CONFIDENTIALITY_REQUIRED = 170 ResultCode.CONFIDENTIALITY_REQUIRED_INT_VALUE; 171 172 173 174 /** 175 * The int value for the SASL_BIND_IN_PROGRESS result code. 176 */ 177 public static final int SASL_BIND_IN_PROGRESS = 178 ResultCode.SASL_BIND_IN_PROGRESS_INT_VALUE; 179 180 181 182 /** 183 * The int value for the NO_SUCH_ATTRIBUTE result code. 184 */ 185 public static final int NO_SUCH_ATTRIBUTE = 186 ResultCode.NO_SUCH_ATTRIBUTE_INT_VALUE; 187 188 189 190 /** 191 * The int value for the UNDEFINED_ATTRIBUTE_TYPE result code. 192 */ 193 public static final int UNDEFINED_ATTRIBUTE_TYPE = 194 ResultCode.UNDEFINED_ATTRIBUTE_TYPE_INT_VALUE; 195 196 197 198 /** 199 * The int value for the INAPPROPRIATE_MATCHING result code. 200 */ 201 public static final int INAPPROPRIATE_MATCHING = 202 ResultCode.INAPPROPRIATE_MATCHING_INT_VALUE; 203 204 205 206 /** 207 * The int value for the CONSTRAINT_VIOLATION result code. 208 */ 209 public static final int CONSTRAINT_VIOLATION = 210 ResultCode.CONSTRAINT_VIOLATION_INT_VALUE; 211 212 213 214 /** 215 * The int value for the ATTRIBUTE_OR_VALUE_EXISTS result code. 216 */ 217 public static final int ATTRIBUTE_OR_VALUE_EXISTS = 218 ResultCode.ATTRIBUTE_OR_VALUE_EXISTS_INT_VALUE; 219 220 221 222 /** 223 * The int value for the INVALID_ATTRIBUTE_SYNTAX result code. 224 */ 225 public static final int INVALID_ATTRIBUTE_SYNTAX = 226 ResultCode.INVALID_ATTRIBUTE_SYNTAX_INT_VALUE; 227 228 229 230 /** 231 * The int value for the NO_SUCH_OBJECT result code. 232 */ 233 public static final int NO_SUCH_OBJECT = ResultCode.NO_SUCH_OBJECT_INT_VALUE; 234 235 236 237 /** 238 * The int value for the ALIAS_PROBLEM result code. 239 */ 240 public static final int ALIAS_PROBLEM = ResultCode.ALIAS_PROBLEM_INT_VALUE; 241 242 243 244 /** 245 * The int value for the INVALID_DN_SYNTAX result code. 246 */ 247 public static final int INVALID_DN_SYNTAX = 248 ResultCode.INVALID_DN_SYNTAX_INT_VALUE; 249 250 251 252 /** 253 * The int value for the IS_LEAF result code. 254 */ 255 public static final int IS_LEAF = 35; 256 257 258 259 /** 260 * The int value for the ALIAS_DEREFERENCING_PROBLEM result code. 261 */ 262 public static final int ALIAS_DEREFERENCING_PROBLEM = 263 ResultCode.ALIAS_DEREFERENCING_PROBLEM_INT_VALUE; 264 265 266 267 /** 268 * The int value for the INAPPROPRIATE_AUTHENTICATION result code. 269 */ 270 public static final int INAPPROPRIATE_AUTHENTICATION = 271 ResultCode.INAPPROPRIATE_AUTHENTICATION_INT_VALUE; 272 273 274 275 /** 276 * The int value for the INVALID_CREDENTIALS result code. 277 */ 278 public static final int INVALID_CREDENTIALS = 279 ResultCode.INVALID_CREDENTIALS_INT_VALUE; 280 281 282 283 /** 284 * The int value for the INSUFFICIENT_ACCESS_RIGHTS result code. 285 */ 286 public static final int INSUFFICIENT_ACCESS_RIGHTS = 287 ResultCode.INSUFFICIENT_ACCESS_RIGHTS_INT_VALUE; 288 289 290 291 /** 292 * The int value for the BUSY result code. 293 */ 294 public static final int BUSY = ResultCode.BUSY_INT_VALUE; 295 296 297 298 /** 299 * The int value for the UNAVAILABLE result code. 300 */ 301 public static final int UNAVAILABLE = ResultCode.UNAVAILABLE_INT_VALUE; 302 303 304 305 /** 306 * The int value for the UNWILLING_TO_PERFORM result code. 307 */ 308 public static final int UNWILLING_TO_PERFORM = 309 ResultCode.UNWILLING_TO_PERFORM_INT_VALUE; 310 311 312 313 /** 314 * The int value for the LOOP_DETECT result code. 315 */ 316 public static final int LOOP_DETECTED = ResultCode.LOOP_DETECT_INT_VALUE; 317 318 319 320 /** 321 * The int value for the SORT_CONTROL_MISSING result code. 322 */ 323 public static final int SORT_CONTROL_MISSING = 324 ResultCode.SORT_CONTROL_MISSING_INT_VALUE; 325 326 327 328 /** 329 * The int value for the INDEX_RANGE_ERROR result code. 330 */ 331 public static final int INDEX_RANGE_ERROR = 332 ResultCode.OFFSET_RANGE_ERROR_INT_VALUE; 333 334 335 336 /** 337 * The int value for the NAMING_VIOLATION result code. 338 */ 339 public static final int NAMING_VIOLATION = 340 ResultCode.NAMING_VIOLATION_INT_VALUE; 341 342 343 344 /** 345 * The int value for the OBJECT_CLASS_VIOLATION result code. 346 */ 347 public static final int OBJECT_CLASS_VIOLATION = 348 ResultCode.OBJECT_CLASS_VIOLATION_INT_VALUE; 349 350 351 352 /** 353 * The int value for the NOT_ALLOWED_ON_NONLEAF result code. 354 */ 355 public static final int NOT_ALLOWED_ON_NONLEAF = 356 ResultCode.NOT_ALLOWED_ON_NONLEAF_INT_VALUE; 357 358 359 360 /** 361 * The int value for the NOT_ALLOWED_ON_RDN result code. 362 */ 363 public static final int NOT_ALLOWED_ON_RDN = 364 ResultCode.NOT_ALLOWED_ON_RDN_INT_VALUE; 365 366 367 368 /** 369 * The int value for the ENTRY_ALREADY_EXISTS result code. 370 */ 371 public static final int ENTRY_ALREADY_EXISTS = 372 ResultCode.ENTRY_ALREADY_EXISTS_INT_VALUE; 373 374 375 376 /** 377 * The int value for the OBJECT_CLASS_MODS_PROHIBITED result code. 378 */ 379 public static final int OBJECT_CLASS_MODS_PROHIBITED = 380 ResultCode.OBJECT_CLASS_MODS_PROHIBITED_INT_VALUE; 381 382 383 384 /** 385 * The int value for the AFFECTS_MULTIPLE_DSAS result code. 386 */ 387 public static final int AFFECTS_MULTIPLE_DSAS = 388 ResultCode.AFFECTS_MULTIPLE_DSAS_INT_VALUE; 389 390 391 392 /** 393 * The int value for the OTHER result code. 394 */ 395 public static final int OTHER = ResultCode.OTHER_INT_VALUE; 396 397 398 399 /** 400 * The int value for the SERVER_DOWN result code. 401 */ 402 public static final int SERVER_DOWN = ResultCode.SERVER_DOWN_INT_VALUE; 403 404 405 406 /** 407 * The int value for the LDAP_TIMEOUT result code. 408 */ 409 public static final int LDAP_TIMEOUT = ResultCode.TIMEOUT_INT_VALUE; 410 411 412 413 /** 414 * The int value for the PARAM_ERROR result code. 415 */ 416 public static final int PARAM_ERROR = ResultCode.PARAM_ERROR_INT_VALUE; 417 418 419 420 /** 421 * The int value for the CONNECT_ERROR result code. 422 */ 423 public static final int CONNECT_ERROR = ResultCode.CONNECT_ERROR_INT_VALUE; 424 425 426 427 /** 428 * The int value for the LDAP_NOT_SUPPORTED result code. 429 */ 430 public static final int LDAP_NOT_SUPPORTED = 431 ResultCode.NOT_SUPPORTED_INT_VALUE; 432 433 434 435 /** 436 * The int value for the CONTROL_NOT_FOUND result code. 437 */ 438 public static final int CONTROL_NOT_FOUND = 439 ResultCode.CONTROL_NOT_FOUND_INT_VALUE; 440 441 442 443 /** 444 * The int value for the NO_RESULTS_RETURNED result code. 445 */ 446 public static final int NO_RESULTS_RETURNED = 447 ResultCode.NO_RESULTS_RETURNED_INT_VALUE; 448 449 450 451 /** 452 * The int value for the MORE_RESULTS_TO_RETURN result code. 453 */ 454 public static final int MORE_RESULTS_TO_RETURN = 455 ResultCode.MORE_RESULTS_TO_RETURN_INT_VALUE; 456 457 458 459 /** 460 * The int value for the CLIENT_LOOP result code. 461 */ 462 public static final int CLIENT_LOOP = 463 ResultCode.CLIENT_LOOP_INT_VALUE; 464 465 466 467 /** 468 * The int value for the REFERRAL_LIMIT_EXCEEDED result code. 469 */ 470 public static final int REFERRAL_LIMIT_EXCEEDED = 471 ResultCode.REFERRAL_LIMIT_EXCEEDED_INT_VALUE; 472 473 474 475 /** 476 * The serial version UID for this serializable class. 477 */ 478 private static final long serialVersionUID = 1942111440459840394L; 479 480 481 482 // The result code for this LDAP exception. 483 private final int resultCode; 484 485 // The matched DN for this LDAP exception. 486 @Nullable private final String matchedDN; 487 488 // The error message for this LDAP exception. 489 @Nullable private final String serverErrorMessage; 490 491 492 493 /** 494 * Creates a new LDAP exception with no information. 495 */ 496 public LDAPException() 497 { 498 this(null, OTHER, null, null); 499 } 500 501 502 503 /** 504 * Creates a new LDAP exception with the provided information. 505 * 506 * @param message The message for this exception, if available. 507 */ 508 public LDAPException(@Nullable final String message) 509 { 510 this(message, OTHER, null, null); 511 } 512 513 514 515 /** 516 * Creates a new LDAP exception with the provided information. 517 * 518 * @param message The message for this exception, if available. 519 * @param resultCode The result code for this exception. 520 */ 521 public LDAPException(@Nullable final String message, final int resultCode) 522 { 523 this(message, resultCode, null, null); 524 } 525 526 527 528 /** 529 * Creates a new LDAP exception with the provided information. 530 * 531 * @param message The message for this exception, if available. 532 * @param resultCode The result code for this exception. 533 * @param serverErrorMessage The error message received from the server, if 534 * available. 535 */ 536 public LDAPException(@Nullable final String message, final int resultCode, 537 @Nullable final String serverErrorMessage) 538 { 539 this(message, resultCode, serverErrorMessage, null); 540 } 541 542 543 544 /** 545 * Creates a new LDAP exception with the provided information. 546 * 547 * @param message The message for this exception, if available. 548 * @param resultCode The result code for this exception. 549 * @param serverErrorMessage The error message received from the server, if 550 * available. 551 * @param matchedDN The matched DN for this exception, if 552 * available. 553 */ 554 public LDAPException(@Nullable final String message, final int resultCode, 555 @Nullable final String serverErrorMessage, 556 @Nullable final String matchedDN) 557 { 558 super(getMessage(message, serverErrorMessage, resultCode)); 559 560 this.resultCode = resultCode; 561 this.serverErrorMessage = serverErrorMessage; 562 this.matchedDN = matchedDN; 563 } 564 565 566 567 /** 568 * Creates a new LDAP exception from the provided 569 * {@link com.unboundid.ldap.sdk.LDAPException} object. 570 * 571 * @param ldapException The {@code LDAPException} object to use to create 572 * this LDAP exception. 573 */ 574 public LDAPException( 575 @NotNull final com.unboundid.ldap.sdk.LDAPException ldapException) 576 { 577 this(ldapException.getMessage(), ldapException.getResultCode().intValue(), 578 ldapException.getMessage(), ldapException.getMatchedDN()); 579 } 580 581 582 583 /** 584 * Determines the appropriate message to use for this LDAP exception. 585 * 586 * @param message The message for this exception, if available. 587 * @param serverErrorMessage The error message received from the server, if 588 * available. 589 * @param resultCode The result code for this exception. 590 * 591 * @return The appropriate message to use for this LDAP exception. 592 */ 593 @NotNull() 594 private static String getMessage(@Nullable final String message, 595 @Nullable final String serverErrorMessage, 596 final int resultCode) 597 { 598 if ((message != null) && (! message.isEmpty())) 599 { 600 return message; 601 } 602 603 if ((serverErrorMessage != null) && (! serverErrorMessage.isEmpty())) 604 { 605 return serverErrorMessage; 606 } 607 608 return ResultCode.valueOf(resultCode).getName(); 609 } 610 611 612 613 /** 614 * Retrieves the result code for this LDAP exception. 615 * 616 * @return The result code for this LDAP exception. 617 */ 618 public int getLDAPResultCode() 619 { 620 return resultCode; 621 } 622 623 624 625 /** 626 * Retrieves the error message received from the server, if available. 627 * 628 * @return The error message received from the server, or {@code null} if 629 * none is available. 630 */ 631 @Nullable() 632 public String getLDAPErrorMessage() 633 { 634 return serverErrorMessage; 635 } 636 637 638 639 /** 640 * Retrieves the matched DN for this LDAP exception, if available. 641 * 642 * @return The matched DN for this LDAP exception, or {@code null} if none is 643 * available. 644 */ 645 @Nullable() 646 public String getMatchedDN() 647 { 648 return matchedDN; 649 } 650 651 652 653 /** 654 * Retrieves an {@link com.unboundid.ldap.sdk.LDAPException} object that is 655 * the equivalent of this LDAP exception. 656 * 657 * @return The {@code LDAPException} object that is the equivalent of this 658 * LDAP exception. 659 */ 660 @NotNull() 661 public final com.unboundid.ldap.sdk.LDAPException toLDAPException() 662 { 663 return new com.unboundid.ldap.sdk.LDAPException( 664 ResultCode.valueOf(resultCode), getMessage(), matchedDN, null); 665 } 666 667 668 669 /** 670 * Retrieves a string representation of the result code for this LDAP 671 * exception. 672 * 673 * @return A string representation of the result code for this LDAP 674 * exception. 675 */ 676 @NotNull() 677 public String errorCodeToString() 678 { 679 return ResultCode.valueOf(resultCode).getName(); 680 } 681 682 683 684 /** 685 * Retrieves a string representation of the result code for this LDAP 686 * exception. 687 * 688 * @param l The locale for the string representation. 689 * 690 * @return A string representation of the result code for this LDAP 691 * exception. 692 */ 693 @NotNull() 694 public String errorCodeToString(@Nullable final Locale l) 695 { 696 return ResultCode.valueOf(resultCode).getName(); 697 } 698 699 700 701 /** 702 * Retrieves a string representation of the result code for this LDAP 703 * exception. 704 * 705 * @param code The result code for which to retrieve the corresponding 706 * message. 707 * 708 * @return A string representation of the result code for this LDAP 709 * exception. 710 */ 711 @NotNull() 712 public static String errorCodeToString(final int code) 713 { 714 return ResultCode.valueOf(code).getName(); 715 } 716 717 718 719 /** 720 * Retrieves a string representation of the result code for this LDAP 721 * exception. 722 * 723 * @param code The result code for which to retrieve the corresponding 724 * message. 725 * @param locale The locale for the string representation. 726 * 727 * @return A string representation of the result code for this LDAP 728 * exception. 729 */ 730 @NotNull() 731 public static String errorCodeToString(final int code, 732 @Nullable final Locale locale) 733 { 734 return ResultCode.valueOf(code).getName(); 735 } 736 737 738 739 /** 740 * Retrieves a string representation of this LDAP exception. 741 * 742 * @return A string representation of this LDAP exception. 743 */ 744 @Override() 745 @NotNull() 746 public String toString() 747 { 748 return toLDAPException().toString(); 749 } 750}