Search in sources :

Example 1 with UpdateItemType

use of com.microsoft.schemas.exchange.services._2006.messages.UpdateItemType in project zm-mailbox by Zimbra.

the class ExchangeEWSFreeBusyProvider method handleMailboxChange.

@Override
public boolean handleMailboxChange(String accountId) {
    ZimbraLog.fb.debug("Entering handleMailboxChange() for account : " + accountId);
    String email = getEmailAddress(accountId);
    ServerInfo serverInfo = getServerInfo(email);
    if (email == null || !serverInfo.enabled) {
        ZimbraLog.fb.debug("Exiting handleMailboxChange() for account : " + accountId);
        // no retry
        return true;
    }
    FreeBusy fb;
    try {
        fb = getFreeBusy(accountId, FreeBusyQuery.CALENDAR_FOLDER_ALL);
    } catch (ServiceException se) {
        ZimbraLog.fb.warn("can't get freebusy for account " + accountId, se);
        ZimbraLog.fb.debug("Exiting handleMailboxChange() for account : " + accountId);
        // retry the request if it's receivers fault.
        return !se.isReceiversFault();
    }
    if (email == null || fb == null) {
        ZimbraLog.fb.warn("account not found / incorrect / wrong host: " + accountId);
        ZimbraLog.fb.debug("Exiting handleMailboxChange() for account : " + accountId);
        // no retry
        return true;
    }
    if (serverInfo == null || serverInfo.org == null || serverInfo.cn == null) {
        ZimbraLog.fb.warn("no exchange server info for user " + email);
        ZimbraLog.fb.debug("Exiting handleMailboxChange() for account : " + accountId);
        // no retry
        return true;
    }
    if (null == service) {
        try {
            if (!initService(serverInfo)) {
                ZimbraLog.fb.error("failed to initialize exchange service object " + serverInfo.url);
                ZimbraLog.fb.debug("Exiting handleMailboxChange() for account : " + accountId);
                return true;
            }
        } catch (MalformedURLException e) {
            ZimbraLog.fb.error("exception while trying to initialize exchange service object " + serverInfo.url);
            ZimbraLog.fb.debug("Exiting handleMailboxChange() for account : " + accountId);
            return true;
        }
    }
    ExchangeEWSMessage msg = new ExchangeEWSMessage(serverInfo.org, serverInfo.cn, email);
    try {
        FolderType publicFolderRoot = (FolderType) bindFolder(DistinguishedFolderIdNameType.PUBLICFOLDERSROOT, DefaultShapeNamesType.ALL_PROPERTIES);
        if (publicFolderRoot == null) {
            ZimbraLog.fb.error("Could not find the public root folder on exchange");
            return true;
        }
        List<BaseFolderType> resultsNonIpm = findFolderByProp(publicFolderRoot.getParentFolderId(), UnindexedFieldURIType.FOLDER_DISPLAY_NAME, "NON_IPM_SUBTREE");
        if (resultsNonIpm != null && resultsNonIpm.size() > 0) {
            FolderType folderNonIPM = (FolderType) resultsNonIpm.get(0);
            List<BaseFolderType> resultSchedulePlus = findFolderByProp(folderNonIPM.getFolderId(), UnindexedFieldURIType.FOLDER_DISPLAY_NAME, "SCHEDULE+ FREE BUSY");
            if (resultSchedulePlus != null && resultSchedulePlus.size() > 0) {
                FolderType folderSchedulePlus = (FolderType) resultSchedulePlus.get(0);
                List<BaseFolderType> resultFBFolder = findFolderByPartialProp(folderSchedulePlus.getFolderId(), UnindexedFieldURIType.FOLDER_DISPLAY_NAME, // TODO: check here for partial name
                serverInfo.org);
                // search
                if (resultFBFolder != null && resultFBFolder.size() > 0) {
                    FolderType folderFB = (FolderType) resultFBFolder.get(0);
                    List<ItemType> resultMessage = findItemByProp(folderFB.getFolderId(), UnindexedFieldURIType.ITEM_SUBJECT, "USER-/CN=RECIPIENTS/CN=" + getForeignPrincipal(accountId), DefaultShapeNamesType.ALL_PROPERTIES);
                    if (resultMessage != null && resultMessage.size() > 0) {
                        // edit message
                        ItemType itemMessage = resultMessage.get(0);
                        Map<PathToExtendedFieldType, NonEmptyArrayOfPropertyValuesType> props = msg.GetFreeBusyProperties(fb);
                        final NonEmptyArrayOfItemChangeDescriptionsType cdExPropArr = new NonEmptyArrayOfItemChangeDescriptionsType();
                        for (PathToExtendedFieldType pathExProp : props.keySet()) {
                            ItemType itemEmptyMessage = new ItemType();
                            SetItemFieldType sifItem = new SetItemFieldType();
                            sifItem.setPath(new JAXBElement<PathToExtendedFieldType>(new QName("http://schemas.microsoft.com/exchange/services/2006/types", "Path"), PathToExtendedFieldType.class, pathExProp));
                            ExtendedPropertyType exProp = new ExtendedPropertyType();
                            exProp.setExtendedFieldURI(pathExProp);
                            if (pathExProp.getPropertyType() == MapiPropertyTypeType.APPLICATION_TIME_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.BINARY_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.CLSID_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.CURRENCY_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.DOUBLE_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.FLOAT_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.INTEGER_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.LONG_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.OBJECT_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.SHORT_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.STRING_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.SYSTEM_TIME_ARRAY) {
                                exProp.setValues(props.get(pathExProp));
                            } else {
                                if (props.get(pathExProp).getValue().size() > 0) {
                                    exProp.setValue(props.get(pathExProp).getValue().get(0));
                                }
                            }
                            itemEmptyMessage.getExtendedProperty().add(exProp);
                            sifItem.setItem(itemEmptyMessage);
                            cdExPropArr.getAppendToItemFieldOrSetItemFieldOrDeleteItemField().add(sifItem);
                        }
                        UpdateItemType updateItemRequest = new UpdateItemType();
                        updateItemRequest.setMessageDisposition(MessageDispositionType.SAVE_ONLY);
                        updateItemRequest.setConflictResolution(ConflictResolutionType.ALWAYS_OVERWRITE);
                        RequestServerVersion serverVersion = new RequestServerVersion();
                        serverVersion.setVersion(ExchangeVersionType.EXCHANGE_2010_SP_1);
                        ItemChangeType itemExpropChange = new ItemChangeType();
                        itemExpropChange.setItemId(itemMessage.getItemId());
                        itemExpropChange.setUpdates(cdExPropArr);
                        final NonEmptyArrayOfItemChangesType ctExPropArr = new NonEmptyArrayOfItemChangesType();
                        ctExPropArr.getItemChange().add(itemExpropChange);
                        updateItemRequest.setItemChanges(ctExPropArr);
                        Holder<UpdateItemResponseType> updateItemResponse = new Holder<UpdateItemResponseType>();
                        Holder<ServerVersionInfo> gfversionInfo = new Holder<ServerVersionInfo>();
                        MailboxCultureType mct = new MailboxCultureType();
                        mct.setValue("EN");
                        TimeZoneDefinitionType tzdt = new TimeZoneDefinitionType();
                        tzdt.setId("Greenwich Standard Time");
                        TimeZoneContextType tzct = new TimeZoneContextType();
                        tzct.setTimeZoneDefinition(tzdt);
                        service.updateItem(updateItemRequest, mct, serverVersion, tzct, updateItemResponse, gfversionInfo);
                        ResponseMessageType updateItemResponseMessage = updateItemResponse.value.getResponseMessages().getCreateItemResponseMessageOrDeleteItemResponseMessageOrGetItemResponseMessage().get(0).getValue();
                    } else {
                        // create message
                        PostItemType itemMessage = new PostItemType();
                        itemMessage.setSubject("USER-/CN=RECIPIENTS/CN=" + getForeignPrincipal(accountId));
                        itemMessage.setItemClass("IPM.Post");
                        Map<PathToExtendedFieldType, NonEmptyArrayOfPropertyValuesType> props = msg.GetFreeBusyProperties(fb);
                        for (PathToExtendedFieldType pathExProp : props.keySet()) {
                            ExtendedPropertyType exProp = new ExtendedPropertyType();
                            exProp.setExtendedFieldURI(pathExProp);
                            if (pathExProp.getPropertyType() == MapiPropertyTypeType.APPLICATION_TIME_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.BINARY_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.CLSID_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.CURRENCY_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.DOUBLE_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.FLOAT_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.INTEGER_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.LONG_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.OBJECT_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.SHORT_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.STRING_ARRAY || pathExProp.getPropertyType() == MapiPropertyTypeType.SYSTEM_TIME_ARRAY) {
                                exProp.setValues(props.get(pathExProp));
                            } else {
                                if (props.get(pathExProp).getValue().size() > 0) {
                                    exProp.setValue(props.get(pathExProp).getValue().get(0));
                                }
                            }
                            itemMessage.getExtendedProperty().add(exProp);
                        }
                        CreateItemType createItemRequest = new CreateItemType();
                        RequestServerVersion serverVersion = new RequestServerVersion();
                        serverVersion.setVersion(ExchangeVersionType.EXCHANGE_2010_SP_1);
                        createItemRequest.setMessageDisposition(MessageDispositionType.SAVE_ONLY);
                        TargetFolderIdType idTargetFolder = new TargetFolderIdType();
                        idTargetFolder.setFolderId(folderFB.getFolderId());
                        createItemRequest.setSavedItemFolderId(idTargetFolder);
                        NonEmptyArrayOfAllItemsType createItems = new NonEmptyArrayOfAllItemsType();
                        createItems.getItemOrMessageOrCalendarItem().add(itemMessage);
                        createItemRequest.setItems(createItems);
                        Holder<CreateItemResponseType> createItemResponse = new Holder<CreateItemResponseType>();
                        Holder<ServerVersionInfo> gfversionInfo = new Holder<ServerVersionInfo>();
                        MailboxCultureType mct = new MailboxCultureType();
                        mct.setValue("EN");
                        TimeZoneDefinitionType tzdt = new TimeZoneDefinitionType();
                        tzdt.setId("Greenwich Standard Time");
                        TimeZoneContextType tzct = new TimeZoneContextType();
                        tzct.setTimeZoneDefinition(tzdt);
                        service.createItem(createItemRequest, mct, serverVersion, tzct, createItemResponse, gfversionInfo);
                        ResponseMessageType createItemResponseMessage = createItemResponse.value.getResponseMessages().getCreateItemResponseMessageOrDeleteItemResponseMessageOrGetItemResponseMessage().get(0).getValue();
                    }
                } else {
                    ZimbraLog.fb.error("Could not find the Exchange folder containing '" + serverInfo.org + "'. Make sure zimbraFreebusyExchangeUserOrg is configured correctly and it exists on Exchange");
                }
            } else {
                ZimbraLog.fb.error("Could not find the Exchange folder 'SCHEDULE+ FREE BUSY'");
            }
        } else {
            ZimbraLog.fb.error("Could not find the Exchange folder 'NON_IPM_SUBTREE'");
        }
        return true;
    } catch (Exception e) {
        ZimbraLog.fb.error("error communicating with " + serverInfo.url, e);
    } finally {
        ZimbraLog.fb.debug("Exiting handleMailboxChange() for account : " + accountId);
    }
    // retry
    return false;
}
Also used : MalformedURLException(java.net.MalformedURLException) FolderInfoResponseMessageType(com.microsoft.schemas.exchange.services._2006.messages.FolderInfoResponseMessageType) ResponseMessageType(com.microsoft.schemas.exchange.services._2006.messages.ResponseMessageType) FindFolderResponseMessageType(com.microsoft.schemas.exchange.services._2006.messages.FindFolderResponseMessageType) FindItemResponseMessageType(com.microsoft.schemas.exchange.services._2006.messages.FindItemResponseMessageType) ServerInfo(com.zimbra.cs.fb.ExchangeFreeBusyProvider.ServerInfo) FindItemType(com.microsoft.schemas.exchange.services._2006.messages.FindItemType) UpdateItemType(com.microsoft.schemas.exchange.services._2006.messages.UpdateItemType) CreateItemType(com.microsoft.schemas.exchange.services._2006.messages.CreateItemType) ItemType(com.microsoft.schemas.exchange.services._2006.types.ItemType) PostItemType(com.microsoft.schemas.exchange.services._2006.types.PostItemType) TimeZoneContextType(com.microsoft.schemas.exchange.services._2006.types.TimeZoneContextType) BaseFolderType(com.microsoft.schemas.exchange.services._2006.types.BaseFolderType) UpdateItemResponseType(com.microsoft.schemas.exchange.services._2006.messages.UpdateItemResponseType) SetItemFieldType(com.microsoft.schemas.exchange.services._2006.types.SetItemFieldType) CreateItemResponseType(com.microsoft.schemas.exchange.services._2006.messages.CreateItemResponseType) ItemChangeType(com.microsoft.schemas.exchange.services._2006.types.ItemChangeType) RequestServerVersion(com.microsoft.schemas.exchange.services._2006.types.RequestServerVersion) TimeZoneDefinitionType(com.microsoft.schemas.exchange.services._2006.types.TimeZoneDefinitionType) ServerVersionInfo(com.microsoft.schemas.exchange.services._2006.types.ServerVersionInfo) ExtendedPropertyType(com.microsoft.schemas.exchange.services._2006.types.ExtendedPropertyType) CreateItemType(com.microsoft.schemas.exchange.services._2006.messages.CreateItemType) GetFolderType(com.microsoft.schemas.exchange.services._2006.messages.GetFolderType) FindFolderType(com.microsoft.schemas.exchange.services._2006.messages.FindFolderType) FolderType(com.microsoft.schemas.exchange.services._2006.types.FolderType) BaseFolderType(com.microsoft.schemas.exchange.services._2006.types.BaseFolderType) NonEmptyArrayOfAllItemsType(com.microsoft.schemas.exchange.services._2006.types.NonEmptyArrayOfAllItemsType) UpdateItemType(com.microsoft.schemas.exchange.services._2006.messages.UpdateItemType) QName(javax.xml.namespace.QName) Holder(javax.xml.ws.Holder) PathToExtendedFieldType(com.microsoft.schemas.exchange.services._2006.types.PathToExtendedFieldType) NonEmptyArrayOfPropertyValuesType(com.microsoft.schemas.exchange.services._2006.types.NonEmptyArrayOfPropertyValuesType) DatatypeConfigurationException(javax.xml.datatype.DatatypeConfigurationException) ServiceException(com.zimbra.common.service.ServiceException) IOException(java.io.IOException) MalformedURLException(java.net.MalformedURLException) CertificateException(java.security.cert.CertificateException) NonEmptyArrayOfItemChangesType(com.microsoft.schemas.exchange.services._2006.types.NonEmptyArrayOfItemChangesType) ServiceException(com.zimbra.common.service.ServiceException) TargetFolderIdType(com.microsoft.schemas.exchange.services._2006.types.TargetFolderIdType) NonEmptyArrayOfItemChangeDescriptionsType(com.microsoft.schemas.exchange.services._2006.types.NonEmptyArrayOfItemChangeDescriptionsType) PostItemType(com.microsoft.schemas.exchange.services._2006.types.PostItemType) MailboxCultureType(com.microsoft.schemas.exchange.services._2006.types.MailboxCultureType)

