001 /* 002 * file StpException.java 003 * 004 * Licensed Materials - Property of IBM 005 * Restricted Materials of IBM 006 * 007 * com.ibm.rational.wvcm.stp.StpException 008 * 009 * (C) Copyright IBM Corporation 2006, 2010. All Rights Reserved. 010 * Note to U.S. Government Users Restricted Rights: Use, duplication or 011 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 012 */ 013 014 package com.ibm.rational.wvcm.stp; 015 016 import javax.wvcm.Feedback; 017 import javax.wvcm.Resource; 018 import javax.wvcm.WvcmException; 019 020 import com.ibm.rational.wvcm.stpex.StpExEnumeration; 021 import com.ibm.rational.wvcm.stpex.annotation.RpcEnum; 022 023 /** 024 * An extension of {@link javax.wvcm.WvcmException javax.wvcm.WvcmException} 025 * used throughout this API. Although API methods are declared to throw 026 * WvcmException, the exception actually thrown is StpException or one of its 027 * subclasses. 028 * <p> 029 * This class extends the WvcmException class, adding a <i>sub-reason code</i> 030 * field that encodes conditions specific to this API more finely than the 031 * {@link javax.wvcm.WvcmException.ReasonCode} 032 * <p> 033 * This class (unlike the WvcmException class) leverages the Java 1.4 chained 034 * exception mechanism. By default, if an StpException is constructed from one 035 * or more nested Throwables, the first nested Throwable in the list is also set 036 * as the StpException's {@link java.lang.Throwable#initCause cause}. In 037 * certain special cases, the cause may be set to something other than the first 038 * nested Throwable. 039 * 040 * Exception classes that extend StpException because they convey additional 041 * information, are as follows: 042 * <ul> 043 * <li>{@link StpPropertyException} - adds name of property responsible for the 044 * exception 045 * <p> 046 * <li>{@link StpPartialResultsException} - holds a ResourceList of child 047 * resources successfully received, a nested list of Exceptions for child 048 * resources that could not be retrieved, and an indicator of whether the two 049 * lists completely identify all resources that were supposed to be retrieved. 050 * <p> 051 * </ul> 052 */ 053 public abstract class StpException extends WvcmException 054 { 055 /** 056 * The specification for the data implementation object associated with this 057 * exception. 058 */ 059 public interface Data { 060 public String getMessage(); 061 public StpReasonCode getStpReasonCode(); 062 public String toString(); 063 } 064 065 /** 066 * An encoding of exception conditions specific to this API. Each 067 * StpReasonCode maps to one WvcmException.ReasonCode, but, because the 068 * granularity of the StpReasonCode enumeration is finer than that of the 069 * ReasonCode, the mapping may be many-to-one. 070 * <p> 071 * 072 * When the correspondence between an StpReasonCode and a ReasonCode is not 073 * obvious, the StpReasonCode is mapped to either ReasonCode.CONFLICT or 074 * ReasonCode.FORBIDDEN 075 * using the following rationale: 076 * <p> 077 * <ul> 078 * <li>{@link javax.wvcm.WvcmException.ReasonCode#CONFLICT CONFLICT} - the exception 079 * relates to an issue where the client may be able to retry the method 080 * after changing the state on some object. 081 * 082 * <li>{@link javax.wvcm.WvcmException.ReasonCode#FORBIDDEN FORBIDDEN} - the 083 * exception relates to an issue where the client cannot do anything to 084 * retry the method. 085 * </ul> 086 * 087 * For conditions where there is not enough information to decide whether or 088 * not there is anything the client could do to retry the method, the 089 * StpReasonCode is classified as CONFLICT. 090 * <p> 091 */ 092 093 public static enum StpReasonCode implements StpExEnumeration 094 { 095 /** 096 * The request timed out waiting for a resource to become free. 097 */ 098 @RpcEnum(id=72) 099 REQUEST_TIMED_OUT(ReasonCode.ABORTED), 100 101 /** 102 * <code>Precondition:</code> Cannot create this resource at the 103 * specified location. 104 */ 105 @RpcEnum(id=7) 106 CANNOT_CREATE_AT_THIS_LOCATION, 107 108 /** 109 * <code>Precondition:</code> Operation failed because it attempted to 110 * set a protected property. 111 */ 112 @RpcEnum(id=9) 113 CANNOT_MODIFY_PROTECTED_PROPERTY, 114 115 /** Cannot overwrite existing binding. */ 116 @RpcEnum(id=10) 117 CANNOT_OVERWRITE, 118 119 /** 120 * The operation cannot be performed because of a conflict with resource 121 * state. 122 */ 123 @RpcEnum(id=17) 124 CONFLICT, 125 126 /** 127 * A checkout was attempted with no explicit activity and no current 128 * activity in the workspace. 129 */ 130 @RpcEnum(id=0) 131 ACTIVITY_NEEDED(ReasonCode.CONFLICT), 132 133 /** 134 * The specified record is already being edited (by the same user). 135 */ 136 @RpcEnum(id=1) 137 ALREADY_BEING_EDITED(ReasonCode.CONFLICT), 138 139 /** 140 * Authentication information is required but client didn't provide any. 141 */ 142 @RpcEnum(id=2) 143 AUTHENTICATION_INFO_REQUIRED(ReasonCode.CONFLICT), 144 145 /** 146 * The requested action is inappropriate for the current state of the 147 * query (precondition failure) 148 */ 149 @RpcEnum(id=5) 150 BAD_SOURCE_STATE(ReasonCode.CONFLICT), 151 152 /** 153 * The checkin operation failed because the resource is not checked out. 154 */ 155 @RpcEnum(id=6) 156 CANNOT_CHECKIN_MUST_BE_CHECKED_OUT(ReasonCode.CONFLICT), 157 158 /** 159 * Used when a string is not supported by the server's operating system. 160 */ 161 @RpcEnum(id=8) 162 CANNOT_ENCODE_STRING(ReasonCode.CONFLICT), 163 164 /** 165 * The uncheckout operation failed because the resource is not checked 166 * out. 167 */ 168 @RpcEnum(id=11) 169 CANNOT_UNCHECKOUT_MUST_BE_CHECKED_OUT(ReasonCode.CONFLICT), 170 171 /** 172 * Checkout failed because the branch was not mastered locally. 173 */ 174 @RpcEnum(id=86) 175 CHECKOUT_BRANCH_NOT_MASTERED(ReasonCode.CONFLICT), 176 177 /** 178 * Checkout failed because the branch type was not mastered locally. 179 */ 180 @RpcEnum(id=87) 181 CHECKOUT_BRTYPE_NOT_MASTERED(ReasonCode.CONFLICT), 182 183 /** Version being checked out is not the latest **/ 184 @RpcEnum(id=12) 185 CHECKOUT_NOT_LATEST(ReasonCode.CONFLICT), 186 187 /** The client location is not within a file area */ 188 @RpcEnum(id=15) 189 CLIENT_LOCATION_NOT_IN_FILE_AREA(ReasonCode.CONFLICT), 190 191 /** A communication precondition failed */ 192 @RpcEnum(id=16) 193 CONDITIONAL_EXECUTION(ReasonCode.CONFLICT), 194 195 /** 196 * An operation failed because the connection to the remote server could 197 * not be established or terminated prematurely after being established. 198 */ 199 @RpcEnum(id=18) 200 CONNECTION_FAILED(ReasonCode.CONFLICT), 201 202 /** 203 * An attempt to deliver a resource from the change context to the 204 * database failed. 205 */ 206 @RpcEnum(id=20) 207 DELIVERY_ERROR(ReasonCode.CONFLICT), 208 209 /** Version discordance detected **/ 210 @RpcEnum(id=22) 211 DISCORDANCE_VERSION(ReasonCode.CONFLICT), 212 213 /** Duplicate activity name **/ 214 @RpcEnum(id=23) 215 DUPLICATE_ACTIVITY_NAME(ReasonCode.CONFLICT), 216 217 /** Duplicate stream name **/ 218 @RpcEnum(id=24) 219 DUPLICATE_STREAM_NAME(ReasonCode.CONFLICT), 220 221 /** 222 * This code indicates that an external lock couldn't be acquired 223 * because the lock already exists. 224 */ 225 @RpcEnum(id=25) 226 EXTERNAL_LOCK_ALREADY_PRESENT(ReasonCode.CONFLICT), 227 228 /** 229 * Some dependency required by the communication channel failed. 230 */ 231 @RpcEnum(id=26) 232 FAILED_DEPENDENCY(ReasonCode.CONFLICT), 233 234 /** 235 * A field did not pass validation during an attempted delivery. 236 */ 237 @RpcEnum(id=27) 238 FIELD_VALIDATION(ReasonCode.CONFLICT), 239 240 /** 241 * The client resource resides in a file area whose version is not 242 * compatible with the currently running software. The file area needs 243 * to be upgraded in order to work with this software. 244 */ 245 @RpcEnum(id=28) 246 FILE_AREA_NEEDS_UPGRADE(ReasonCode.CONFLICT), 247 248 /** A file error was encountered */ 249 @RpcEnum(id=29) 250 FILE_ERROR(ReasonCode.CONFLICT), 251 252 /** 253 * While firing a named ClearQuest hook, the hook returned a message, 254 * which generally represents an error or need for additional 255 * information 256 */ 257 @RpcEnum(id=32) 258 HOOK_RETURNED_MESSAGE(ReasonCode.CONFLICT), 259 260 /** 261 * An in-line query definition during query execution 262 */ 263 @RpcEnum(id=35) 264 ILLEGAL_QUERY(ReasonCode.CONFLICT), 265 266 /** 267 * The client resource resides in a file area whose version is not 268 * compatible with the currently running software. The software needs to 269 * be upgraded to handle this file area. 270 */ 271 @RpcEnum(id=36) 272 INCOMPATIBLE_FILE_AREA_VERSION(ReasonCode.CONFLICT), 273 274 /** Insufficient permission for the requested operation */ 275 @RpcEnum(id=37) 276 INSUFFICIENT_PERMISSION(ReasonCode.CONFLICT), 277 278 /** An interaction request has occurred */ 279 @RpcEnum(id=38) 280 INTERACTION_REQUEST(ReasonCode.CONFLICT), 281 282 /** An internal error has occurred */ 283 @RpcEnum(id=39) 284 INTERNAL_ERROR(ReasonCode.CONFLICT), 285 286 /** 287 * The provider's server encountered an unexpected internal error 288 * condition which prevented it from fulfilling the request. This 289 * loosely corresponds to an HTTP 500 Internal Server Error response 290 * from the server. 291 * 292 * @see #SERVER_ERROR 293 */ 294 @RpcEnum(id=40) 295 INTERNAL_SERVER_ERROR(ReasonCode.CONFLICT), 296 297 /** 298 * A required field is missing from or malformed in an StpLocation 299 * specification. 300 */ 301 @RpcEnum(id=42) 302 INVALID_OBJECT_SELECTOR(ReasonCode.CONFLICT), 303 304 /** An invalid response was received */ 305 @RpcEnum(id=43) 306 INVALID_RESPONSE(ReasonCode.CONFLICT), 307 308 /** 309 * Completion of operation was prevented because one or more properties 310 * have invalid values 311 */ 312 @RpcEnum(id=44) 313 INVALID_VALUES(ReasonCode.CONFLICT), 314 315 /** License error occurred **/ 316 @RpcEnum(id=45) 317 LICENSE_ERROR(ReasonCode.CONFLICT), 318 319 /** The database to be affected is currently locked */ 320 @RpcEnum(id=46) 321 LOCKED_DATABASE(ReasonCode.CONFLICT), 322 323 /** The name supplied for a new resource is invalid */ 324 @RpcEnum(id=48) 325 NAME_MUST_BE_VALID(ReasonCode.CONFLICT), 326 327 /** Resource needs to be merged from latest version **/ 328 @RpcEnum(id=49) 329 NEEDS_MERGE_FROM_LATEST(ReasonCode.CONFLICT), 330 331 /** For use when StpException is just a wrapper for a WvcmException */ 332 @RpcEnum(id=50) 333 NONE(ReasonCode.CONFLICT), 334 335 /** 336 * A duplicate record is specified but the action is not a duplicate 337 * action. 338 */ 339 @RpcEnum(id=52) 340 NOT_DUPLICATE_ACTION(ReasonCode.CONFLICT), 341 342 /** A parameter mismatch was detected in a response */ 343 @RpcEnum(id=57) 344 PARAMETER_MISMATCH(ReasonCode.CONFLICT), 345 346 /** The parent of a targeted resource needs to exist, but doesn't */ 347 @RpcEnum(id=58) 348 PARENT_MUST_EXIST(ReasonCode.CONFLICT), 349 350 /** 351 * This exception is reporting failure in an operation that was applied 352 * independently to multiple resources and failed on some of them. 353 * 354 * @see StpPartialResultsException 355 */ 356 @RpcEnum(id=59) 357 PARTIAL_RESULTS(ReasonCode.CONFLICT), 358 359 /** Used when delivering change contexts */ 360 @RpcEnum(id=60) 361 PRIOR_COMMIT_FAILURE(ReasonCode.CONFLICT), 362 363 /** 364 * Some other property error such as 365 * <ul> 366 * <li>Can't update value because it is inappropriate for property. 367 * <li>Can't update value because of server-specific restriction such 368 * as length of string or list. 369 * <li> 370 * </ul> 371 */ 372 @RpcEnum(id=61) 373 PROPERTY_ERROR(ReasonCode.CONFLICT), 374 375 /** 376 * An exception with this StpReasonCode is thrown by the execution of 377 * any property "getter" method when the targeted property could not be 378 * retrieved from the server. Exceptions of this type wrap the exception 379 * generated by the server, which is accessible via the getCause() or 380 * {@link javax.wvcm.WvcmException#getNestedExceptions()} methods of 381 * this wrapping exception. 382 * <p> 383 * The traceback for the outer, PROPERTY_RETRIEVAL_FAILED exception will 384 * identify the context in which the attempt was made to get the 385 * property value from the proxy, while the traceback for the cause of 386 * that exception will identify the context in which the attempt was 387 * made to read the value into the proxy. 388 */ 389 @RpcEnum(id=68) 390 PROPERTY_RETRIEVAL_FAILED(ReasonCode.CONFLICT), 391 392 /** 393 * Thrown by CreateRecord when an attempt is made to create a record with 394 * the same name as one that already exists on the server. 395 */ 396 @RpcEnum(id=70) 397 RECORD_WITH_SAME_DISPLAYNAME_EXISTS(ReasonCode.CONFLICT), 398 399 /** Request failed error **/ 400 @RpcEnum(id=71) 401 REQUEST_FAILED_ERROR(ReasonCode.CONFLICT), 402 403 /** 404 * The provider has detected something inappropriate with a server's 405 * response. It could be the result of a bug in the server's response or 406 * a bug in the provider's processing of the response. 407 * 408 * @see #INTERNAL_SERVER_ERROR 409 */ 410 @RpcEnum(id=75) 411 SERVER_ERROR(ReasonCode.CONFLICT), 412 413 /** View update cancel failed **/ 414 @RpcEnum(id=79) 415 SYNC_CANCEL_FAILED(ReasonCode.CONFLICT), 416 417 /** 418 * View's config spec is not synchronized with stream's configuration. 419 * An update view operation is required. 420 */ 421 @RpcEnum(id=83) 422 VIEW_OUT_OF_SYNC_WITH_STREAM(ReasonCode.CONFLICT), 423 424 /** 425 * The provider was unable to complete the operation for an unspecified 426 * reason. 427 */ 428 @RpcEnum(id=31) 429 FORBIDDEN, 430 431 /** Request not understood or contextually incorrect for the provider. */ 432 @RpcEnum(id=4) 433 BAD_REQUEST(ReasonCode.FORBIDDEN), 434 435 /** Used by REVERT method */ 436 @RpcEnum(id=14) 437 CHILD_ORIGINAL_SOURCE_DIRECTORY_NO_LONGER_EXISTS(ReasonCode.FORBIDDEN), 438 439 /** Used by REVERT method */ 440 @RpcEnum(id=13) 441 CHILDREN_OF_FOLDER_MUST_BE_REVERTED_FIRST(ReasonCode.FORBIDDEN), 442 443 /** 444 * Used when an operation is forbidden due to operating in disconnected 445 * mode 446 */ 447 @RpcEnum(id=21) 448 DISCONNECTED(ReasonCode.FORBIDDEN), 449 450 /** Used when trying to delete query folders */ 451 @RpcEnum(id=30) 452 FOLDER_HAS_CHILDREN(ReasonCode.FORBIDDEN), 453 454 /** An illegal argument was specified */ 455 @RpcEnum(id=33) 456 ILLEGAL_ARG(ReasonCode.FORBIDDEN), 457 458 /** The request or operation in not valid */ 459 @RpcEnum(id=41) 460 INVALID(ReasonCode.FORBIDDEN), 461 462 /** 463 * Thrown by OpenRecord when a duplicate record is not specified with a 464 * duplicate action. 465 */ 466 @RpcEnum(id=56) 467 NO_DUPLICATE_RECORD(ReasonCode.FORBIDDEN), 468 469 /** Request not allowed by the provider. */ 470 @RpcEnum(id=51) 471 NOT_ALLOWED(ReasonCode.FORBIDDEN), 472 473 /** The request or operation is not supported */ 474 @RpcEnum(id=54) 475 NOT_SUPPORTED(ReasonCode.FORBIDDEN), 476 477 /** The submit request is not allowed */ 478 @RpcEnum(id=77) 479 SUBMIT_NOT_ALLOWED(ReasonCode.FORBIDDEN), 480 481 /** 482 * Thrown by OpenRecord when the specified action is not defined for the 483 * record type. 484 */ 485 @RpcEnum(id=81) 486 UNKNOWN_ACTION(ReasonCode.FORBIDDEN), 487 488 /** 489 * Thrown when a report has been requested on resource that does not 490 * support that report type. 491 */ 492 @RpcEnum(id=82) 493 UNSUPPORTED_REPORT(ReasonCode.FORBIDDEN), 494 495 /** Illegal syntax for location string value. */ 496 @RpcEnum(id=34) 497 ILLEGAL_LOCATION_SYNTAX, 498 499 /** 500 * <code>Precondition:</code> Report failed since the resource does 501 * not support the specified report. 502 */ 503 @RpcEnum(id=3) 504 BAD_REPORT(ReasonCode.METHOD_NOT_SUPPORTED), 505 506 /** The resource has no content. */ 507 @RpcEnum(id=55) 508 NO_CONTENT(ReasonCode.METHOD_NOT_SUPPORTED), 509 510 /** 511 * The corresponding remote resource no longer exists or was never 512 * created. 513 */ 514 @RpcEnum(id=53) 515 NOT_FOUND, 516 517 /** 518 * <code>Precondition:</code> Failed to retrieve a property that 519 * should be supported. A potentially recoverable condition prevented 520 * the server from retrieving the property value. 521 */ 522 @RpcEnum(id=63) 523 PROPERTY_NOT_CURRENTLY_AVAILABLE, 524 525 /** 526 * The requested property value is unavailable because it is not valid 527 * for the targeted resource--the property name used is not defined in 528 * the targeted resource's interface nor is it included in the 529 * PropertyRequest returned by 530 * {@link javax.wvcm.Resource#doGetPropertyNameList(Feedback)} for the 531 * resource. 532 */ 533 @RpcEnum(id=64) 534 PROPERTY_NOT_DEFINED_FOR_RESOURCE, 535 536 /** 537 * The property value is maintained only on the server and so is not 538 * available locally 539 */ 540 @RpcEnum(id=62) 541 PROPERTY_NOT_AVAILABLE_LOCALLY(ReasonCode.PROPERTY_NOT_DEFINED_FOR_RESOURCE), 542 543 /** 544 * The property value is unavailable because it was not in the property 545 * name list when the proxy was created nor has it subsequently been 546 * added via {@link Resource#setProperty} or one of the other property 547 * setters. 548 */ 549 @RpcEnum(id=65) 550 PROPERTY_NOT_REQUESTED, 551 552 /** 553 * Even though this API says the property is valid for the targeted 554 * resource, the server does not support it. For properties the server 555 * intends to support in the release under development, the exception 556 * message should say “NOT YET IMPLEMENTED”. 557 */ 558 @RpcEnum(id=66) 559 PROPERTY_NOT_SUPPORTED_BY_SERVER, 560 561 /** The property value update would overwrite an earlier change. */ 562 @RpcEnum(id=67) 563 PROPERTY_OVERWRITE_FORBIDDEN, 564 565 /** The provider suffered an I/O failure, the operation may be retried. */ 566 @RpcEnum(id=69) 567 READ_FAILED, 568 569 /** 570 * <code>Precondition:</code> Creating a resource failed because a 571 * resource already exists at the specified location. 572 */ 573 @RpcEnum(id=73) 574 RESOURCE_ALREADY_EXISTS_AT_LOCATION, 575 576 /** View update was canceled **/ 577 SYNC_CANCELLED (ReasonCode.CONFLICT), 578 579 /** The user is not authorized to execute the attempted operation. */ 580 @RpcEnum(id=80) 581 UNAUTHORIZED, 582 583 /** Login on server failed**/ 584 @RpcEnum(id=47) 585 LOGIN_FAILED(ReasonCode.UNAUTHORIZED), 586 587 /** The provider suffered an I/O failure, the operation may be retried. */ 588 @RpcEnum(id=84) 589 WRITE_FAILED, 590 591 /** 592 * Session does not exist or the session has expired. 593 */ 594 @RpcEnum(id=76) 595 SESSION_EXPIRED_OR_DOES_NOT_EXIST(ReasonCode.UNAUTHORIZED), 596 597 /** 598 * Used if an operation requires credentials but none were provided 599 */ 600 @RpcEnum(id=19) 601 CREDENTIALS_REQUIRED(ReasonCode.UNAUTHORIZED), 602 603 /** 604 * Used when the server capacity has been reached. 605 */ 606 @RpcEnum(id=74) 607 SERVER_BUSY(ReasonCode.CONFLICT), 608 609 /** 610 * Used when the client is not compatible with the server. (This may 611 * be caused by a client that is too old, or too new.) 612 */ 613 @RpcEnum(id=85) 614 INCOMPATIBLE_SERVER(ReasonCode.VERSION_NOT_SUPPORTED), 615 616 @RpcEnum(id=88) 617 RPC_UNEXPECTEDLY_EXITED(ReasonCode.CONFLICT), 618 619 @RpcEnum(id=89) 620 UNEXPECTED_EXCEPTION(ReasonCode.CONFLICT), 621 622 ; 623 /* end of enum StpReasonCode */; 624 625 // ==================================================================== 626 627 /** 628 * Returns the WVCM base reason code associated with this STP reason 629 * code. 630 * 631 * @return The WVCM reason code associated with this STP reason code. 632 */ 633 public ReasonCode getWvcmReasonCode() 634 { 635 return m_wvcmReasonCode; 636 } 637 638 /* 639 * A string representation of this reason code. 640 */ 641 public String toString() 642 { 643 return name().toLowerCase().replaceAll("_", "-"); 644 } 645 646 /** 647 * Constructs an StpReasonCode that is semantically equivalent to the 648 * WVCM ReasonCode of the same name. 649 */ 650 private StpReasonCode() 651 { 652 m_wvcmReasonCode = ReasonCode.valueOf(ReasonCode.class, name()); 653 } 654 655 /** 656 * Constructs an StpReasonCode as a refinement of a WVCM base 657 * ReasonCode. 658 * 659 * @param wvcmBaseCode The WVCM reason code that this StpReasonCode 660 * refines. Cannot be <code>null</code>. 661 */ 662 private StpReasonCode(ReasonCode wvcmBaseCode) 663 { 664 m_wvcmReasonCode = wvcmBaseCode; 665 } 666 667 /** 668 * The WVCM reason code classification for this SubReasonCode. 669 */ 670 private final ReasonCode m_wvcmReasonCode; 671 } 672 673 /** 674 * Casts an Object to a Type, avoiding a type safety warning. Use sparingly. 675 * May throw ClassCastException at runtime. Some Java compilers can deduce 676 * U from context, such as in an assignment or a return statement; however, 677 * others may not. It is suggested, therefore, that all uses of this method 678 * should include the target type explicitly. 679 * <pre> 680 * StpException.<desired-type>unchecked_cast(x) 681 * </pre> 682 * The ugliness of this construct matches the sledge hammer that is being 683 * used to make the code compile without warnings. 684 * 685 * @param <U> The Type to which the object should be cast 686 * @param obj The Object to be cast 687 * @return The argument Object cast to Type U. 688 */ 689 @SuppressWarnings("unchecked") 690 public static <U> U unchecked_cast(Object obj) 691 { 692 return (U)obj; 693 } 694 695 /** 696 * @return Returns an implementation object that stores the fields of this 697 * exception not defined by WvcmException and implements the other 698 * methods of this exception. Will never be <b>null</b>. 699 */ 700 public abstract Data data(); 701 702 /** 703 * Localizes the message contained within this exception and returns it. 704 */ 705 public String getMessage() { return data().getMessage(); } 706 707 /** 708 * @return The StpReasonCode assigned to this exception. 709 */ 710 public StpReasonCode getStpReasonCode() 711 { return data().getStpReasonCode(); } 712 713 /** 714 * @return A String image of this StpException and any nested Exceptions 715 */ 716 public String toString() { return data().toString(); } 717 718 /** 719 * Constructs this exception object for its subclasses. 720 * 721 * @param resource The Resource argument to WvcmException 722 * @param reasonCode The ReasonCode argument to WvcmException 723 * @param nestedExceptions The Throwable[] argument to WvcmException 724 * 725 * @see javax.wvcm.WvcmException 726 */ 727 protected StpException(Resource resource, 728 ReasonCode reasonCode, 729 Throwable... nestedExceptions) 730 { 731 super(null, resource, reasonCode, nestedExceptions); 732 } 733 }