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    
024    package microsoft.exchange.webservices.data.core.response;
025    
026    import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027    import microsoft.exchange.webservices.data.core.EwsUtilities;
028    import microsoft.exchange.webservices.data.core.ExchangeService;
029    import microsoft.exchange.webservices.data.core.XmlElementNames;
030    import microsoft.exchange.webservices.data.core.service.ServiceObject;
031    import microsoft.exchange.webservices.data.core.service.item.Item;
032    import microsoft.exchange.webservices.data.core.enumeration.service.ServiceResult;
033    import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
034    
035    /**
036     * The Class UpdateItemResponse.
037     */
038    public final class UpdateItemResponse extends ServiceResponse implements
039                                                                  IGetObjectInstanceDelegate<ServiceObject> {
040    
041      /**
042       * Represents the response to an individual item update operation.
043       */
044      private Item item;
045    
046      /**
047       * The returned item.
048       */
049      private Item returnedItem;
050    
051      /**
052       * The conflict count.
053       */
054      private int conflictCount;
055    
056      /**
057       * Initializes a new instance of the class.
058       *
059       * @param item the item
060       */
061      public UpdateItemResponse(Item item) {
062        super();
063        EwsUtilities.ewsAssert(item != null, "UpdateItemResponse.ctor", "item is null");
064        this.item = item;
065      }
066    
067      /**
068       * Reads response elements from XML.
069       *
070       * @param reader the reader
071       * @throws Exception the exception
072       */
073      @Override
074      protected void readElementsFromXml(EwsServiceXmlReader reader) throws Exception {
075        super.readElementsFromXml(reader);
076    
077        reader.readServiceObjectsCollectionFromXml(XmlElementNames.Items, this,
078            false, null, false);
079    
080        if (!reader.getService().getExchange2007CompatibilityMode()) {
081          reader.readStartElement(XmlNamespace.Messages,
082              XmlElementNames.ConflictResults);
083          this.conflictCount = reader.readElementValue(Integer.class,
084              XmlNamespace.Types, XmlElementNames.Count);
085          reader.readEndElement(XmlNamespace.Messages,
086              XmlElementNames.ConflictResults);
087        }
088    
089        // If UpdateItem returned an item that has the same Id as the item that
090        // is being updated, this is a "normal" UpdateItem operation, and we
091        // need
092        // to update the ChangeKey of the item being updated with the one that
093        // was
094        // returned. Also set returnedItem to indicate that no new item was
095        // returned.
096        //
097        // Otherwise, this in a "special" UpdateItem operation, such as a
098        // recurring
099        // task marked as complete (the returned item in that case is the
100        // one-off
101        // task that represents the completed instance).
102        //
103        // Note that there can be no returned item at all, as in an UpdateItem
104        // call
105        // with MessageDisposition set to SendOnly or SendAndSaveCopy.
106        if (this.returnedItem != null) {
107          if (this.item.getId().getUniqueId().equals(
108              this.returnedItem.getId().getUniqueId())) {
109            this.item.getId().setChangeKey(
110                this.returnedItem.getId().getChangeKey());
111            this.returnedItem = null;
112          }
113        }
114      }
115    
116      /*
117       * (non-Javadoc)
118       *
119       * @seemicrosoft.exchange.webservices.GetObjectInstanceDelegateInterface#
120       * getObjectInstanceDelegate(microsoft.exchange.webservices.ExchangeService,
121       * java.lang.String)
122       */
123      public ServiceObject getObjectInstanceDelegate(ExchangeService service,
124          String xmlElementName) throws Exception {
125        return this.getObjectInstance(service, xmlElementName);
126      }
127    
128      /**
129       * Clears the change log of the created folder if the creation succeeded.
130       */
131      @Override
132      protected void loaded() {
133        if (this.getResult() == ServiceResult.Success) {
134          this.item.clearChangeLog();
135        }
136      }
137    
138      /**
139       * Gets Item instance.
140       *
141       * @param service        the service
142       * @param xmlElementName the xml element name
143       * @return Item
144       * @throws Exception the exception
145       */
146      private Item getObjectInstance(ExchangeService service,
147          String xmlElementName) throws Exception {
148        this.returnedItem = EwsUtilities.createEwsObjectFromXmlElementName(
149            Item.class, service, xmlElementName);
150        return this.returnedItem;
151      }
152    
153      /**
154       * Gets the item that was returned by the update operation. ReturnedItem
155       * is set only when a recurring Task is marked as complete or when its
156       * recurrence pattern changes.
157       *
158       * @return the returned item
159       */
160      public Item getReturnedItem() {
161        return this.returnedItem;
162      }
163    
164      /**
165       * Gets the number of property conflicts that were resolved during the
166       * update operation.
167       *
168       * @return the conflict count
169       */
170      public int getConflictCount() {
171        return this.conflictCount;
172      }
173    
174    }