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.misc;
025
026import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
027import microsoft.exchange.webservices.data.core.EwsUtilities;
028import microsoft.exchange.webservices.data.core.XmlElementNames;
029import microsoft.exchange.webservices.data.core.enumeration.misc.ConversationActionType;
030import microsoft.exchange.webservices.data.core.enumeration.service.DeleteMode;
031import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
032import microsoft.exchange.webservices.data.core.exception.misc.ArgumentException;
033import microsoft.exchange.webservices.data.property.complex.ConversationId;
034import microsoft.exchange.webservices.data.property.complex.StringList;
035import org.apache.commons.logging.Log;
036import org.apache.commons.logging.LogFactory;
037
038import java.util.Date;
039
040/**
041 * ConversationAction class that represents
042 * ConversationActionType in the request XML.
043 * This class really is meant for representing
044 * single ConversationAction that needs to
045 * be taken on a conversation.
046 */
047public class ConversationAction {
048
049  private static final Log LOG = LogFactory.getLog(ConversationAction.class);
050
051  private ConversationActionType action;
052  private ConversationId conversationId;
053  private boolean processRightAway;
054
055  private boolean enableAlwaysDelete;
056  private StringList categories;
057  private FolderIdWrapper moveFolderId;
058  private FolderIdWrapper contextFolderId;
059  private DeleteMode deleteType;
060  private Boolean isRead;
061  private Date conversationLastSyncTime;
062
063  /**
064   * Gets conversation action
065   *
066   * @return action
067   */
068  protected ConversationActionType getAction() {
069    return this.action;
070  }
071
072  /**
073   * Sets conversation action
074   */
075  public void setAction(ConversationActionType value) {
076    this.action = value;
077  }
078
079  /**
080   * Gets conversation id
081   *
082   * @return conversationId
083   */
084  protected ConversationId getConversationId() {
085    return this.conversationId;
086  }
087
088  /**
089   * Sets conversation id
090   */
091  public void setConversationId(ConversationId value) {
092    this.conversationId = value;
093  }
094
095  /**
096   * Gets ProcessRightAway
097   *
098   * @return processRightAway
099   */
100  protected boolean getProcessRightAway() {
101    return this.processRightAway;
102  }
103
104  /**
105   * Sets ProcessRightAway
106   */
107  public void setProcessRightAway(boolean value) {
108    this.processRightAway = value;
109  }
110
111
112  /**
113   * Gets conversation categories for Always Categorize action
114   *
115   * @return categories
116   */
117  protected StringList getCategories() {
118    return this.categories;
119  }
120
121  /**
122   * Sets conversation categories for Always Categorize actions
123   */
124  public void setCategories(StringList value) {
125    this.categories = value;
126  }
127
128  /**
129   * Gets Enable Always Delete value for Always Delete action
130   *
131   * @return enableAlwaysDelete
132   */
133  protected boolean getEnableAlwaysDelete() {
134    return this.enableAlwaysDelete;
135  }
136
137  /**
138   * Sets Enable Always Delete value for Always Delete action
139   */
140  public void setEnableAlwaysDelete(boolean value) {
141    this.enableAlwaysDelete = value;
142  }
143
144  /**
145   * IsRead
146   *
147   * @return isRead
148   */
149  protected Boolean getIsRead() {
150    return this.isRead;
151  }
152
153  /**
154   * IsRead
155   */
156  public void setIsRead(Boolean value) {
157    this.isRead = value;
158  }
159
160  /**
161   * DeleteType
162   *
163   * @return deleteType
164   */
165  protected DeleteMode getDeleteType() {
166    return this.deleteType;
167  }
168
169  /**
170   * DeleteType
171   */
172  public void setDeleteType(DeleteMode value) {
173    this.deleteType = value;
174  }
175
176  /**
177   * ConversationLastSyncTime is used in one
178   * time action to determine the item
179   * on which to take the action.
180   *
181   * @return conversationLastSyncTime
182   */
183  protected Date getConversationLastSyncTime() {
184    return this.conversationLastSyncTime;
185  }
186
187  /**
188   * ConversationLastSyncTime is used in
189   * one time action to determine the item
190   * on which to take the action.
191   */
192  public void setConversationLastSyncTime(Date value) {
193    this.conversationLastSyncTime = value;
194  }
195
196  /**
197   * Gets folder id ContextFolder
198   *
199   * @return contextFolderId
200   */
201  protected FolderIdWrapper getContextFolderId() {
202    return this.contextFolderId;
203  }
204
205  /**
206   * Sets folder id ContextFolder
207   */
208  public void setContextFolderId(FolderIdWrapper value) {
209    this.contextFolderId = value;
210  }
211
212  /**
213   * Gets folder id for Move action
214   *
215   * @return moveFolderId
216   */
217  protected FolderIdWrapper getDestinationFolderId() {
218    return this.moveFolderId;
219  }
220
221  /**
222   * Sets folder id for Move action
223   */
224  public void setDestinationFolderId(FolderIdWrapper value) {
225    this.moveFolderId = value;
226  }
227
228  /**
229   * Gets the name of the XML element.
230   *
231   * @return XML element name.
232   */
233  protected String getXmlElementName() {
234    return XmlElementNames.ApplyConversationAction;
235  }
236
237  /**
238   * Validate request.
239   *
240   * @throws Exception
241   */
242  public void validate() throws Exception {
243    EwsUtilities.validateParam(this.conversationId, "conversationId");
244  }
245
246  /**
247   * Writes XML elements.
248   *
249   * @param writer The writer.
250   * @throws Exception
251   */
252  public void writeElementsToXml(EwsServiceXmlWriter writer)
253      throws Exception {
254    writer.writeStartElement(
255        XmlNamespace.Types,
256        XmlElementNames.ConversationAction);
257    try {
258      String actionValue = null;
259      if (this.getAction() == ConversationActionType.AlwaysCategorize) {
260        actionValue = XmlElementNames.AlwaysCategorize;
261      } else if (this.getAction() == ConversationActionType.AlwaysDelete) {
262        actionValue = XmlElementNames.AlwaysDelete;
263      } else if (this.getAction() == ConversationActionType.AlwaysMove) {
264        actionValue = XmlElementNames.AlwaysMove;
265      } else if (this.getAction() == ConversationActionType.Delete) {
266        actionValue = XmlElementNames.Delete;
267      } else if (this.getAction() == ConversationActionType.Copy) {
268        actionValue = XmlElementNames.Copy;
269      } else if (this.getAction() == ConversationActionType.Move) {
270        actionValue = XmlElementNames.Move;
271      } else if (this.getAction() == ConversationActionType.SetReadState) {
272        actionValue = XmlElementNames.SetReadState;
273      } else {
274        throw new ArgumentException("ConversationAction");
275      }
276
277      // Emit the action element
278      writer.writeElementValue(
279          XmlNamespace.Types,
280          XmlElementNames.Action,
281          actionValue);
282
283      // Emit the conversation id element
284      this.getConversationId().writeToXml(
285          writer,
286          XmlNamespace.Types,
287          XmlElementNames.ConversationId);
288
289      if (this.getAction() == ConversationActionType.AlwaysCategorize ||
290          this.getAction() == ConversationActionType.AlwaysDelete ||
291          this.getAction() == ConversationActionType.AlwaysMove) {
292        // Emit the ProcessRightAway element
293        writer.writeElementValue(
294            XmlNamespace.Types,
295            XmlElementNames.ProcessRightAway,
296            EwsUtilities.boolToXSBool(this.getProcessRightAway()));
297      }
298
299      if (this.getAction() == ConversationActionType.AlwaysCategorize) {
300        // Emit the categories element
301        if (this.getCategories() != null && this.getCategories().getSize() > 0) {
302          this.getCategories().writeToXml(
303              writer,
304              XmlNamespace.Types,
305              XmlElementNames.Categories);
306        }
307      } else if (this.getAction() == ConversationActionType.AlwaysDelete) {
308        // Emit the EnableAlwaysDelete element
309        writer.writeElementValue(
310            XmlNamespace.Types,
311            XmlElementNames.EnableAlwaysDelete,
312            EwsUtilities.boolToXSBool(this.
313                getEnableAlwaysDelete()));
314      } else if (this.getAction() == ConversationActionType.AlwaysMove) {
315        // Emit the Move Folder Id
316        if (this.getDestinationFolderId() != null) {
317          writer.writeStartElement(XmlNamespace.Types,
318              XmlElementNames.DestinationFolderId);
319          this.getDestinationFolderId().writeToXml(writer);
320          writer.writeEndElement();
321        }
322      } else {
323        if (this.getContextFolderId() != null) {
324          writer.writeStartElement(
325              XmlNamespace.Types,
326              XmlElementNames.ContextFolderId);
327
328          this.getContextFolderId().writeToXml(writer);
329
330          writer.writeEndElement();
331        }
332
333        if (this.getConversationLastSyncTime() != null) {
334          writer.writeElementValue(
335              XmlNamespace.Types,
336              XmlElementNames.ConversationLastSyncTime,
337              this.getConversationLastSyncTime());
338        }
339
340        if (this.getAction() == ConversationActionType.Copy) {
341          EwsUtilities.ewsAssert(this.getDestinationFolderId() != null,
342            "ApplyconversationActionRequest",
343            "DestinationFolderId should be set when performing copy action");
344
345          writer.writeStartElement(
346              XmlNamespace.Types,
347              XmlElementNames.DestinationFolderId);
348          this.getDestinationFolderId().writeToXml(writer);
349          writer.writeEndElement();
350        } else if (this.getAction() == ConversationActionType.Move) {
351          EwsUtilities.ewsAssert(this.getDestinationFolderId() != null,
352            "ApplyconversationActionRequest",
353            "DestinationFolderId should be set when performing move action");
354
355          writer.writeStartElement(
356              XmlNamespace.Types,
357              XmlElementNames.DestinationFolderId);
358          this.getDestinationFolderId().writeToXml(writer);
359          writer.writeEndElement();
360        } else if (this.getAction() == ConversationActionType.Delete) {
361          EwsUtilities.ewsAssert(this.getDeleteType() != null,
362            "ApplyconversationActionRequest",
363            "DeleteType should be specified when deleting a conversation.");
364
365          writer.writeElementValue(
366              XmlNamespace.Types,
367              XmlElementNames.DeleteType,
368              this.getDeleteType());
369        } else if (this.getAction() == ConversationActionType.SetReadState) {
370          EwsUtilities.ewsAssert(this.getIsRead() != null,
371            "ApplyconversationActionRequest",
372            "IsRead should be specified when marking/unmarking a conversation as read.");
373
374          writer.writeElementValue(
375              XmlNamespace.Types,
376              XmlElementNames.IsRead,
377              this.getIsRead());
378        }
379      }
380    } catch (Exception e) {
381      LOG.error(e);
382    } finally {
383      writer.writeEndElement();
384    }
385  }
386
387}