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.request;
025
026import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
027import microsoft.exchange.webservices.data.core.EwsUtilities;
028import microsoft.exchange.webservices.data.core.ExchangeService;
029import microsoft.exchange.webservices.data.core.XmlAttributeNames;
030import microsoft.exchange.webservices.data.core.XmlElementNames;
031import microsoft.exchange.webservices.data.core.enumeration.service.error.ServiceErrorHandling;
032import microsoft.exchange.webservices.data.core.response.UpdateItemResponse;
033import microsoft.exchange.webservices.data.core.service.item.Item;
034import microsoft.exchange.webservices.data.core.enumeration.service.ConflictResolutionMode;
035import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
036import microsoft.exchange.webservices.data.core.enumeration.service.MessageDisposition;
037import microsoft.exchange.webservices.data.core.enumeration.service.SendInvitationsOrCancellationsMode;
038import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
039import microsoft.exchange.webservices.data.core.exception.misc.ArgumentException;
040import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
041import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
042import microsoft.exchange.webservices.data.property.complex.FolderId;
043
044import java.util.ArrayList;
045import java.util.List;
046
047/**
048 * The Class UpdateItemRequest.
049 */
050public final class UpdateItemRequest extends
051    MultiResponseServiceRequest<UpdateItemResponse> {
052
053  /**
054   * The item.
055   */
056  private List<Item> items = new ArrayList<Item>();
057
058  /**
059   * The saved item destination folder.
060   */
061  private FolderId savedItemsDestinationFolder;
062
063  /**
064   * The conflict resolution mode.
065   */
066  private ConflictResolutionMode conflictResolutionMode;
067
068  /**
069   * The message disposition.
070   */
071  private MessageDisposition messageDisposition;
072
073  /**
074   * The send invitations or cancellations mode.
075   */
076  private SendInvitationsOrCancellationsMode
077      sendInvitationsOrCancellationsMode;
078
079  /**
080   * Instantiates a new update item request.
081   *
082   * @param service           the service
083   * @param errorHandlingMode the error handling mode
084   * @throws Exception
085   */
086  public UpdateItemRequest(ExchangeService service, ServiceErrorHandling errorHandlingMode)
087      throws Exception {
088    super(service, errorHandlingMode);
089  }
090
091  /*
092   * (non-Javadoc)
093   *
094   * @see microsoft.exchange.webservices.ServiceRequestBase#validate()
095   */
096  @Override
097  protected void validate() throws ServiceLocalException, Exception {
098    super.validate();
099    EwsUtilities.validateParamCollection(this.getItems().iterator(), "Items");
100    for (int i = 0; i < this.getItems().size(); i++) {
101      if ((this.getItems().get(i) == null) ||
102          this.getItems().get(i).isNew()) {
103        throw new ArgumentException(String.format("Items[%d] is either null or does not have an Id.", i));
104      }
105    }
106
107    if (this.savedItemsDestinationFolder != null) {
108      this.savedItemsDestinationFolder.validate(this.getService()
109          .getRequestedServerVersion());
110    }
111
112    // Validate each item.
113    for (Item item : this.getItems()) {
114      item.validate();
115    }
116  }
117
118  /*
119   * (non-Javadoc)
120   *
121   * @seemicrosoft.exchange.webservices.MultiResponseServiceRequest#
122   * createServiceResponse(microsoft.exchange.webservices.ExchangeService,
123   * int)
124   */
125  @Override
126  protected UpdateItemResponse createServiceResponse(ExchangeService service,
127      int responseIndex) {
128    return new UpdateItemResponse(this.getItems().get(responseIndex));
129  }
130
131  /*
132   * (non-Javadoc)
133   *
134   * @see
135   * microsoft.exchange.webservices.ServiceRequestBase#getXmlElementName()
136   */
137  @Override public String getXmlElementName() {
138    return XmlElementNames.UpdateItem;
139  }
140
141  /*
142   * (non-Javadoc)
143   *
144   * @see
145   * microsoft.exchange.webservices.ServiceRequestBase
146   * #getResponseXmlElementName
147   * ()
148   */
149  @Override
150  protected String getResponseXmlElementName() {
151    return XmlElementNames.UpdateItemResponse;
152  }
153
154  /*
155   * (non-Javadoc)
156   *
157   * @seemicrosoft.exchange.webservices.MultiResponseServiceRequest#
158   * getResponseMessageXmlElementName()
159   */
160  @Override
161  protected String getResponseMessageXmlElementName() {
162    return XmlElementNames.UpdateItemResponseMessage;
163  }
164
165  /*
166   * (non-Javadoc)
167   *
168   * @seemicrosoft.exchange.webservices.MultiResponseServiceRequest#
169   * getExpectedResponseMessageCount()
170   */
171  @Override
172  protected int getExpectedResponseMessageCount() {
173    return this.items.size();
174  }
175
176  /*
177   * (non-Javadoc)
178   *
179   * @see
180   * microsoft.exchange.webservices.ServiceRequestBase#writeAttributesToXml
181   * (microsoft.exchange.webservices.EwsServiceXmlWriter)
182   */
183  @Override
184  protected void writeAttributesToXml(EwsServiceXmlWriter writer)
185      throws ServiceXmlSerializationException {
186    super.writeAttributesToXml(writer);
187
188    if (this.messageDisposition != null) {
189      writer.writeAttributeValue(XmlAttributeNames.MessageDisposition,
190          this.messageDisposition);
191    }
192
193    writer.writeAttributeValue(XmlAttributeNames.ConflictResolution,
194        this.conflictResolutionMode);
195
196    if (this.sendInvitationsOrCancellationsMode != null) {
197      writer.writeAttributeValue(
198          XmlAttributeNames.SendMeetingInvitationsOrCancellations,
199          this.sendInvitationsOrCancellationsMode);
200    }
201  }
202
203  /*
204   * (non-Javadoc)
205   *
206   * @see
207   * microsoft.exchange.webservices.ServiceRequestBase#writeElementsToXml(
208   * microsoft.exchange.webservices.EwsServiceXmlWriter)
209   */
210  @Override
211  protected void writeElementsToXml(EwsServiceXmlWriter writer)
212      throws Exception {
213    if (this.savedItemsDestinationFolder != null) {
214      writer.writeStartElement(XmlNamespace.Messages,
215          XmlElementNames.SavedItemFolderId);
216      this.savedItemsDestinationFolder.writeToXml(writer);
217      writer.writeEndElement();
218    }
219
220    writer.writeStartElement(XmlNamespace.Messages,
221        XmlElementNames.ItemChanges);
222
223    for (Item item : this.items) {
224      item.writeToXmlForUpdate(writer);
225    }
226
227    writer.writeEndElement();
228  }
229
230  /*
231   * (non-Javadoc)
232   *
233   * @seemicrosoft.exchange.webservices.ServiceRequestBase#
234   * getMinimumRequiredServerVersion()
235   */
236  @Override
237  protected ExchangeVersion getMinimumRequiredServerVersion() {
238    return ExchangeVersion.Exchange2007_SP1;
239  }
240
241  /**
242   * Gets the message disposition.
243   *
244   * @return the message disposition
245   */
246  public MessageDisposition getMessageDisposition() {
247    return this.messageDisposition;
248  }
249
250  /**
251   * Sets the message disposition.
252   *
253   * @param value the new message disposition
254   */
255  public void setMessageDisposition(MessageDisposition value) {
256    this.messageDisposition = value;
257  }
258
259  /**
260   * Gets the conflict resolution mode.
261   *
262   * @return the conflict resolution mode
263   */
264  public ConflictResolutionMode getConflictResolutionMode() {
265    return this.conflictResolutionMode;
266  }
267
268  /**
269   * Sets the conflict resolution mode.
270   *
271   * @param value the new conflict resolution mode
272   */
273  public void setConflictResolutionMode(ConflictResolutionMode value) {
274    this.conflictResolutionMode = value;
275  }
276
277  /**
278   * Gets the send invitations or cancellations mode.
279   *
280   * @return the send invitations or cancellations mode
281   */
282  public SendInvitationsOrCancellationsMode
283  getSendInvitationsOrCancellationsMode() {
284    return this.sendInvitationsOrCancellationsMode;
285  }
286
287  /**
288   * Sets the send invitations or cancellations mode.
289   *
290   * @param value the new send invitations or cancellations mode
291   */
292  public void setSendInvitationsOrCancellationsMode(
293      SendInvitationsOrCancellationsMode value) {
294    this.sendInvitationsOrCancellationsMode = value;
295  }
296
297  /**
298   * Gets the item.
299   *
300   * @return the item
301   */
302  public List<Item> getItems() {
303    return this.items;
304  }
305
306  /**
307   * Gets the saved item destination folder.
308   *
309   * @return the saved item destination folder
310   */
311  public FolderId getSavedItemsDestinationFolder() {
312    return this.savedItemsDestinationFolder;
313  }
314
315  /**
316   * Sets the saved item destination folder.
317   *
318   * @param value the new saved item destination folder
319   */
320  public void setSavedItemsDestinationFolder(FolderId value) {
321    this.savedItemsDestinationFolder = value;
322  }
323
324}