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.property.complex;
025
026import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
028import microsoft.exchange.webservices.data.core.EwsUtilities;
029import microsoft.exchange.webservices.data.core.XmlElementNames;
030import microsoft.exchange.webservices.data.core.enumeration.property.Importance;
031import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
032import microsoft.exchange.webservices.data.misc.MobilePhone;
033
034import java.util.ArrayList;
035import java.util.Collection;
036
037/**
038 * Represents the set of actions available for a rule.
039 */
040public final class RuleActions extends ComplexProperty {
041
042  /**
043   * SMS recipient address type.
044   */
045  private static final String MobileType = "MOBILE";
046
047  /**
048   * The AssignCategories action.
049   */
050  private StringList assignCategories;
051
052  /**
053   * The CopyToFolder action.
054   */
055  private FolderId copyToFolder;
056
057  /**
058   * The Delete action.
059   */
060  private boolean delete;
061
062  /**
063   * The ForwardAsAttachmentToRecipients action.
064   */
065  private EmailAddressCollection forwardAsAttachmentToRecipients;
066
067  /**
068   * The ForwardToRecipients action.
069   */
070  private EmailAddressCollection forwardToRecipients;
071
072  /**
073   * The MarkImportance action.
074   */
075  private Importance markImportance;
076
077  /**
078   * The MarkAsRead action.
079   */
080  private boolean markAsRead;
081
082  /**
083   * The MoveToFolder action.
084   */
085  private FolderId moveToFolder;
086
087  /**
088   * The PermanentDelete action.
089   */
090  private boolean permanentDelete;
091
092  /**
093   * The RedirectToRecipients action.
094   */
095  private EmailAddressCollection redirectToRecipients;
096
097  /**
098   * The SendSMSAlertToRecipients action.
099   */
100  private Collection<MobilePhone> sendSMSAlertToRecipients;
101
102  /**
103   * The ServerReplyWithMessage action.
104   */
105  private ItemId serverReplyWithMessage;
106
107  /**
108   * The StopProcessingRules action.
109   */
110  private boolean stopProcessingRules;
111
112  /**
113   * Initializes a new instance of the RulePredicates class.
114   */
115  protected RuleActions() {
116    super();
117    this.assignCategories = new StringList();
118    this.forwardAsAttachmentToRecipients =
119        new EmailAddressCollection(XmlElementNames.Address);
120    this.forwardToRecipients =
121        new EmailAddressCollection(XmlElementNames.Address);
122    this.redirectToRecipients =
123        new EmailAddressCollection(XmlElementNames.Address);
124    this.sendSMSAlertToRecipients = new ArrayList<MobilePhone>();
125  }
126
127  /**
128   * Gets the categories that should be stamped on incoming messages.
129   * To disable stamping incoming messages with categories, set
130   * AssignCategories to null.
131   */
132  public StringList getAssignCategories() {
133
134    return this.assignCategories;
135
136  }
137
138  /**
139   * Gets or sets the Id of the folder incoming messages should be copied to.
140   * To disable copying incoming messages
141   * to a folder, set CopyToFolder to null.
142   */
143  public FolderId getCopyToFolder() {
144    return this.copyToFolder;
145  }
146
147  public void setCopyToFolder(FolderId value) {
148    if (this.canSetFieldValue(this.copyToFolder, value)) {
149      this.copyToFolder = value;
150      this.changed();
151    }
152  }
153
154  /**
155   * Gets or sets a value indicating whether incoming messages should be
156   * automatically moved to the Deleted Items folder.
157   */
158  public boolean getDelete() {
159    return this.delete;
160  }
161
162  public void setDelete(boolean value) {
163    if (this.canSetFieldValue(this.delete, value)) {
164      this.delete = value;
165      this.changed();
166    }
167
168  }
169
170  /**
171   * Gets the e-mail addresses to which incoming messages should be
172   * forwarded as attachments. To disable forwarding incoming messages
173   * as attachments, empty the ForwardAsAttachmentToRecipients list.
174   */
175  public EmailAddressCollection getForwardAsAttachmentToRecipients() {
176    return this.forwardAsAttachmentToRecipients;
177  }
178
179  /**
180   * Gets the e-mail addresses to which
181   * incoming messages should be forwarded.
182   * To disable forwarding incoming messages,
183   * empty the ForwardToRecipients list.
184   */
185  public EmailAddressCollection getForwardToRecipients() {
186    return this.forwardToRecipients;
187
188  }
189
190  /**
191   * Gets or sets the importance that should be stamped on incoming
192   * messages. To disable the stamping of incoming messages with an
193   * importance, set MarkImportance to null.
194   */
195  public Importance getMarkImportance() {
196    return this.markImportance;
197  }
198
199  public void setMarkImportance(Importance value) {
200    if (this.canSetFieldValue(this.markImportance, value)) {
201      this.markImportance = value;
202      this.changed();
203    }
204  }
205
206  /**
207   * Gets or sets a value indicating whether
208   * incoming messages should be marked as read.
209   */
210  public boolean getMarkAsRead() {
211    return this.markAsRead;
212  }
213
214  public void setMarkAsRead(boolean value) {
215    if (this.canSetFieldValue(this.markAsRead, value)) {
216      this.markAsRead = value;
217      this.changed();
218    }
219  }
220
221  /**
222   * Gets or sets the Id of the folder to which incoming messages should be
223   * moved. To disable the moving of incoming messages to a folder, set
224   * CopyToFolder to null.
225   */
226  public FolderId getMoveToFolder() {
227    return this.moveToFolder;
228  }
229
230  public void setMoveToFolder(FolderId value) {
231    if (this.canSetFieldValue(this.moveToFolder, value)) {
232      this.moveToFolder = value;
233      this.changed();
234    }
235
236  }
237
238  /**
239   * Gets or sets a value indicating whether incoming messages should be
240   * permanently deleted. When a message is permanently deleted, it is never
241   * saved into the recipient's mailbox. To delete a message after it has
242   * saved into the recipient's mailbox. To delete a message after it has
243   */
244  public boolean getPermanentDelete() {
245    return this.permanentDelete;
246  }
247
248  public void setPermanentDelete(boolean value) {
249    if (this.canSetFieldValue(this.permanentDelete, value)) {
250      this.permanentDelete = value;
251      this.changed();
252    }
253  }
254
255  /**
256   * Gets the e-mail addresses to which incoming messages should be
257   * redirecteded. To disable redirection of incoming messages, empty
258   * the RedirectToRecipients list. Unlike forwarded mail, redirected mail
259   * maintains the original sender and recipients.
260   */
261  public EmailAddressCollection getRedirectToRecipients() {
262    return this.redirectToRecipients;
263
264  }
265
266  /**
267   * Gets the phone numbers to which an SMS alert should be sent. To disable
268   * sending SMS alerts for incoming messages, empty the
269   * SendSMSAlertToRecipients list.
270   */
271  public Collection<MobilePhone> getSendSMSAlertToRecipients() {
272    return this.sendSMSAlertToRecipients;
273
274  }
275
276  /**
277   * Gets or sets the Id of the template message that should be sent
278   * as a reply to incoming messages. To disable automatic replies, set
279   * ServerReplyWithMessage to null.
280   */
281  public ItemId getServerReplyWithMessage() {
282    return this.serverReplyWithMessage;
283  }
284
285  public void setServerReplyWithMessage(ItemId value) {
286    if (this.canSetFieldValue(this.serverReplyWithMessage, value)) {
287      this.serverReplyWithMessage = value;
288      this.changed();
289    }
290  }
291
292  /**
293   * Gets or sets a value indicating whether
294   * subsequent rules should be evaluated.
295   */
296  public boolean getStopProcessingRules() {
297    return this.stopProcessingRules;
298  }
299
300  public void setStopProcessingRules(boolean value) {
301    if (this.canSetFieldValue(this.stopProcessingRules, value)) {
302      this.stopProcessingRules = value;
303      this.changed();
304    }
305
306  }
307
308  /**
309   * Tries to read element from XML.
310   *
311   * @param reader The reader.
312   * @return True if element was read.
313   * @throws Exception
314   */
315  @Override
316  public boolean tryReadElementFromXml(EwsServiceXmlReader
317      reader) throws Exception {
318    if (reader.getLocalName().equals(XmlElementNames.CopyToFolder)) {
319      reader.readStartElement(XmlNamespace.NotSpecified,
320          XmlElementNames.FolderId);
321      this.copyToFolder = new FolderId();
322      this.copyToFolder.loadFromXml(reader, XmlElementNames.FolderId);
323      reader.readEndElement(XmlNamespace.NotSpecified,
324          XmlElementNames.CopyToFolder);
325      return true;
326    } else if (reader.getLocalName().equals(XmlElementNames.AssignCategories)) {
327      this.assignCategories.loadFromXml(reader,
328          reader.getLocalName());
329      return true;
330    } else if (reader.getLocalName().equals(XmlElementNames.Delete)) {
331      this.delete = reader.readElementValue(Boolean.class);
332      return true;
333    } else if (reader.getLocalName().equals(XmlElementNames.ForwardAsAttachmentToRecipients)) {
334      this.forwardAsAttachmentToRecipients.loadFromXml(reader,
335          reader.getLocalName());
336      return true;
337    } else if (reader.getLocalName().equals(XmlElementNames.ForwardToRecipients)) {
338      this.forwardToRecipients.loadFromXml(reader, reader.getLocalName());
339      return true;
340    } else if (reader.getLocalName().equals(XmlElementNames.MarkImportance)) {
341      this.markImportance = reader.readElementValue(Importance.class);
342      return true;
343    } else if (reader.getLocalName().equals(XmlElementNames.MarkAsRead)) {
344      this.markAsRead = reader.readElementValue(Boolean.class);
345      return true;
346    } else if (reader.getLocalName().equals(XmlElementNames.MoveToFolder)) {
347      reader.readStartElement(XmlNamespace.NotSpecified,
348          XmlElementNames.FolderId);
349      this.moveToFolder = new FolderId();
350      this.moveToFolder.loadFromXml(reader, XmlElementNames.FolderId);
351      reader.readEndElement(XmlNamespace.NotSpecified,
352          XmlElementNames.MoveToFolder);
353      return true;
354    } else if (reader.getLocalName().equals(XmlElementNames.PermanentDelete)) {
355      this.permanentDelete = reader.readElementValue(Boolean.class);
356      return true;
357    } else if (reader.getLocalName().equals(XmlElementNames.RedirectToRecipients)) {
358      this.redirectToRecipients.loadFromXml(reader,
359          reader.getLocalName());
360      return true;
361    } else if (reader.getLocalName().equals(XmlElementNames.SendSMSAlertToRecipients)) {
362      EmailAddressCollection smsRecipientCollection =
363          new EmailAddressCollection(XmlElementNames.Address);
364      smsRecipientCollection.loadFromXml(reader, reader.getLocalName());
365      this.sendSMSAlertToRecipients = convertSMSRecipientsFromEmailAddressCollectionToMobilePhoneCollection(
366          smsRecipientCollection);
367      return true;
368    } else if (reader.getLocalName().equals(XmlElementNames.ServerReplyWithMessage)) {
369      this.serverReplyWithMessage = new ItemId();
370      this.serverReplyWithMessage.loadFromXml(reader,
371          reader.getLocalName());
372      return true;
373    } else if (reader.getLocalName().equals(XmlElementNames.StopProcessingRules)) {
374      this.stopProcessingRules = reader.readElementValue(Boolean.class);
375      return true;
376    } else {
377      return false;
378    }
379
380  }
381
382  /**
383   * Writes elements to XML.
384   *
385   * @param writer The writer.
386   * @throws Exception
387   */
388  @Override
389  public void writeElementsToXml(EwsServiceXmlWriter writer)
390      throws Exception {
391    if (this.getAssignCategories().getSize() > 0) {
392      this.getAssignCategories().writeToXml(writer,
393          XmlElementNames.AssignCategories);
394    }
395
396    if (this.getCopyToFolder() != null) {
397      writer.writeStartElement(XmlNamespace.Types,
398          XmlElementNames.CopyToFolder);
399      this.getCopyToFolder().writeToXml(writer);
400      writer.writeEndElement();
401    }
402
403    if (this.getDelete() != false) {
404      writer.writeElementValue(
405          XmlNamespace.Types,
406          XmlElementNames.Delete,
407          this.getDelete());
408    }
409
410    if (this.getForwardAsAttachmentToRecipients().getCount() > 0) {
411      this.getForwardAsAttachmentToRecipients().writeToXml(writer,
412          XmlElementNames.ForwardAsAttachmentToRecipients);
413    }
414
415    if (this.getForwardToRecipients().getCount() > 0) {
416      this.getForwardToRecipients().writeToXml(writer,
417          XmlElementNames.ForwardToRecipients);
418    }
419
420    if (this.getMarkImportance() != null) {
421      writer.writeElementValue(
422          XmlNamespace.Types,
423          XmlElementNames.MarkImportance,
424          this.getMarkImportance());
425    }
426
427    if (this.getMarkAsRead() != false) {
428      writer.writeElementValue(
429          XmlNamespace.Types,
430          XmlElementNames.MarkAsRead,
431          this.getMarkAsRead());
432    }
433
434    if (this.getMoveToFolder() != null) {
435      writer.writeStartElement(XmlNamespace.Types,
436          XmlElementNames.MoveToFolder);
437      this.getMoveToFolder().writeToXml(writer);
438      writer.writeEndElement();
439    }
440
441    if (this.getPermanentDelete() != false) {
442      writer.writeElementValue(
443          XmlNamespace.Types,
444          XmlElementNames.PermanentDelete,
445          this.getPermanentDelete());
446    }
447
448    if (this.getRedirectToRecipients().getCount() > 0) {
449      this.getRedirectToRecipients().writeToXml(writer,
450          XmlElementNames.RedirectToRecipients);
451    }
452
453    if (this.getSendSMSAlertToRecipients().size() > 0) {
454      EmailAddressCollection emailCollection =
455          convertSMSRecipientsFromMobilePhoneCollectionToEmailAddressCollection(
456              this.getSendSMSAlertToRecipients());
457      emailCollection.writeToXml(writer,
458          XmlElementNames.SendSMSAlertToRecipients);
459    }
460
461    if (this.getServerReplyWithMessage() != null) {
462      this.getServerReplyWithMessage().writeToXml(writer,
463          XmlElementNames.ServerReplyWithMessage);
464    }
465
466    if (this.getStopProcessingRules() != false) {
467      writer.writeElementValue(
468          XmlNamespace.Types,
469          XmlElementNames.StopProcessingRules,
470          this.getStopProcessingRules());
471    }
472  }
473
474  /**
475   * Validates this instance.
476   *
477   * @throws Exception
478   */
479  @Override
480  protected void internalValidate() throws Exception {
481    super.internalValidate();
482    EwsUtilities.validateParam(this.forwardAsAttachmentToRecipients, "ForwardAsAttachmentToRecipients");
483    EwsUtilities.validateParam(this.forwardToRecipients,
484        "ForwardToRecipients");
485    EwsUtilities.validateParam(this.redirectToRecipients,
486        "RedirectToRecipients");
487    for (MobilePhone sendSMSAlertToRecipient : this.sendSMSAlertToRecipients) {
488      EwsUtilities.validateParam(sendSMSAlertToRecipient,
489          "SendSMSAlertToRecipient");
490    }
491  }
492
493  /**
494   * Convert the SMS recipient list from
495   * EmailAddressCollection type to MobilePhone collection type.
496   *
497   * @return A MobilePhone collection object
498   * containing all SMS recipient in MobilePhone type.
499   */
500  private static Collection<MobilePhone> convertSMSRecipientsFromEmailAddressCollectionToMobilePhoneCollection(
501      EmailAddressCollection emailCollection) {
502    Collection<MobilePhone> mobilePhoneCollection =
503        new ArrayList<MobilePhone>();
504    for (EmailAddress emailAddress : emailCollection) {
505      mobilePhoneCollection.add(new MobilePhone(emailAddress.getName(),
506          emailAddress.getAddress()));
507    }
508
509    return mobilePhoneCollection;
510  }
511
512  /**
513   * Convert the SMS recipient list from MobilePhone
514   * collection type to EmailAddressCollection type.
515   *
516   * @return An EmailAddressCollection object
517   * containing recipients with "MOBILE" address type.
518   */
519  private static EmailAddressCollection convertSMSRecipientsFromMobilePhoneCollectionToEmailAddressCollection(
520      Collection<MobilePhone> recipientCollection) {
521    EmailAddressCollection emailCollection =
522        new EmailAddressCollection(XmlElementNames.Address);
523    for (MobilePhone recipient : recipientCollection) {
524      EmailAddress emailAddress = new EmailAddress(
525          recipient.getName(),
526          recipient.getPhoneNumber(),
527          RuleActions.MobileType);
528      emailCollection.add(emailAddress);
529    }
530
531    return emailCollection;
532  }
533
534}
535