/// <summary>
 /// Performs validation and business logic checks on the RemoveCourseCallNumbersRequest values
 /// </summary>
 /// <param name="request"><see cref="RemoveCourseCallNumbersRequest">object</see></param>
 /// <exception cref="ArgumentNullException">Thrown when a required value is not set in the <see cref="RemoveCourseCallNumbersRequest">object</see></exception>
 /// <exception cref="ArgumentException">Thrown when there is a conflict between the values in the <see cref="RemoveCourseCallNumbersRequest">object</see></exception>
 private static void ValidateRemoveCourseCallNumbersRequest(RemoveCourseCallNumbersRequest request)
 {
     // Perform a Parameter Validation and Business Logice Check on the Request
     if (request.ClientString == null)
         throw new ArgumentNullException("The ClientString value is required.  Please correct and try the reqeust again.");
     else if (request.DestinationCourseCallNumber == null && request.DestinationCourseId == null)
         throw new ArgumentNullException("Either a DestinationCourseCallNumber or DestinationCourseId value is required.  Please correct and try the request again.");
     else if (request.RemoveCourseCallNumbers == null)
         throw new ArgumentNullException("The RemoveCourseCallNumbers value is required.  Please correct and try the request again.");
     else if (request.DestinationCourseCallNumber != null && request.DestinationCourseId != null)
         throw new ArgumentException("The DestinationCourseCallNumber and DestinationCourseId values are mutually exclusive.  Only set one of the values for a given Destination Course.  Please correct and try the request again.");
 }
        /// <summary>
        /// Creates the XML payload for the RemoveCourseCallNumbers Course API Request
        /// </summary>
        /// <param name="request"><see cref="RemoveCoruseCallNumbersRequest">object</see></param>
        /// <returns><see cref="API.CallNumbersRemoveRequest"/>object</returns>
        private API.CallNumbersRemoveRequest SetRemoveCourseCallNumbersRequest(RemoveCourseCallNumbersRequest request)
        {
            // Initialize and Set the RemoveCourseCallNumbersRequest
            API.CallNumbersRemoveRequest removeCourseCallNumbers = new API.CallNumbersRemoveRequest();
            removeCourseCallNumbers.ClientString = request.ClientString;
            removeCourseCallNumbers.DestinationCourseIdentifier = new API.CourseIdentifier();

            // If removing more then 1 CallNumber set CourseCallNumbers object accordingly
            if (request.RemoveCourseCallNumbers.Length > 1)
            {
                // Initialize the CourseCallNumbers Object
                removeCourseCallNumbers.DestinationCourseIdentifier.CourseCallNumbers = new API.CourseCallNumber[request.RemoveCourseCallNumbers.Length];

                // Loop through the Call Numbers in the Request
                for (int i = 0; i < request.RemoveCourseCallNumbers.Length; i++)
                {
                    removeCourseCallNumbers.DestinationCourseIdentifier.CourseCallNumbers[i] = new API.CourseCallNumber();
                    removeCourseCallNumbers.DestinationCourseIdentifier.CourseCallNumbers[i].ClientCallNumber = request.RemoveCourseCallNumbers[i];
                }
            }
            else
            {
                // Only 1 CallNumber to remove, set accordingly
                removeCourseCallNumbers.DestinationCourseIdentifier.CourseCallNumbers = new API.CourseCallNumber[1];
                removeCourseCallNumbers.DestinationCourseIdentifier.CourseCallNumbers[0] = new API.CourseCallNumber();
                removeCourseCallNumbers.DestinationCourseIdentifier.CourseCallNumbers[0].ClientCallNumber = request.RemoveCourseCallNumbers[0];
            }

            // Set the DestinationIdentifier accordingly
            if (request.DestinationCourseId != null)
            {
                removeCourseCallNumbers.DestinationCourseIdentifier.ID = request.DestinationCourseId;
                removeCourseCallNumbers.DestinationCourseIdentifier.MappingType = API.MappedIDType.CourseID;
            }
            else
            {
                removeCourseCallNumbers.DestinationCourseIdentifier.ID = request.DestinationCourseCallNumber;
                removeCourseCallNumbers.DestinationCourseIdentifier.MappingType = API.MappedIDType.CallNumber;
            }

            return removeCourseCallNumbers;
        }
        /// <summary>
        /// Generates a RemoveCourseCallNumbers Course API Request
        /// </summary>
        /// <param name="request"><see cref="RevmoveCourseCallNumbersRequest">object</see></param>
        /// <returns><see cref="Response"/>object</returns>
        public Response RemoveCourseCallNumbers(RemoveCourseCallNumbersRequest request)
        {
            API.CallNumbersRemoveRequest removeCourseCallNumbers = null;
            Response response = null;

            try
            {
                // Validate the Request Object
                ValidateRemoveCourseCallNumbersRequest(request);

                // Intialize and Set the RemoveCourseCallNumbersRequest
                removeCourseCallNumbers = SetRemoveCourseCallNumbersRequest(request);

                // Build the Response object from the SOAP response
                response = ReadRemoveCourseCallNumbersResponse(removeCourseCallNumbers);
            }
            catch (Exception ex)
            {
                Logger.Error("Exception from RemoveCourseCallNumbers: ", ex);
                throw;
            }
            finally
            {
                if (this.courseAPI != null)
                    this.courseAPI.Close();
            }

            return response;
        }