001/* 002 * The MIT License 003 * Copyright (c) 2012 Microsoft Corporation 004 * 005 * Permission is hereby granted, free of charge, to any person obtaining a copy 006 * of this software and associated documentation files (the "Software"), to deal 007 * in the Software without restriction, including without limitation the rights 008 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 009 * copies of the Software, and to permit persons to whom the Software is 010 * furnished to do so, subject to the following conditions: 011 * 012 * The above copyright notice and this permission notice shall be included in 013 * all copies or substantial portions of the Software. 014 * 015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 018 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 020 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 021 * THE SOFTWARE. 022 */ 023 024package microsoft.exchange.webservices.data.core.exception.service.remote; 025 026import microsoft.exchange.webservices.data.core.response.ServiceResponse; 027import microsoft.exchange.webservices.data.core.enumeration.misc.error.ServiceError; 028 029/** 030 * Represents a remote service exception that has a single response. 031 */ 032public class ServiceResponseException extends ServiceRemoteException { 033 034 /** 035 * Constant serialized ID used for compatibility. 036 */ 037 private static final long serialVersionUID = 1L; 038 039 /** 040 * Error details Value keys. 041 */ 042 private static final String ExceptionClassKey = "ExceptionClass"; 043 044 /** 045 * The Exception message key. 046 */ 047 private static final String ExceptionMessageKey = "ExceptionMessage"; 048 049 /** 050 * The Stack trace key. 051 */ 052 private static final String StackTraceKey = "StackTrace"; 053 054 /** 055 * ServiceResponse when service operation failed remotely. 056 */ 057 private ServiceResponse response; 058 059 /** 060 * Initializes a new instance. 061 * 062 * @param response the response 063 */ 064 public ServiceResponseException(ServiceResponse response) { 065 this.response = response; 066 } 067 068 /** 069 * Gets the ServiceResponse for the exception. 070 * 071 * @return the response 072 */ 073 public ServiceResponse getResponse() { 074 return response; 075 } 076 077 /** 078 * Gets the service error code. 079 * 080 * @return the error code 081 */ 082 public ServiceError getErrorCode() { 083 return this.response.getErrorCode(); 084 } 085 086 /** 087 * Gets a message that describes the current exception. 088 * 089 * @return The error message that explains the reason for the exception. 090 */ 091 092 public String getMessage() { 093 094 // Bug E14:134792 -- Special case for Internal Server Error. If the 095 // server returned 096 // stack trace information, include it in the exception message. 097 if (this.response.getErrorCode() == ServiceError.ErrorInternalServerError) { 098 String exceptionClass; 099 String exceptionMessage; 100 String stackTrace; 101 102 if (this.response.getErrorDetails().containsKey(ExceptionClassKey) && 103 this.response.getErrorDetails().containsKey( 104 ExceptionMessageKey) && 105 this.response.getErrorDetails().containsKey( 106 StackTraceKey)) { 107 exceptionClass = this.response.getErrorDetails().get( 108 ExceptionClassKey); 109 exceptionMessage = this.response.getErrorDetails().get( 110 ExceptionMessageKey); 111 stackTrace = this.response.getErrorDetails().get(StackTraceKey); 112 113 // return 114 return String.format("%s -- Server Error: %s: %s %s", this.response 115 .getErrorMessage(), exceptionClass, 116 exceptionMessage, stackTrace); 117 } 118 } 119 120 return this.response.getErrorMessage(); 121 } 122}