Aggregations

CreateItemResponseType (com.microsoft.schemas.exchange.services._2006.messages.CreateItemResponseType)1 CreateItemType (com.microsoft.schemas.exchange.services._2006.messages.CreateItemType)1 FindFolderResponseMessageType (com.microsoft.schemas.exchange.services._2006.messages.FindFolderResponseMessageType)1 FindFolderType (com.microsoft.schemas.exchange.services._2006.messages.FindFolderType)1 FindItemResponseMessageType (com.microsoft.schemas.exchange.services._2006.messages.FindItemResponseMessageType)1 FindItemType (com.microsoft.schemas.exchange.services._2006.messages.FindItemType)1 FolderInfoResponseMessageType (com.microsoft.schemas.exchange.services._2006.messages.FolderInfoResponseMessageType)1 GetFolderType (com.microsoft.schemas.exchange.services._2006.messages.GetFolderType)1 ResponseMessageType (com.microsoft.schemas.exchange.services._2006.messages.ResponseMessageType)1 UpdateItemResponseType (com.microsoft.schemas.exchange.services._2006.messages.UpdateItemResponseType)1 UpdateItemType (com.microsoft.schemas.exchange.services._2006.messages.UpdateItemType)1 BaseFolderType (com.microsoft.schemas.exchange.services._2006.types.BaseFolderType)1 ExtendedPropertyType (com.microsoft.schemas.exchange.services._2006.types.ExtendedPropertyType)1 FolderType (com.microsoft.schemas.exchange.services._2006.types.FolderType)1 ItemChangeType (com.microsoft.schemas.exchange.services._2006.types.ItemChangeType)1 ItemType (com.microsoft.schemas.exchange.services._2006.types.ItemType)1 MailboxCultureType (com.microsoft.schemas.exchange.services._2006.types.MailboxCultureType)1 NonEmptyArrayOfAllItemsType (com.microsoft.schemas.exchange.services._2006.types.NonEmptyArrayOfAllItemsType)1 NonEmptyArrayOfItemChangeDescriptionsType (com.microsoft.schemas.exchange.services._2006.types.NonEmptyArrayOfItemChangeDescriptionsType)1 NonEmptyArrayOfItemChangesType (com.microsoft.schemas.exchange.services._2006.types.NonEmptyArrayOfItemChangesType)1