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.property.complex;
025    
026    import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027    import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
028    import microsoft.exchange.webservices.data.core.EwsUtilities;
029    import microsoft.exchange.webservices.data.core.XmlElementNames;
030    import microsoft.exchange.webservices.data.core.enumeration.misc.FlaggedForAction;
031    import microsoft.exchange.webservices.data.core.enumeration.property.Importance;
032    import microsoft.exchange.webservices.data.core.enumeration.property.Sensitivity;
033    import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
034    
035    /**
036     * Represents the set of conditions and exception available for a rule.
037     */
038    public final class RulePredicates extends ComplexProperty {
039    
040      /**
041       * The HasCategories predicate.
042       */
043      private StringList categories;
044    
045      /**
046       * The ContainsBodyStrings predicate.
047       */
048      private StringList containsBodyStrings;
049      /**
050       * The ContainsHeaderStrings predicate.
051       */
052      private StringList containsHeaderStrings;
053    
054      /**
055       * The ContainsRecipientStrings predicate.
056       */
057      private StringList containsRecipientStrings;
058    
059      /**
060       * The ContainsSenderStrings predicate.
061       */
062      private StringList containsSenderStrings;
063    
064      /**
065       * The ContainsSubjectOrBodyStrings predicate.
066       */
067      private StringList containsSubjectOrBodyStrings;
068    
069      /**
070       * The ContainsSubjectStrings predicate.
071       */
072      private StringList containsSubjectStrings;
073    
074      /**
075       * The FlaggedForAction predicate.
076       */
077      private FlaggedForAction flaggedForAction;
078    
079      /**
080       * The FromAddresses predicate.
081       */
082      private EmailAddressCollection fromAddresses;
083    
084      /**
085       * The FromConnectedAccounts predicate.
086       */
087      private StringList fromConnectedAccounts;
088    
089      /**
090       * The HasAttachments predicate.
091       */
092      private boolean hasAttachments;
093    
094      /**
095       * The Importance predicate.
096       */
097      private Importance importance;
098    
099      /**
100       * The IsApprovalRequest predicate.
101       */
102      private boolean isApprovalRequest;
103    
104      /**
105       * The IsAutomaticForward predicate.
106       */
107      private boolean isAutomaticForward;
108    
109      /**
110       * The IsAutomaticReply predicate.
111       */
112      private boolean isAutomaticReply;
113    
114      /**
115       * The IsEncrypted predicate.
116       */
117      private boolean isEncrypted;
118    
119      /**
120       * The IsMeetingRequest predicate.
121       */
122      private boolean isMeetingRequest;
123    
124      /**
125       * The IsMeetingResponse predicate.
126       */
127      private boolean isMeetingResponse;
128    
129      /**
130       * The IsNDR predicate.
131       */
132      private boolean isNonDeliveryReport;
133    
134      /**
135       * The IsPermissionControlled predicate.
136       */
137      private boolean isPermissionControlled;
138    
139      /**
140       * The IsSigned predicate.
141       */
142      private boolean isSigned;
143    
144      /**
145       * The IsVoicemail predicate.
146       */
147      private boolean isVoicemail;
148    
149      /**
150       * The IsReadReceipt  predicate.
151       */
152      private boolean isReadReceipt;
153    
154      /**
155       * ItemClasses predicate.
156       */
157      private StringList itemClasses;
158    
159      /**
160       * The MessageClassifications predicate.
161       */
162      private StringList messageClassifications;
163    
164      /**
165       * The NotSentToMe predicate.
166       */
167      private boolean notSentToMe;
168    
169      /**
170       * SentCcMe predicate.
171       */
172      private boolean sentCcMe;
173    
174      /**
175       * The SentOnlyToMe predicate.
176       */
177      private boolean sentOnlyToMe;
178    
179      /**
180       * The SentToAddresses predicate.
181       */
182      private EmailAddressCollection sentToAddresses;
183    
184      /**
185       * The SentToMe predicate.
186       */
187      private boolean sentToMe;
188    
189      /**
190       * The SentToOrCcMe predicate.
191       */
192      private boolean sentToOrCcMe;
193    
194      /**
195       * The Sensitivity predicate.
196       */
197      private Sensitivity sensitivity;
198    
199      /**
200       * The Sensitivity predicate.
201       */
202      private RulePredicateDateRange withinDateRange;
203    
204      /**
205       * The Sensitivity predicate.
206       */
207      private RulePredicateSizeRange withinSizeRange;
208    
209      /**
210       * Initializes a new instance of the RulePredicates class.
211       */
212      protected RulePredicates() {
213        super();
214        this.categories = new StringList();
215        this.containsBodyStrings = new StringList();
216        this.containsHeaderStrings = new StringList();
217        this.containsRecipientStrings = new StringList();
218        this.containsSenderStrings = new StringList();
219        this.containsSubjectOrBodyStrings = new StringList();
220        this.containsSubjectStrings = new StringList();
221        this.fromAddresses =
222            new EmailAddressCollection(XmlElementNames.Address);
223        this.fromConnectedAccounts = new StringList();
224        this.itemClasses = new StringList();
225        this.messageClassifications = new StringList();
226        this.sentToAddresses =
227            new EmailAddressCollection(XmlElementNames.Address);
228        this.withinDateRange = new RulePredicateDateRange();
229        this.withinSizeRange = new RulePredicateSizeRange();
230      }
231    
232      /**
233       * Gets the categories that an incoming message
234       * should be stamped with for the condition or exception to apply.
235       * To disable this predicate, empty the list.
236       */
237      public StringList getCategories() {
238        return this.categories;
239      }
240    
241      /**
242       * Gets the strings that should appear in the body of
243       * incoming messages for the condition or exception to apply.
244       * To disable this predicate, empty the list.
245       */
246      public StringList getContainsBodyStrings() {
247        return this.containsBodyStrings;
248      }
249    
250      /**
251       * Gets the strings that should appear in the
252       * headers of incoming messages for the condition or
253       * exception to apply. To disable this predicate, empty the list.
254       */
255      public StringList getContainsHeaderStrings() {
256        return this.containsHeaderStrings;
257      }
258    
259      /**
260       * Gets the strings that should appear in either the
261       * To or Cc fields of incoming messages for the condition
262       * or exception to apply. To disable this predicate, empty the list.
263       */
264      public StringList getContainsRecipientStrings() {
265        return this.containsRecipientStrings;
266      }
267    
268      /**
269       * Gets the strings that should appear
270       * in the From field of incoming messages
271       * for the condition or exception to apply.
272       * To disable this predicate, empty  the list.
273       */
274      public StringList getContainsSenderStrings() {
275        return this.containsSenderStrings;
276      }
277    
278      /**
279       * Gets the strings that should appear in either
280       * the body or the subject of incoming messages for the
281       * condition or exception to apply.
282       * To disable this predicate, empty the list.
283       */
284      public StringList getContainsSubjectOrBodyStrings() {
285        return this.containsSubjectOrBodyStrings;
286      }
287    
288      /**
289       * Gets the strings that should appear in the subject
290       * of incoming messages for the condition or exception
291       * to apply. To disable this predicate, empty the list.
292       */
293      public StringList getContainsSubjectStrings() {
294        return this.containsSubjectStrings;
295      }
296    
297      /**
298       * Gets or sets the flag for action value that should
299       * appear on incoming messages for the condition or execption to apply.
300       * To disable this predicate, set it to null.
301       */
302      public FlaggedForAction getFlaggedForAction() {
303    
304        return this.flaggedForAction;
305      }
306    
307      public void setFlaggedForAction(FlaggedForAction value) {
308        if (this.canSetFieldValue(this.flaggedForAction, value)) {
309          this.flaggedForAction = value;
310          this.changed();
311        }
312      }
313    
314      /**
315       * Gets the e-mail addresses of the senders of incoming
316       * messages for the condition or exception to apply.
317       * To disable this predicate, empty the list.
318       */
319      public EmailAddressCollection getFromAddresses() {
320        return this.fromAddresses;
321      }
322    
323      /**
324       * Gets or sets a value indicating whether incoming messages must have
325       * attachments for the condition or exception to apply.
326       */
327      public boolean getHasAttachments() {
328        return this.hasAttachments;
329      }
330    
331      public void setHasAttachments(boolean value) {
332        if (this.canSetFieldValue(this.hasAttachments, value)) {
333          this.hasAttachments = value;
334          this.changed();
335        }
336      }
337    
338      /**
339       * Gets or sets the importance that should be stamped on incoming messages
340       * for the condition or exception to apply.
341       * To disable this predicate, set it to null.
342       */
343      public Importance getImportance() {
344        return this.importance;
345      }
346    
347      public void setImportance(Importance value) {
348        if (this.canSetFieldValue(this.importance, value)) {
349          this.importance = value;
350          this.changed();
351        }
352      }
353    
354      /**
355       * Gets or sets a value indicating whether incoming messages must be
356       * approval request for the condition or exception to apply.
357       */
358      public boolean getIsApprovalRequest() {
359        return this.isApprovalRequest;
360      }
361    
362      public void setIsApprovalRequest(boolean value) {
363        if (this.canSetFieldValue(this.isApprovalRequest, value)) {
364    
365          this.isApprovalRequest = value;
366          this.changed();
367        }
368      }
369    
370      /**
371       * Gets or sets a value indicating whether incoming messages must be
372       * automatic forwards for the condition or exception to apply.
373       */
374      public boolean getIsAutomaticForward() {
375        return this.isAutomaticForward;
376      }
377    
378      public void setIsAutomaticForward(boolean value) {
379        if (this.canSetFieldValue(this.isAutomaticForward, value)) {
380          this.isAutomaticForward = value;
381          this.changed();
382        }
383      }
384    
385      /**
386       * Gets or sets a value indicating whether incoming messages must be
387       * automatic replies for the condition or exception to apply.
388       */
389      public boolean getIsAutomaticReply() {
390        return this.isAutomaticReply;
391      }
392    
393      public void setIsAutomaticReply(boolean value) {
394        if (this.canSetFieldValue(this.isAutomaticReply, value)) {
395          this.isAutomaticReply = value;
396          this.changed();
397        }
398      }
399    
400    
401      /**
402       * Gets or sets a value indicating whether incoming messages must be
403       * S/MIME encrypted for the condition or exception to apply.
404       */
405      public boolean getIsEncrypted() {
406        return this.isEncrypted;
407      }
408    
409      public void setIsEncrypted(boolean value) {
410        if (this.canSetFieldValue(this.isEncrypted, value)) {
411          this.isEncrypted = value;
412          this.changed();
413        }
414      }
415    
416      /**
417       * Gets or sets a value indicating whether incoming messages must be
418       * meeting request for the condition or exception to apply.
419       */
420      public boolean getIsMeetingRequest() {
421        return this.isMeetingRequest;
422      }
423    
424      public void setIsMeetingRequest(boolean value) {
425        if (this.canSetFieldValue(this.isEncrypted, value)) {
426    
427          this.isEncrypted = value;
428          this.changed();
429        }
430    
431      }
432    
433    
434      /**
435       * Gets or sets a value indicating whether incoming messages must be
436       * meeting response for the condition or exception to apply.
437       */
438      public boolean getIsMeetingResponse() {
439    
440        return this.isMeetingResponse;
441      }
442    
443      public void setIsMeetingResponse(boolean value) {
444        if (this.canSetFieldValue(this.isMeetingResponse, value)) {
445          this.isMeetingResponse = value;
446          this.changed();
447        }
448      }
449    
450      /**
451       * Gets or sets a value indicating whether incoming messages must be
452       * non-delivery reports (NDR) for the condition or exception to apply.
453       */
454      public boolean getIsNonDeliveryReport() {
455        return this.isNonDeliveryReport;
456      }
457    
458      public void setIsNonDeliveryReport(boolean value) {
459        if (this.canSetFieldValue(this.isNonDeliveryReport, value)) {
460          this.isNonDeliveryReport = value;
461          this.changed();
462        }
463      }
464    
465      /**
466       * Gets or sets a value indicating whether incoming messages must be
467       * permission controlled (RMS protected) for the condition or exception
468       * to apply.
469       */
470      public boolean getIsPermissionControlled() {
471        return this.isPermissionControlled;
472      }
473    
474      public void setIsPermissionControlled(boolean value) {
475        if (this.canSetFieldValue(this.isPermissionControlled, value)) {
476          this.isPermissionControlled = value;
477          this.changed();
478        }
479      }
480    
481    
482      /**
483       * Gets or sets a value indicating whether incoming messages must be
484       * S/MIME signed for the condition or exception to apply.
485       */
486      public boolean getIsSigned() {
487        return this.isSigned;
488      }
489    
490      public void setIsSigned(boolean value) {
491        if (this.canSetFieldValue(this.isSigned, value)) {
492          this.isSigned = value;
493          this.changed();
494        }
495      }
496    
497    
498      /**
499       * Gets or sets a value indicating whether incoming messages must be
500       * voice mails for the condition or exception to apply.
501       */
502      public boolean getIsVoicemail() {
503        return this.isVoicemail;
504      }
505    
506      public void setIsVoicemail(boolean value) {
507        if (this.canSetFieldValue(this.isVoicemail, value)) {
508          this.isVoicemail = value;
509          this.changed();
510        }
511      }
512    
513    
514      /**
515       * Gets or sets a value indicating whether incoming messages must be
516       * read receipts for the condition or exception to apply.
517       */
518      public boolean getIsReadReceipt() {
519        return this.isReadReceipt;
520      }
521    
522      public void setIsReadReceipt(boolean value) {
523        if (this.canSetFieldValue(this.isReadReceipt, value)) {
524          this.isReadReceipt = value;
525          this.changed();
526        }
527      }
528    
529      /**
530       * Gets the e-mail account names from which incoming messages must have
531       * been aggregated for the condition or exception to apply. To disable
532       * this predicate, empty the list.
533       */
534      public StringList getFromConnectedAccounts() {
535        return this.fromConnectedAccounts;
536      }
537    
538      /**
539       * Gets the item classes that must be stamped on incoming messages for
540       * the condition or exception to apply. To disable this predicate,
541       * empty the list.
542       */
543      public StringList getItemClasses() {
544        return this.itemClasses;
545      }
546    
547      /**
548       * Gets the message classifications that
549       * must be stamped on incoming messages
550       * for the condition or exception to apply. To disable this predicate,
551       * empty the list.
552       */
553      public StringList getMessageClassifications() {
554    
555        return this.messageClassifications;
556    
557      }
558    
559      /**
560       * Gets or sets a value indicating whether the owner of the mailbox must
561       * NOT be a To recipient of the incoming messages for the condition or
562       * exception to apply.
563       */
564    
565      public boolean getNotSentToMe() {
566        return this.notSentToMe;
567      }
568    
569      public void setNotSentToMe(boolean value) {
570        if (this.canSetFieldValue(this.notSentToMe, value)) {
571          this.notSentToMe = value;
572          this.changed();
573        }
574      }
575    
576    
577      /**
578       * Gets or sets a value indicating whether the owner of the mailbox must be
579       * a Cc recipient of incoming messages
580       * for the condition or exception to apply.
581       */
582      public boolean getSentCcMe() {
583        return this.sentCcMe;
584      }
585    
586      public void setSentCcMe(boolean value) {
587        if (this.canSetFieldValue(this.sentCcMe, value)) {
588          this.sentCcMe = value;
589          this.changed();
590        }
591      }
592    
593    
594      /**
595       * Gets or sets a value indicating whether the owner of the mailbox must be
596       * the only To recipient of incoming
597       * messages for the condition or exception
598       * to apply.
599       */
600      public boolean getSentOnlyToMe() {
601        return this.sentOnlyToMe;
602      }
603    
604      public void setSentOnlyToMe(boolean value) {
605        if (this.canSetFieldValue(this.sentOnlyToMe, value)) {
606          this.sentOnlyToMe = value;
607          this.changed();
608        }
609      }
610    
611    
612      /**
613       * Gets the e-mail addresses incoming messages must have been sent to for
614       * the condition or exception to apply. To disable this predicate, empty
615       * the list.
616       */
617      public EmailAddressCollection getSentToAddresses() {
618        return this.sentToAddresses;
619    
620      }
621    
622      /**
623       * Gets or sets a value indicating whether the owner of the mailbox must be
624       * a To recipient of incoming messages
625       * for the condition or exception to apply.
626       */
627      public boolean getSentToMe() {
628        return this.sentToMe;
629      }
630    
631      public void setSentToMe(boolean value) {
632        if (this.canSetFieldValue(this.sentToMe, value)) {
633          this.sentToMe = value;
634          this.changed();
635        }
636      }
637    
638    
639      /**
640       * Gets or sets a value indicating whether the owner of the mailbox must be
641       * either a To or Cc recipient of incoming messages for the condition or
642       * exception to apply.
643       */
644      public boolean getSentToOrCcMe() {
645        return this.sentToOrCcMe;
646      }
647    
648      public void setSentToOrCcMe(boolean value) {
649        if (this.canSetFieldValue(this.sentToOrCcMe, value)) {
650          this.sentToOrCcMe = value;
651          this.changed();
652        }
653      }
654    
655    
656      /**
657       * Gets or sets the sensitivity that must be stamped on incoming messages
658       * for the condition or exception to apply.
659       * To disable this predicate, set it
660       * to null.
661       */
662      public Sensitivity getSensitivity() {
663        return this.sensitivity;
664      }
665    
666      public void setSensitivity(Sensitivity value) {
667        if (this.canSetFieldValue(this.sensitivity, value)) {
668          this.sensitivity = value;
669          this.changed();
670        }
671      }
672    
673      /**
674       * Gets the date range within which
675       * incoming messages must have been received
676       * for the condition or exception to apply.
677       * To disable this predicate, set both
678       * its Start and End property to null.
679       */
680      public RulePredicateDateRange getWithinDateRange() {
681        return this.withinDateRange;
682    
683      }
684    
685      /**
686       * Gets the minimum and maximum sizes incoming messages must have for the
687       * condition or exception to apply. To disable this predicate, set both its
688       * MinimumSize and MaximumSize property to null.
689       */
690      public RulePredicateSizeRange getWithinSizeRange() {
691        return this.withinSizeRange;
692    
693      }
694    
695      /**
696       * Tries to read element from XML.
697       *
698       * @param reader The reader
699       * @return True if element was read.
700       * @throws Exception
701       */
702      @Override
703      public boolean tryReadElementFromXml(EwsServiceXmlReader
704          reader) throws Exception {
705    
706        if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.Categories)) {
707          this.categories.loadFromXml(reader, reader.getLocalName());
708          return true;
709        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.ContainsBodyStrings)) {
710          this.containsBodyStrings.loadFromXml(reader, reader.getLocalName());
711          return true;
712        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.ContainsHeaderStrings)) {
713          this.containsHeaderStrings.loadFromXml(reader,
714              reader.getLocalName());
715          return true;
716        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.ContainsRecipientStrings)) {
717          this.containsRecipientStrings.loadFromXml(reader,
718              reader.getLocalName());
719          return true;
720        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.ContainsSenderStrings)) {
721          this.containsSenderStrings.loadFromXml(reader,
722              reader.getLocalName());
723          return true;
724        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.ContainsSubjectOrBodyStrings)) {
725          this.containsSubjectOrBodyStrings.loadFromXml(reader,
726              reader.getLocalName());
727          return true;
728        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.ContainsSubjectStrings)) {
729          this.containsSubjectStrings.loadFromXml(reader,
730              reader.getLocalName());
731          return true;
732        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.FlaggedForAction)) {
733          this.flaggedForAction = reader.
734              readElementValue(FlaggedForAction.class);
735          return true;
736        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.FromAddresses)) {
737          this.fromAddresses.loadFromXml(reader, reader.getLocalName());
738          return true;
739        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.FromConnectedAccounts)) {
740          this.fromConnectedAccounts.loadFromXml(reader,
741              reader.getLocalName());
742          return true;
743        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.HasAttachments)) {
744          this.hasAttachments = reader.readElementValue(Boolean.class);
745          return true;
746        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.Importance)) {
747          this.importance = reader.readElementValue(Importance.class);
748          return true;
749        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsApprovalRequest)) {
750          this.isApprovalRequest = reader.readElementValue(Boolean.class);
751          return true;
752        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsAutomaticForward)) {
753          this.isAutomaticForward = reader.readElementValue(Boolean.class);
754          return true;
755        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsAutomaticReply)) {
756          this.isAutomaticReply = reader.readElementValue(Boolean.class);
757          return true;
758        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsEncrypted)) {
759          this.isEncrypted = reader.readElementValue(Boolean.class);
760          return true;
761        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsMeetingRequest)) {
762          this.isMeetingRequest = reader.readElementValue(Boolean.class);
763          return true;
764        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsMeetingResponse)) {
765          this.isMeetingResponse = reader.readElementValue(Boolean.class);
766          return true;
767        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsNDR)) {
768          this.isNonDeliveryReport = reader.readElementValue(Boolean.class);
769          return true;
770        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsPermissionControlled)) {
771          this.isPermissionControlled = reader.
772              readElementValue(Boolean.class);
773          return true;
774        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsSigned)) {
775          this.isSigned = reader.readElementValue(Boolean.class);
776          return true;
777        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsVoicemail)) {
778          this.isVoicemail = reader.readElementValue(Boolean.class);
779          return true;
780        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.IsReadReceipt)) {
781          this.isReadReceipt = reader.readElementValue(Boolean.class);
782          return true;
783        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.ItemClasses)) {
784          this.itemClasses.loadFromXml(reader, reader.getLocalName());
785          return true;
786        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.MessageClassifications)) {
787          this.messageClassifications.loadFromXml(reader,
788              reader.getLocalName());
789          return true;
790        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.NotSentToMe)) {
791          this.notSentToMe = reader.readElementValue(Boolean.class);
792          return true;
793        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.SentCcMe)) {
794          this.sentCcMe = reader.readElementValue(Boolean.class);
795          return true;
796        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.SentOnlyToMe)) {
797          this.sentOnlyToMe = reader.readElementValue(Boolean.class);
798          return true;
799        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.SentToAddresses)) {
800          this.sentToAddresses.loadFromXml(reader, reader.getLocalName());
801          return true;
802        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.SentToMe)) {
803          this.sentToMe = reader.readElementValue(Boolean.class);
804          return true;
805        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.SentToOrCcMe)) {
806          this.sentToOrCcMe = reader.readElementValue(Boolean.class);
807          return true;
808        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.Sensitivity)) {
809          this.sensitivity = reader.readElementValue(Sensitivity.class);
810          return true;
811        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.WithinDateRange)) {
812          this.withinDateRange.loadFromXml(reader, reader.getLocalName());
813          return true;
814        } else if (reader.getLocalName().equalsIgnoreCase(XmlElementNames.WithinSizeRange)) {
815          this.withinSizeRange.loadFromXml(reader, reader.getLocalName());
816          return true;
817        } else {
818          return false;
819        }
820      }
821    
822      /**
823       * Writes elements to XML.
824       *
825       * @param writer The writer.
826       * @throws Exception
827       */
828      @Override
829      public void writeElementsToXml(EwsServiceXmlWriter writer)
830          throws Exception {
831        if (this.getCategories().getSize() > 0) {
832          this.getCategories().writeToXml(writer, XmlElementNames.Categories);
833        }
834    
835        if (this.getContainsBodyStrings().getSize() > 0) {
836          this.getContainsBodyStrings().writeToXml(writer,
837              XmlElementNames.ContainsBodyStrings);
838        }
839    
840        if (this.getContainsHeaderStrings().getSize() > 0) {
841          this.getContainsHeaderStrings().writeToXml(writer,
842              XmlElementNames.ContainsHeaderStrings);
843        }
844    
845        if (this.getContainsRecipientStrings().getSize() > 0) {
846          this.getContainsRecipientStrings().writeToXml(writer,
847              XmlElementNames.ContainsRecipientStrings);
848        }
849    
850        if (this.getContainsSenderStrings().getSize() > 0) {
851          this.getContainsSenderStrings().writeToXml(writer,
852              XmlElementNames.ContainsSenderStrings);
853        }
854    
855        if (this.getContainsSubjectOrBodyStrings().getSize() > 0) {
856          this.getContainsSubjectOrBodyStrings().writeToXml(writer,
857              XmlElementNames.ContainsSubjectOrBodyStrings);
858        }
859    
860        if (this.getContainsSubjectStrings().getSize() > 0) {
861          this.getContainsSubjectStrings().writeToXml(writer,
862              XmlElementNames.ContainsSubjectStrings);
863        }
864    
865        if (this.getFlaggedForAction() != null) {
866          writer.writeElementValue(
867              XmlNamespace.Types,
868              XmlElementNames.FlaggedForAction,
869              this.getFlaggedForAction().values());
870        }
871    
872        if (this.getFromAddresses().getCount() > 0) {
873          this.getFromAddresses().writeToXml(writer,
874              XmlElementNames.FromAddresses);
875        }
876    
877        if (this.getFromConnectedAccounts().getSize() > 0) {
878          this.getFromConnectedAccounts().writeToXml(writer,
879              XmlElementNames.FromConnectedAccounts);
880        }
881    
882        if (this.getHasAttachments() != false) {
883          writer.writeElementValue(
884              XmlNamespace.Types,
885              XmlElementNames.HasAttachments,
886              this.getHasAttachments());
887        }
888    
889        if (this.getImportance() != null) {
890          writer.writeElementValue(
891              XmlNamespace.Types,
892              XmlElementNames.Importance,
893              this.getImportance());
894        }
895    
896        if (this.getIsApprovalRequest() != false) {
897          writer.writeElementValue(
898              XmlNamespace.Types,
899              XmlElementNames.IsApprovalRequest,
900              this.getIsApprovalRequest());
901        }
902    
903        if (this.getIsAutomaticForward() != false) {
904          writer.writeElementValue(
905              XmlNamespace.Types,
906              XmlElementNames.IsAutomaticForward,
907              this.getIsAutomaticForward());
908        }
909    
910        if (this.getIsAutomaticReply() != false) {
911          writer.writeElementValue(
912              XmlNamespace.Types,
913              XmlElementNames.IsAutomaticReply,
914              this.getIsAutomaticReply());
915        }
916    
917        if (this.getIsEncrypted() != false) {
918          writer.writeElementValue(
919              XmlNamespace.Types,
920              XmlElementNames.IsEncrypted,
921              this.getIsEncrypted());
922        }
923    
924        if (this.getIsMeetingRequest() != false) {
925          writer.writeElementValue(
926              XmlNamespace.Types,
927              XmlElementNames.IsMeetingRequest,
928              this.getIsMeetingRequest());
929        }
930    
931        if (this.getIsMeetingResponse() != false) {
932          writer.writeElementValue(
933              XmlNamespace.Types,
934              XmlElementNames.IsMeetingResponse,
935              this.getIsMeetingResponse());
936        }
937    
938        if (this.getIsNonDeliveryReport() != false) {
939          writer.writeElementValue(
940              XmlNamespace.Types,
941              XmlElementNames.IsNDR,
942              this.getIsNonDeliveryReport());
943        }
944    
945        if (this.getIsPermissionControlled() != false) {
946          writer.writeElementValue(
947              XmlNamespace.Types,
948              XmlElementNames.IsPermissionControlled,
949              this.getIsPermissionControlled());
950        }
951    
952        if (this.getIsReadReceipt() != false) {
953          writer.writeElementValue(
954              XmlNamespace.Types,
955              XmlElementNames.IsReadReceipt,
956              this.getIsReadReceipt());
957        }
958    
959        if (this.getIsSigned() != false) {
960          writer.writeElementValue(
961              XmlNamespace.Types,
962              XmlElementNames.IsSigned,
963              this.getIsSigned());
964        }
965    
966        if (this.getIsVoicemail() != false) {
967          writer.writeElementValue(
968              XmlNamespace.Types,
969              XmlElementNames.IsVoicemail,
970              this.getIsVoicemail());
971        }
972    
973        if (this.getItemClasses().getSize() > 0) {
974          this.getItemClasses().writeToXml(writer,
975              XmlElementNames.ItemClasses);
976        }
977    
978        if (this.getMessageClassifications().getSize() > 0) {
979          this.getMessageClassifications().writeToXml(writer,
980              XmlElementNames.MessageClassifications);
981        }
982    
983        if (this.getNotSentToMe() != false) {
984          writer.writeElementValue(
985              XmlNamespace.Types,
986              XmlElementNames.NotSentToMe,
987              this.getNotSentToMe());
988        }
989    
990        if (this.getSentCcMe() != false) {
991          writer.writeElementValue(
992              XmlNamespace.Types,
993              XmlElementNames.SentCcMe,
994              this.getSentCcMe());
995        }
996    
997        if (this.getSentOnlyToMe() != false) {
998          writer.writeElementValue(
999              XmlNamespace.Types,
1000              XmlElementNames.SentOnlyToMe,
1001              this.getSentOnlyToMe());
1002        }
1003    
1004        if (this.getSentToAddresses().getCount() > 0) {
1005          this.getSentToAddresses().writeToXml(writer,
1006              XmlElementNames.SentToAddresses);
1007        }
1008    
1009        if (this.getSentToMe() != false) {
1010          writer.writeElementValue(
1011              XmlNamespace.Types,
1012              XmlElementNames.SentToMe,
1013              this.getSentToMe());
1014        }
1015    
1016        if (this.getSentToOrCcMe() != false) {
1017          writer.writeElementValue(
1018              XmlNamespace.Types,
1019              XmlElementNames.SentToOrCcMe,
1020              this.getSentToOrCcMe());
1021        }
1022    
1023        if (this.getSensitivity() != null) {
1024          writer.writeElementValue(
1025              XmlNamespace.Types,
1026              XmlElementNames.Sensitivity,
1027              this.getSensitivity().values());
1028        }
1029    
1030        if (this.getWithinDateRange().getStart() != null || this.getWithinDateRange().getEnd() != null) {
1031          this.getWithinDateRange().writeToXml(writer,
1032              XmlElementNames.WithinDateRange);
1033        }
1034    
1035        if (this.getWithinSizeRange().getMaximumSize() != null
1036            || this.getWithinSizeRange().getMinimumSize() != null) {
1037          this.getWithinSizeRange().writeToXml(writer,
1038              XmlElementNames.WithinSizeRange);
1039        }
1040      }
1041    
1042      /**
1043       * Validates this instance.
1044       */
1045      @Override
1046      protected void internalValidate() throws Exception {
1047        super.internalValidate();
1048        EwsUtilities.validateParam(this.fromAddresses, "FromAddresses");
1049        EwsUtilities.validateParam(this.sentToAddresses, "SentToAddresses");
1050        EwsUtilities.validateParam(this.withinDateRange, "WithinDateRange");
1051        EwsUtilities.validateParam(this.withinSizeRange, "WithinSizeRange");
1052      }
1053    }