com.microsoft.exchange.impl.ExchangeResponseUtilsImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.exchange.impl.ExchangeResponseUtilsImpl.java

Source

/**
 * See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Board of Regents of the University of Wisconsin System
 * licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a
 * copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package com.microsoft.exchange.impl;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.xml.bind.JAXBElement;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.CollectionUtils;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import com.microsoft.exchange.ExchangeResponseUtils;
import com.microsoft.exchange.exception.ExchangeCannotDeleteRuntimeException;
import com.microsoft.exchange.exception.ExchangeExceededFindCountLimitRuntimeException;
import com.microsoft.exchange.exception.ExchangeItemNotFoundRuntimeException;
import com.microsoft.exchange.exception.ExchangeRuntimeException;
import com.microsoft.exchange.exception.ExchangeTimeoutRuntimeException;
import com.microsoft.exchange.messages.ArrayOfFreeBusyResponse;
import com.microsoft.exchange.messages.ArrayOfResponseMessagesType;
import com.microsoft.exchange.messages.BaseResponseMessageType;
import com.microsoft.exchange.messages.CreateFolderResponse;
import com.microsoft.exchange.messages.CreateItemResponse;
import com.microsoft.exchange.messages.DeleteFolderResponse;
import com.microsoft.exchange.messages.EmptyFolderResponse;
import com.microsoft.exchange.messages.FindFolderResponse;
import com.microsoft.exchange.messages.FindFolderResponseMessageType;
import com.microsoft.exchange.messages.FindItemResponse;
import com.microsoft.exchange.messages.FindItemResponseMessageType;
import com.microsoft.exchange.messages.FolderInfoResponseMessageType;
import com.microsoft.exchange.messages.FreeBusyResponseType;
import com.microsoft.exchange.messages.GetFolderResponse;
import com.microsoft.exchange.messages.GetItemResponse;
import com.microsoft.exchange.messages.GetServerTimeZonesResponse;
import com.microsoft.exchange.messages.GetServerTimeZonesResponseMessageType;
import com.microsoft.exchange.messages.GetUserAvailabilityResponse;
import com.microsoft.exchange.messages.ItemInfoResponseMessageType;
import com.microsoft.exchange.messages.ResolveNamesResponse;
import com.microsoft.exchange.messages.ResolveNamesResponseMessageType;
import com.microsoft.exchange.messages.ResponseCodeType;
import com.microsoft.exchange.messages.ResponseMessageType;
import com.microsoft.exchange.messages.ResponseMessageType.MessageXml;
import com.microsoft.exchange.messages.SuggestionsResponseType;
import com.microsoft.exchange.messages.UpdateFolderResponse;
import com.microsoft.exchange.types.ArrayOfFoldersType;
import com.microsoft.exchange.types.ArrayOfRealItemsType;
import com.microsoft.exchange.types.ArrayOfResolutionType;
import com.microsoft.exchange.types.ArrayOfSuggestionDayResult;
import com.microsoft.exchange.types.ArrayOfTimeZoneDefinitionType;
import com.microsoft.exchange.types.BaseFolderType;
import com.microsoft.exchange.types.ContactItemType;
import com.microsoft.exchange.types.EmailAddressDictionaryEntryType;
import com.microsoft.exchange.types.EmailAddressDictionaryType;
import com.microsoft.exchange.types.FindFolderParentType;
import com.microsoft.exchange.types.FindItemParentType;
import com.microsoft.exchange.types.FolderIdType;
import com.microsoft.exchange.types.FreeBusyView;
import com.microsoft.exchange.types.ItemIdType;
import com.microsoft.exchange.types.ItemType;
import com.microsoft.exchange.types.ResolutionType;
import com.microsoft.exchange.types.ResponseClassType;
import com.microsoft.exchange.types.SuggestionDayResult;
import com.microsoft.exchange.types.TimeZoneDefinitionType;

public class ExchangeResponseUtilsImpl implements ExchangeResponseUtils {
    protected final Log log = LogFactory.getLog(this.getClass());

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseCreateFolderResponse(com.microsoft.exchange.messages.CreateFolderResponse)
     */
    @Override
    public Set<FolderIdType> parseCreateFolderResponse(CreateFolderResponse response) {
        return parseFolderResponse(response);
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseUpdateFolderResponse(com.microsoft.exchange.messages.UpdateFolderResponse)
     */
    @Override
    public Set<FolderIdType> parseUpdateFolderResponse(UpdateFolderResponse response) {
        return parseFolderResponse(response);
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseGetItemResponse(com.microsoft.exchange.messages.GetItemResponse)
     */
    @Override
    public Set<ItemType> parseGetItemResponse(GetItemResponse response) {
        Set<ItemType> items = new HashSet<ItemType>();
        confirmSuccess(response);
        ArrayOfResponseMessagesType responseMessages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> getItemResponseMessages = responseMessages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> responseMessageElement : getItemResponseMessages) {
            ItemInfoResponseMessageType itemType = (ItemInfoResponseMessageType) responseMessageElement.getValue();
            ArrayOfRealItemsType itemsArray = itemType.getItems();
            items.addAll(itemsArray.getItemsAndMessagesAndCalendarItems());
        }
        return items;
    }

    protected Set<FolderIdType> parseFolderResponse(BaseResponseMessageType response) {
        confirmSuccess(response);
        Set<FolderIdType> folderIds = new HashSet<FolderIdType>();
        ArrayOfResponseMessagesType responseMessages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> createItemResponseMessages = responseMessages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> responeElement : createItemResponseMessages) {
            FolderInfoResponseMessageType itemInfo = (FolderInfoResponseMessageType) responeElement.getValue();
            ArrayOfFoldersType folders = itemInfo.getFolders();
            if (null != folders
                    && !CollectionUtils.isEmpty(folders.getFoldersAndCalendarFoldersAndContactsFolders())) {
                List<BaseFolderType> foldersAndCalendarFoldersAndContactsFolders = folders
                        .getFoldersAndCalendarFoldersAndContactsFolders();
                for (BaseFolderType bFolderIdType : foldersAndCalendarFoldersAndContactsFolders) {
                    FolderIdType folderId = bFolderIdType.getFolderId();
                    log.trace(" folderName= " + bFolderIdType.getDisplayName() + ", folderId=" + folderId);
                    folderIds.add(folderId);
                }
            } else {
                log.error("No folders returned");
            }
        }
        return folderIds;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseGetFolderResponse(com.microsoft.exchange.messages.GetFolderResponse)
     */
    @Override
    public Set<BaseFolderType> parseGetFolderResponse(GetFolderResponse getFolderResponse) {
        confirmSuccess(getFolderResponse);
        Set<BaseFolderType> folders = new HashSet<BaseFolderType>();
        ArrayOfResponseMessagesType responseMessages = getFolderResponse.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> getFolderResponseMessages = responseMessages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> responseMessage : getFolderResponseMessages) {
            FolderInfoResponseMessageType folderInfo = (FolderInfoResponseMessageType) responseMessage.getValue();
            List<BaseFolderType> f = folderInfo.getFolders().getFoldersAndCalendarFoldersAndContactsFolders();
            if (!CollectionUtils.isEmpty(f)) {
                folders.addAll(f);
            }
        }
        return folders;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#confirmSuccess(com.microsoft.exchange.messages.BaseResponseMessageType)
     */
    @Override
    public boolean confirmSuccess(BaseResponseMessageType response) {
        Boolean success = null;

        ArrayOfResponseMessagesType messages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> inner = messages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> innerResponse : inner) {
            if (success == null) {
                success = ResponseCodeType.NO_ERROR.equals(innerResponse.getValue().getResponseCode());
            } else {
                success = success && ResponseCodeType.NO_ERROR.equals(innerResponse.getValue().getResponseCode());
            }
            if (!success || !ResponseCodeType.NO_ERROR.equals(innerResponse.getValue().getResponseCode())) {
                ResponseCodeType responseCode = innerResponse.getValue().getResponseCode();
                String err = parseInnerResponse(innerResponse);

                if (ResponseCodeType.ERROR_INTERNAL_SERVER_ERROR.equals(responseCode)
                        || ResponseCodeType.ERROR_INTERNAL_SERVER_TRANSIENT_ERROR.equals(responseCode)) {
                    //TODO recover (switch Credentials)
                }

                if (ResponseCodeType.ERROR_TIMEOUT_EXPIRED.equals(responseCode)) {
                    throw new ExchangeTimeoutRuntimeException(err);
                }

                if (ResponseCodeType.ERROR_CANNOT_DELETE_OBJECT.equals(responseCode)) {
                    throw new ExchangeCannotDeleteRuntimeException(err);
                }

                if (ResponseCodeType.ERROR_ITEM_NOT_FOUND.equals(responseCode)) {
                    throw new ExchangeItemNotFoundRuntimeException(err);
                }

                if (ResponseCodeType.ERROR_EXCEEDED_FIND_COUNT_LIMIT.equals(responseCode)) {
                    throw new ExchangeExceededFindCountLimitRuntimeException(err);
                }

                throw new ExchangeRuntimeException(err);
            }
        }
        return success;
    }

    private boolean confirmSuccessInternal(ResponseMessageType responseMessage) {
        boolean success = false;

        if (null != responseMessage) {

            success = ResponseCodeType.NO_ERROR.equals(responseMessage.getResponseCode());
        }

        return success;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#confirmSuccessOrWarning(com.microsoft.exchange.messages.BaseResponseMessageType)
     */
    @Override
    public boolean confirmSuccessOrWarning(BaseResponseMessageType response) {
        List<String> errors = new ArrayList<String>();
        List<String> warnings = new ArrayList<String>();

        ArrayOfResponseMessagesType messages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> inner = messages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> innerResponse : inner) {
            if (innerResponse != null && innerResponse.getValue() != null) {
                String parsedMsg = parseInnerResponse(innerResponse);

                ResponseMessageType innerResponseValue = innerResponse.getValue();

                ResponseClassType responseClass = innerResponseValue.getResponseClass();

                switch (responseClass) {
                case WARNING:
                    log.warn(parsedMsg);
                    warnings.add(parsedMsg);
                    break;

                case ERROR:
                    log.error(parsedMsg);
                    errors.add(parsedMsg);
                    break;

                default:
                    break;
                }
            }
        }
        if (CollectionUtils.isEmpty(errors)) {
            return true;
        } else {
            return false;
        }
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseFindFolderResponse(com.microsoft.exchange.messages.FindFolderResponse)
     */
    @Override
    public List<BaseFolderType> parseFindFolderResponse(FindFolderResponse findFolderResponse) {
        ArrayOfResponseMessagesType findFolderResponseMessages = findFolderResponse.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> folderItemResponseMessages = findFolderResponseMessages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> responseElement : folderItemResponseMessages) {
            FindFolderResponseMessageType itemType = (FindFolderResponseMessageType) responseElement.getValue();
            if (null != itemType && null != itemType.getRootFolder()
                    && null != itemType.getRootFolder().getFolders() && null != itemType.getRootFolder()
                            .getFolders().getFoldersAndCalendarFoldersAndContactsFolders()) {
                FindFolderParentType rootFolder = itemType.getRootFolder();
                ArrayOfFoldersType folders = rootFolder.getFolders();
                return folders.getFoldersAndCalendarFoldersAndContactsFolders();
            }
        }
        return null;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#getCreatedItemIds(com.microsoft.exchange.messages.CreateItemResponse)
     */
    @Override
    public Set<ItemIdType> getCreatedItemIds(CreateItemResponse response) {
        Set<ItemIdType> successfulItems = new HashSet<ItemIdType>();
        if (null == response) {
            return successfulItems;
        }
        ArrayOfResponseMessagesType messages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> inner = messages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> innerResponse : inner) {
            ResponseCodeType responseCode = innerResponse.getValue().getResponseCode();
            String err = parseInnerResponse(innerResponse);

            if (ResponseCodeType.NO_ERROR.equals(responseCode)) {
                ItemInfoResponseMessageType itemInfo = (ItemInfoResponseMessageType) innerResponse.getValue();
                ArrayOfRealItemsType items = itemInfo.getItems();
                List<ItemType> calendarItems = items.getItemsAndMessagesAndCalendarItems();
                for (ItemType itemType : calendarItems) {
                    successfulItems.add(itemType.getItemId());
                }
            } else {
                log.trace("Failed to create item, " + err);
            }
        }
        return successfulItems;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#getCreateItemErrors(com.microsoft.exchange.messages.CreateItemResponse)
     */
    @Override
    public List<String> getCreateItemErrors(CreateItemResponse response) {
        List<String> errs = new ArrayList<String>();
        if (null == response || null == response.getResponseMessages()) {
            errs.add("NO RESPONSE");
            return errs;
        }
        ArrayOfResponseMessagesType messages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> inner = messages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> innerResponse : inner) {
            ResponseCodeType responseCode = innerResponse.getValue().getResponseCode();
            String err = parseInnerResponse(innerResponse);

            if (!ResponseCodeType.NO_ERROR.equals(responseCode)) {
                errs.add(err);
            }
        }
        return errs;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseCreateItemResponse(com.microsoft.exchange.messages.CreateItemResponse)
     */
    @Override
    public List<ItemIdType> parseCreateItemResponse(CreateItemResponse response) {
        confirmSuccess(response);
        List<ItemIdType> itemIds = new ArrayList<ItemIdType>();
        ArrayOfResponseMessagesType responseMessages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> createItemResponseMessages = responseMessages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> responeElement : createItemResponseMessages) {
            ItemInfoResponseMessageType itemInfo = (ItemInfoResponseMessageType) responeElement.getValue();
            ArrayOfRealItemsType items = itemInfo.getItems();

            List<ItemType> calendarItems = items.getItemsAndMessagesAndCalendarItems();
            for (ItemType itemType : calendarItems) {
                itemIds.add(itemType.getItemId());
            }
        }
        return itemIds;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseFindItemIdResponseNoOffset(com.microsoft.exchange.messages.FindItemResponse)
     */
    @Override
    @Deprecated
    public Set<ItemIdType> parseFindItemIdResponseNoOffset(FindItemResponse response) {
        Pair<Set<ItemIdType>, Integer> pair = parseFindItemIdResponse(response);
        return pair.getLeft();
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseFindItemIdResponse(com.microsoft.exchange.messages.FindItemResponse)
     */
    @Override
    public Pair<Set<ItemIdType>, Integer> parseFindItemIdResponse(FindItemResponse response) {

        confirmSuccess(response);
        Set<ItemIdType> foundItemIds = new HashSet<ItemIdType>();
        Integer nextOffset = -1;
        ArrayOfResponseMessagesType findItemResponseMessages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> itemResponseMessages = findItemResponseMessages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> element : itemResponseMessages) {
            FindItemResponseMessageType itemType = (FindItemResponseMessageType) element.getValue();
            FindItemParentType rootFolder = itemType.getRootFolder();

            Boolean includesLastItemInRange = rootFolder.isIncludesLastItemInRange();
            Integer totalItemsInView = rootFolder.getTotalItemsInView();

            if (!includesLastItemInRange) {
                nextOffset = rootFolder.getIndexedPagingOffset();
            }
            ArrayOfRealItemsType items = rootFolder.getItems();
            List<ItemType> calendarItems = items.getItemsAndMessagesAndCalendarItems();
            for (ItemType it : calendarItems) {
                foundItemIds.add(it.getItemId());
            }

            log.info("parseFindItemIdResponse: foundItems=" + foundItemIds.size() + ", totalItemsInview="
                    + totalItemsInView + " , nextOffset" + nextOffset + ", includesLast="
                    + includesLastItemInRange);
        }

        Pair<Set<ItemIdType>, Integer> pair = Pair.of(foundItemIds, nextOffset);
        return pair;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseFindItemResponse(com.microsoft.exchange.messages.FindItemResponse)
     */
    @Override
    public Set<ItemType> parseFindItemResponse(FindItemResponse response) {
        confirmSuccess(response);
        Set<ItemType> calendarItems = new HashSet<ItemType>();

        ArrayOfResponseMessagesType findItemResponseMessages = response.getResponseMessages();
        List<JAXBElement<? extends ResponseMessageType>> itemResponseMessages = findItemResponseMessages
                .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
        for (JAXBElement<? extends ResponseMessageType> element : itemResponseMessages) {
            FindItemResponseMessageType itemType = (FindItemResponseMessageType) element.getValue();
            FindItemParentType rootFolder = itemType.getRootFolder();
            ArrayOfRealItemsType items = rootFolder.getItems();
            calendarItems.addAll(items.getItemsAndMessagesAndCalendarItems());

        }
        return calendarItems;
    }

    private String parseInnerResponse(JAXBElement<? extends ResponseMessageType> innerResponse) {

        ResponseMessageType responseMessage = innerResponse.getValue();
        return parseInnerResponse(responseMessage);

    }

    private String parseInnerResponse(ResponseMessageType responseMessage) {
        StringBuilder responseBuilder = new StringBuilder("Response[");

        ResponseCodeType responseCode = responseMessage.getResponseCode();
        if (null != responseCode) {
            responseBuilder.append("code=" + responseCode + ", ");
        }
        ResponseClassType responseClass = responseMessage.getResponseClass();
        if (null != responseClass) {
            responseBuilder.append("class=" + responseClass + ", ");
        }
        String messageText = responseMessage.getMessageText();
        if (StringUtils.isNotBlank(messageText)) {
            responseBuilder.append("txt=" + messageText + ", ");
        }
        MessageXml messageXml = responseMessage.getMessageXml();
        if (null != messageXml) {
            StringBuilder xmlStringBuilder = new StringBuilder("messageXml=");
            List<Element> anies = messageXml.getAnies();
            if (!CollectionUtils.isEmpty(anies)) {
                for (Element element : anies) {
                    String elementNameString = element.getNodeName();
                    String elementValueString = element.getNodeValue();
                    xmlStringBuilder.append(elementNameString + "=" + elementValueString + ";");

                    if (null != element.getAttributes()) {
                        NamedNodeMap attributes = element.getAttributes();
                        for (int i = 0; i < attributes.getLength(); i++) {
                            Node item = attributes.item(i);
                            String nodeName = item.getNodeName();
                            String nodeValue = item.getNodeValue();
                            xmlStringBuilder.append(nodeName + "=" + nodeValue + ",");
                        }
                    }
                }
            }
            responseBuilder.append("xml=" + xmlStringBuilder.toString() + ", ");
        }
        Integer descriptiveLinkKey = responseMessage.getDescriptiveLinkKey();
        if (null != descriptiveLinkKey) {
            responseBuilder.append("link=" + descriptiveLinkKey);
        }

        responseBuilder.append("]");
        return responseBuilder.toString();
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseEmptyFolderResponse(com.microsoft.exchange.messages.EmptyFolderResponse)
     */
    @Override
    public boolean parseEmptyFolderResponse(EmptyFolderResponse response) {
        if (confirmSuccess(response)) {
            ArrayOfResponseMessagesType responseMessages = response.getResponseMessages();
            List<JAXBElement<? extends ResponseMessageType>> messages = responseMessages
                    .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
            for (JAXBElement<? extends ResponseMessageType> message : messages) {

                ResponseMessageType value = message.getValue();
                //TODO parse response value(s) appropriately
                return true;
            }
        }
        return false;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseResolveNamesResponse(com.microsoft.exchange.messages.ResolveNamesResponse)
     */
    @Override
    public Set<String> parseResolveNamesResponse(ResolveNamesResponse response) {
        Set<String> addresses = new HashSet<String>();
        if (confirmSuccessOrWarning(response)) {
            ArrayOfResponseMessagesType arrayOfResponseMessagesType = response.getResponseMessages();
            List<JAXBElement<? extends ResponseMessageType>> responseMessagesList = arrayOfResponseMessagesType
                    .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
            for (JAXBElement<? extends ResponseMessageType> element : responseMessagesList) {
                ResolveNamesResponseMessageType rnrmt = (ResolveNamesResponseMessageType) element.getValue();
                ArrayOfResolutionType arrayOfResolutionType = rnrmt.getResolutionSet();
                List<ResolutionType> resolutions = arrayOfResolutionType.getResolutions();
                for (ResolutionType resolution : resolutions) {
                    ContactItemType contact = resolution.getContact();
                    EmailAddressDictionaryType emailAddresses = contact.getEmailAddresses();
                    List<EmailAddressDictionaryEntryType> entries = emailAddresses.getEntries();
                    for (EmailAddressDictionaryEntryType entry : entries) {
                        String value = entry.getValue();
                        if (StringUtils.isNotBlank(value)) {
                            value = value.toLowerCase();
                            value = StringUtils.removeStartIgnoreCase(value, "smtp:");
                            addresses.add(value);
                        }
                    }
                }
            }
        }
        return addresses;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseGetServerTimeZonesResponse(com.microsoft.exchange.messages.GetServerTimeZonesResponse)
     */
    @Override
    public List<TimeZoneDefinitionType> parseGetServerTimeZonesResponse(GetServerTimeZonesResponse response) {
        List<TimeZoneDefinitionType> zones = new ArrayList<TimeZoneDefinitionType>();
        if (confirmSuccess(response)) {
            ArrayOfResponseMessagesType responseMessages = response.getResponseMessages();
            List<JAXBElement<? extends ResponseMessageType>> tzResponseMessages = responseMessages
                    .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
            for (JAXBElement<? extends ResponseMessageType> message : tzResponseMessages) {
                ResponseMessageType r = message.getValue();
                GetServerTimeZonesResponseMessageType itemInfo = (GetServerTimeZonesResponseMessageType) r;
                ArrayOfTimeZoneDefinitionType timeZoneDefinitions = itemInfo.getTimeZoneDefinitions();
                List<TimeZoneDefinitionType> timeZoneDefinitionsList = timeZoneDefinitions.getTimeZoneDefinitions();
                zones = timeZoneDefinitionsList;
            }
        }
        return zones;
    }

    /* (non-Javadoc)
     * @see com.microsoft.exchange.ExchangeResponseUtils#parseDeleteFolderResponse(com.microsoft.exchange.messages.DeleteFolderResponse)
     */
    @Override
    public boolean parseDeleteFolderResponse(DeleteFolderResponse response) {
        if (confirmSuccess(response)) {
            ArrayOfResponseMessagesType arrayOfResponseMessages = response.getResponseMessages();
            List<JAXBElement<? extends ResponseMessageType>> deleteFolderResponseMessages = arrayOfResponseMessages
                    .getCreateItemResponseMessagesAndDeleteItemResponseMessagesAndGetItemResponseMessages();
            for (JAXBElement<? extends ResponseMessageType> message : deleteFolderResponseMessages) {
                ResponseMessageType value = message.getValue();
                return value.getResponseClass().equals(ResponseClassType.SUCCESS)
                        && value.getResponseCode().equals(ResponseCodeType.NO_ERROR);
            }
        }
        return false;
    }

    public FreeBusyView parseFreeBusyResponse(GetUserAvailabilityResponse response) {
        FreeBusyView freeBusyView = null;

        if (null != response) {
            ArrayOfFreeBusyResponse freeBusyResponseArray = response.getFreeBusyResponseArray();
            if (null != freeBusyResponseArray) {
                List<FreeBusyResponseType> freeBusyResponses = freeBusyResponseArray.getFreeBusyResponses();
                if (!CollectionUtils.isEmpty(freeBusyResponses)) {
                    for (FreeBusyResponseType fbrt : freeBusyResponses) {
                        ResponseMessageType responseMessage = fbrt.getResponseMessage();
                        if (confirmSuccessInternal(responseMessage)) {
                            freeBusyView = fbrt.getFreeBusyView();
                        } else {
                            String failMsg = parseInnerResponse(responseMessage);
                            log.warn("FreeBusyResponseType Failure: " + failMsg);
                        }
                    }
                } else {
                    log.debug("freeBusyResponses are empty");
                }
            } else {
                log.debug("ArrayOfFreeBusyResponse is null");
            }
        }

        return freeBusyView;
    }

    public ArrayOfSuggestionDayResult parseSuggestionDayResult(GetUserAvailabilityResponse response) {
        ArrayOfSuggestionDayResult suggestionResult = null;
        if (null != response) {
            SuggestionsResponseType suggestionsResponse = response.getSuggestionsResponse();

            if (null != suggestionsResponse) {
                ResponseMessageType responseMessage = suggestionsResponse.getResponseMessage();
                if (confirmSuccessInternal(responseMessage)) {
                    suggestionResult = suggestionsResponse.getSuggestionDayResultArray();
                } else {
                    String failMsg = parseInnerResponse(responseMessage);
                    log.warn("SuggestionsResponseType Failure: " + failMsg);
                }
            } else {
                log.debug("SuggestionsResponseType is null");
            }

        }
        return suggestionResult;
    }

}