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.service.item;
025
026import microsoft.exchange.webservices.data.attribute.Attachable;
027import microsoft.exchange.webservices.data.attribute.ServiceObjectDefinition;
028import microsoft.exchange.webservices.data.core.EwsUtilities;
029import microsoft.exchange.webservices.data.core.ExchangeService;
030import microsoft.exchange.webservices.data.core.PropertySet;
031import microsoft.exchange.webservices.data.core.XmlElementNames;
032import microsoft.exchange.webservices.data.core.service.ServiceObject;
033import microsoft.exchange.webservices.data.core.service.schema.ItemSchema;
034import microsoft.exchange.webservices.data.core.service.schema.ServiceObjectSchema;
035import microsoft.exchange.webservices.data.core.enumeration.service.calendar.AffectedTaskOccurrence;
036import microsoft.exchange.webservices.data.core.enumeration.service.ConflictResolutionMode;
037import microsoft.exchange.webservices.data.core.enumeration.service.DeleteMode;
038import microsoft.exchange.webservices.data.core.enumeration.service.EffectiveRights;
039import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
040import microsoft.exchange.webservices.data.core.enumeration.property.Importance;
041import microsoft.exchange.webservices.data.core.enumeration.service.MessageDisposition;
042import microsoft.exchange.webservices.data.core.enumeration.service.ResponseActions;
043import microsoft.exchange.webservices.data.core.enumeration.service.SendCancellationsMode;
044import microsoft.exchange.webservices.data.core.enumeration.service.SendInvitationsMode;
045import microsoft.exchange.webservices.data.core.enumeration.service.SendInvitationsOrCancellationsMode;
046import microsoft.exchange.webservices.data.core.enumeration.property.Sensitivity;
047import microsoft.exchange.webservices.data.core.enumeration.service.error.ServiceErrorHandling;
048import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
049import microsoft.exchange.webservices.data.core.exception.misc.InvalidOperationException;
050import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
051import microsoft.exchange.webservices.data.core.exception.service.remote.ServiceResponseException;
052import microsoft.exchange.webservices.data.property.complex.Attachment;
053import microsoft.exchange.webservices.data.property.complex.AttachmentCollection;
054import microsoft.exchange.webservices.data.property.complex.ConversationId;
055import microsoft.exchange.webservices.data.property.complex.ExtendedPropertyCollection;
056import microsoft.exchange.webservices.data.property.complex.FolderId;
057import microsoft.exchange.webservices.data.property.complex.InternetMessageHeaderCollection;
058import microsoft.exchange.webservices.data.property.complex.ItemAttachment;
059import microsoft.exchange.webservices.data.property.complex.ItemId;
060import microsoft.exchange.webservices.data.property.complex.MessageBody;
061import microsoft.exchange.webservices.data.property.complex.MimeContent;
062import microsoft.exchange.webservices.data.property.complex.StringList;
063import microsoft.exchange.webservices.data.property.complex.UniqueBody;
064import microsoft.exchange.webservices.data.property.definition.ExtendedPropertyDefinition;
065import microsoft.exchange.webservices.data.property.definition.PropertyDefinition;
066
067import java.util.ArrayList;
068import java.util.Date;
069import java.util.EnumSet;
070import java.util.ListIterator;
071
072/**
073 * Represents a generic item. Properties available on item are defined in the
074 * ItemSchema class.
075 */
076@Attachable
077@ServiceObjectDefinition(xmlElementName = XmlElementNames.Item)
078public class Item extends ServiceObject {
079
080  /**
081   * The parent attachment.
082   */
083  private ItemAttachment parentAttachment;
084
085  /**
086   * Initializes an unsaved local instance of <see cref="Item"/>. To bind to
087   * an existing item, use Item.Bind() instead.
088   *
089   * @param service the service
090   * @throws Exception the exception
091   */
092  public Item(ExchangeService service) throws Exception {
093    super(service);
094  }
095
096  /**
097   * Initializes a new instance of the item class.
098   *
099   * @param parentAttachment The parent attachment.
100   * @throws Exception the exception
101   */
102  public Item(final ItemAttachment parentAttachment) throws Exception {
103    this(parentAttachment.getOwner().getService());
104    this.parentAttachment = parentAttachment;
105  }
106
107  /**
108   * Binds to an existing item, whatever its actual type is, and loads the
109   * specified set of property. Calling this method results in a call to
110   * EWS.
111   *
112   * @param service     The service to use to bind to the item.
113   * @param id          The Id of the item to bind to.
114   * @param propertySet The set of property to load.
115   * @return An Item instance representing the item corresponding to the
116   * specified Id.
117   * @throws Exception the exception
118   */
119  public static Item bind(ExchangeService service, ItemId id,
120      PropertySet propertySet) throws Exception {
121    return service.bindToItem(Item.class, id, propertySet);
122  }
123
124  /**
125   * Binds to an existing item, whatever its actual type is, and loads the
126   * specified set of property. Calling this method results in a call to
127   * EWS.
128   *
129   * @param service The service to use to bind to the item.
130   * @param id      The Id of the item to bind to.
131   * @return An Item instance representing the item corresponding to the
132   * specified Id.
133   * @throws Exception the exception
134   */
135  public static Item bind(ExchangeService service, ItemId id)
136      throws Exception {
137    return Item.bind(service, id, PropertySet.getFirstClassProperties());
138  }
139
140  /**
141   * Internal method to return the schema associated with this type of object.
142   *
143   * @return The schema associated with this type of object.
144   */
145  @Override public ServiceObjectSchema getSchema() {
146    return ItemSchema.getInstance();
147  }
148
149  /**
150   * Gets the minimum required server version.
151   *
152   * @return Earliest Exchange version in which this service object type is
153   * supported.
154   */
155  @Override public ExchangeVersion getMinimumRequiredServerVersion() {
156
157    return ExchangeVersion.Exchange2007_SP1;
158  }
159
160  /**
161   * Throws exception if this is attachment.
162   *
163   * @throws InvalidOperationException the invalid operation exception
164   */
165  protected void throwIfThisIsAttachment() throws InvalidOperationException {
166    if (this.isAttachment()) {
167      throw new InvalidOperationException("This operation isn't supported on attachments.");
168    }
169  }
170
171  /**
172   * The property definition for the Id of this object.
173   *
174   * @return A PropertyDefinition instance.
175   */
176  public PropertyDefinition getIdPropertyDefinition() {
177    return ItemSchema.Id;
178  }
179
180  /**
181   * The property definition for the Id of this object.
182   *
183   * @param propertySet the property set
184   * @throws Exception the exception
185   */
186  @Override
187  protected void internalLoad(PropertySet propertySet) throws Exception {
188    this.throwIfThisIsNew();
189    this.throwIfThisIsAttachment();
190
191    ArrayList<Item> itemArry = new ArrayList<Item>();
192    itemArry.add(this);
193    this.getService().internalLoadPropertiesForItems(itemArry, propertySet,
194        ServiceErrorHandling.ThrowOnError);
195  }
196
197  /**
198   * Deletes the object.
199   *
200   * @param deleteMode              the delete mode
201   * @param sendCancellationsMode   the send cancellations mode
202   * @param affectedTaskOccurrences the affected task occurrences
203   * @throws ServiceLocalException the service local exception
204   * @throws Exception             the exception
205   */
206  @Override
207  protected void internalDelete(DeleteMode deleteMode,
208      SendCancellationsMode sendCancellationsMode,
209      AffectedTaskOccurrence affectedTaskOccurrences)
210      throws ServiceLocalException, Exception {
211    this.throwIfThisIsNew();
212    this.throwIfThisIsAttachment();
213
214    // If sendCancellationsMode is null, use the default value that's
215    // appropriate for item type.
216    if (sendCancellationsMode == null) {
217      sendCancellationsMode = this.getDefaultSendCancellationsMode();
218    }
219
220    // If affectedTaskOccurrences is null, use the default value that's
221    // appropriate for item type.
222    if (affectedTaskOccurrences == null) {
223      affectedTaskOccurrences = this.getDefaultAffectedTaskOccurrences();
224    }
225
226    this.getService().deleteItem(this.getId(), deleteMode,
227        sendCancellationsMode, affectedTaskOccurrences);
228  }
229
230  /**
231   * Create item.
232   *
233   * @param parentFolderId      the parent folder id
234   * @param messageDisposition  the message disposition
235   * @param sendInvitationsMode the send invitations mode
236   * @throws Exception the exception
237   */
238  protected void internalCreate(FolderId parentFolderId,
239      MessageDisposition messageDisposition,
240      SendInvitationsMode sendInvitationsMode) throws Exception {
241    this.throwIfThisIsNotNew();
242    this.throwIfThisIsAttachment();
243
244    if (this.isNew() || this.isDirty()) {
245      this.getService().createItem(
246          this,
247          parentFolderId,
248          messageDisposition,
249          sendInvitationsMode != null ? sendInvitationsMode : this
250              .getDefaultSendInvitationsMode());
251
252      this.getAttachments().save();
253    }
254  }
255
256  /**
257   * Update item.
258   *
259   * @param parentFolderId                     the parent folder id
260   * @param conflictResolutionMode             the conflict resolution mode
261   * @param messageDisposition                 the message disposition
262   * @param sendInvitationsOrCancellationsMode the send invitations or cancellations mode
263   * @return Updated item.
264   * @throws ServiceResponseException the service response exception
265   * @throws Exception                the exception
266   */
267  protected Item internalUpdate(
268      FolderId parentFolderId,
269      ConflictResolutionMode conflictResolutionMode,
270      MessageDisposition messageDisposition,
271      SendInvitationsOrCancellationsMode sendInvitationsOrCancellationsMode)
272      throws ServiceResponseException, Exception {
273    this.throwIfThisIsNew();
274    this.throwIfThisIsAttachment();
275
276    Item returnedItem = null;
277
278    if (this.isDirty() && this.getPropertyBag().getIsUpdateCallNecessary()) {
279      returnedItem = this
280          .getService()
281          .updateItem(
282              this,
283              parentFolderId,
284              conflictResolutionMode,
285              messageDisposition,
286              sendInvitationsOrCancellationsMode != null ? sendInvitationsOrCancellationsMode
287                  : this
288                  .getDefaultSendInvitationsOrCancellationsMode());
289    }
290    if (this.hasUnprocessedAttachmentChanges()) {
291      // Validation of the item and its attachments occurs in
292      // UpdateItems.
293      // If we didn't update the item we still need to validate
294      // attachments.
295      this.getAttachments().validate();
296      this.getAttachments().save();
297
298    }
299
300    return returnedItem;
301  }
302
303  /**
304   * Gets a value indicating whether this instance has unprocessed attachment
305   * collection changes.
306   *
307   * @throws ServiceLocalException
308   */
309  public boolean hasUnprocessedAttachmentChanges()
310      throws ServiceLocalException {
311    return this.getAttachments().hasUnprocessedChanges();
312
313  }
314
315  /**
316   * Gets the parent attachment of this item.
317   *
318   * @return the parent attachment
319   */
320  public ItemAttachment getParentAttachment() {
321    return this.parentAttachment;
322  }
323
324  /**
325   * Gets Id of the root item for this item.
326   *
327   * @return the root item id
328   * @throws ServiceLocalException the service local exception
329   */
330  public ItemId getRootItemId() throws ServiceLocalException {
331
332    if (this.isAttachment()) {
333      return this.getParentAttachment().getOwner().getRootItemId();
334    } else {
335      return this.getId();
336    }
337  }
338
339  /**
340   * Deletes the item. Calling this method results in a call to EWS.
341   *
342   * @param deleteMode the delete mode
343   * @throws ServiceLocalException the service local exception
344   * @throws Exception             the exception
345   */
346  public void delete(DeleteMode deleteMode) throws ServiceLocalException,
347      Exception {
348    this.internalDelete(deleteMode, null, null);
349  }
350
351  /**
352   * Saves this item in a specific folder. Calling this method results in at
353   * least one call to EWS. Mutliple calls to EWS might be made if attachments
354   * have been added.
355   *
356   * @param parentFolderId the parent folder id
357   * @throws Exception the exception
358   */
359  public void save(FolderId parentFolderId) throws Exception {
360    EwsUtilities.validateParam(parentFolderId, "parentFolderId");
361    this.internalCreate(parentFolderId, MessageDisposition.SaveOnly, null);
362  }
363
364  /**
365   * Saves this item in a specific folder. Calling this method results in at
366   * least one call to EWS. Mutliple calls to EWS might be made if attachments
367   * have been added.
368   *
369   * @param parentFolderName the parent folder name
370   * @throws Exception the exception
371   */
372  public void save(WellKnownFolderName parentFolderName) throws Exception {
373    this.internalCreate(new FolderId(parentFolderName),
374        MessageDisposition.SaveOnly, null);
375  }
376
377  /**
378   * Saves this item in the default folder based on the item's type (for
379   * example, an e-mail message is saved to the Drafts folder). Calling this
380   * method results in at least one call to EWS. Mutliple calls to EWS might
381   * be made if attachments have been added.
382   *
383   * @throws Exception the exception
384   */
385  public void save() throws Exception {
386    this.internalCreate(null, MessageDisposition.SaveOnly, null);
387  }
388
389  /**
390   * Applies the local changes that have been made to this item. Calling this
391   * method results in at least one call to EWS. Mutliple calls to EWS might
392   * be made if attachments have been added or removed.
393   *
394   * @param conflictResolutionMode the conflict resolution mode
395   * @throws ServiceResponseException the service response exception
396   * @throws Exception                the exception
397   */
398  public void update(ConflictResolutionMode conflictResolutionMode)
399      throws ServiceResponseException, Exception {
400    this.internalUpdate(null /* parentFolder */, conflictResolutionMode,
401        MessageDisposition.SaveOnly, null);
402  }
403
404  /**
405   * Creates a copy of this item in the specified folder. Calling this method
406   * results in a call to EWS. Copy returns null if the copy operation is
407   * across two mailboxes or between a mailbox and a public folder.
408   *
409   * @param destinationFolderId the destination folder id
410   * @return The copy of this item.
411   * @throws Exception the exception
412   */
413  public Item copy(FolderId destinationFolderId) throws Exception {
414
415    this.throwIfThisIsNew();
416    this.throwIfThisIsAttachment();
417
418    EwsUtilities.validateParam(destinationFolderId, "destinationFolderId");
419
420    return this.getService().copyItem(this.getId(), destinationFolderId);
421  }
422
423  /**
424   * Creates a copy of this item in the specified folder. Calling this method
425   * results in a call to EWS. Copy returns null if the copy operation is
426   * across two mailboxes or between a mailbox and a public folder.
427   *
428   * @param destinationFolderName the destination folder name
429   * @return The copy of this item.
430   * @throws Exception the exception
431   */
432  public Item copy(WellKnownFolderName destinationFolderName)
433      throws Exception {
434    return this.copy(new FolderId(destinationFolderName));
435  }
436
437  /**
438   * Moves this item to a the specified folder. Calling this method results in
439   * a call to EWS. Move returns null if the move operation is across two
440   * mailboxes or between a mailbox and a public folder.
441   *
442   * @param destinationFolderId the destination folder id
443   * @return The moved copy of this item.
444   * @throws Exception the exception
445   */
446  public Item move(FolderId destinationFolderId) throws Exception {
447    this.throwIfThisIsNew();
448    this.throwIfThisIsAttachment();
449
450    EwsUtilities.validateParam(destinationFolderId, "destinationFolderId");
451
452    return this.getService().moveItem(this.getId(), destinationFolderId);
453  }
454
455  /**
456   * Moves this item to a the specified folder. Calling this method results in
457   * a call to EWS. Move returns null if the move operation is across two
458   * mailboxes or between a mailbox and a public folder.
459   *
460   * @param destinationFolderName the destination folder name
461   * @return The moved copy of this item.
462   * @throws Exception the exception
463   */
464  public Item move(WellKnownFolderName destinationFolderName)
465      throws Exception {
466    return this.move(new FolderId(destinationFolderName));
467  }
468
469  /**
470   * Sets the extended property.
471   *
472   * @param extendedPropertyDefinition the extended property definition
473   * @param value                      the value
474   * @throws Exception the exception
475   */
476  public void setExtendedProperty(
477      ExtendedPropertyDefinition extendedPropertyDefinition, Object value)
478      throws Exception {
479    this.getExtendedProperties().setExtendedProperty(
480        extendedPropertyDefinition, value);
481  }
482
483  /**
484   * Removes an extended property.
485   *
486   * @param extendedPropertyDefinition the extended property definition
487   * @return True if property was removed.
488   * @throws Exception the exception
489   */
490  public boolean removeExtendedProperty(
491      ExtendedPropertyDefinition extendedPropertyDefinition)
492      throws Exception {
493    return this.getExtendedProperties().removeExtendedProperty(
494        extendedPropertyDefinition);
495  }
496
497  /**
498   * Validates this instance.
499   *
500   * @throws Exception the exception
501   */
502  @Override public void validate() throws Exception {
503    super.validate();
504    this.getAttachments().validate();
505  }
506
507  /**
508   * Gets a value indicating whether a time zone SOAP header should be emitted
509   * in a CreateItem or UpdateItem request so this item can be property saved
510   * or updated.
511   *
512   * @param isUpdateOperation Indicates whether the operation being petrformed is an update
513   *                          operation.
514   * @return true if a time zone SOAP header should be emitted;
515   * otherwise,false
516   */
517  public boolean getIsTimeZoneHeaderRequired(boolean isUpdateOperation)
518      throws Exception {
519    // Starting E14SP2, attachment will be sent along with CreateItem
520    // request.
521    // if the attachment used to require the Timezone header, CreateItem
522    // request should do so too.
523    //
524
525    if (!isUpdateOperation
526        && (this.getService().getRequestedServerVersion().ordinal() >= ExchangeVersion.Exchange2010_SP2
527        .ordinal())) {
528
529      ListIterator<Attachment> items = this.getAttachments().getItems()
530          .listIterator();
531
532      while (items.hasNext()) {
533
534        ItemAttachment itemAttachment = (ItemAttachment) items.next();
535
536        if ((itemAttachment.getItem() != null)
537            && itemAttachment
538            .getItem()
539            .getIsTimeZoneHeaderRequired(false /* isUpdateOperation */)) {
540          return true;
541        }
542      }
543    }
544
545                /*
546                 * for (ItemAttachment itemAttachment :
547                 * this.getAttachments().OfType<ItemAttachment>().getc) { if
548                 * ((itemAttachment.Item != null) &&
549                 * itemAttachment.Item.GetIsTimeZoneHeaderRequired(false /* //
550                 * isUpdateOperation )) { return true; } }
551                 */
552
553    return super.getIsTimeZoneHeaderRequired(isUpdateOperation);
554  }
555
556  // region Properties
557
558  /**
559   * Gets a value indicating whether the item is an attachment.
560   *
561   * @return true, if is attachment
562   */
563  public boolean isAttachment() {
564    return this.parentAttachment != null;
565  }
566
567  /**
568   * Gets a value indicating whether this object is a real store item, or if
569   * it's a local object that has yet to be saved.
570   *
571   * @return the checks if is new
572   * @throws ServiceLocalException the service local exception
573   */
574  public boolean getIsNew() throws ServiceLocalException {
575
576    // Item attachments don't have an Id, need to check whether the
577    // parentAttachment is new or not.
578    if (this.isAttachment()) {
579      return this.getParentAttachment().isNew();
580    } else {
581      return super.isNew();
582    }
583  }
584
585  /**
586   * Gets the Id of this item.
587   *
588   * @return the id
589   * @throws ServiceLocalException the service local exception
590   */
591  public ItemId getId() throws ServiceLocalException {
592    return getPropertyBag().getObjectFromPropertyDefinition(
593        getIdPropertyDefinition());
594  }
595
596  /**
597   * Get the MIME content of this item.
598   *
599   * @return the mime content
600   * @throws ServiceLocalException the service local exception
601   */
602  public MimeContent getMimeContent() throws ServiceLocalException {
603    return getPropertyBag().getObjectFromPropertyDefinition(
604        ItemSchema.MimeContent);
605  }
606
607  /**
608   * Sets the mime content.
609   *
610   * @param value the new mime content
611   * @throws Exception the exception
612   */
613  public void setMimeContent(MimeContent value) throws Exception {
614    this.getPropertyBag().setObjectFromPropertyDefinition(
615        ItemSchema.MimeContent, value);
616  }
617
618  /**
619   * Gets the Id of the parent folder of this item.
620   *
621   * @return the parent folder id
622   * @throws ServiceLocalException the service local exception
623   */
624  public FolderId getParentFolderId() throws ServiceLocalException {
625    return getPropertyBag().getObjectFromPropertyDefinition(
626        ItemSchema.ParentFolderId);
627  }
628
629  /**
630   * Gets the sensitivity of this item.
631   *
632   * @return the sensitivity
633   * @throws ServiceLocalException the service local exception
634   */
635  public Sensitivity getSensitivity() throws ServiceLocalException {
636    return getPropertyBag().getObjectFromPropertyDefinition(
637        ItemSchema.Sensitivity);
638  }
639
640  /**
641   * Sets the sensitivity.
642   *
643   * @param value the new sensitivity
644   * @throws Exception the exception
645   */
646  public void setSensitivity(Sensitivity value) throws Exception {
647    this.getPropertyBag().setObjectFromPropertyDefinition(
648        ItemSchema.Sensitivity, value);
649  }
650
651  /**
652   * Gets a list of the attachments to this item.
653   *
654   * @return the attachments
655   * @throws ServiceLocalException the service local exception
656   */
657  public AttachmentCollection getAttachments() throws ServiceLocalException {
658    return getPropertyBag().getObjectFromPropertyDefinition(
659        ItemSchema.Attachments);
660  }
661
662  /**
663   * Gets the time when this item was received.
664   *
665   * @return the date time received
666   * @throws ServiceLocalException the service local exception
667   */
668  public Date getDateTimeReceived() throws ServiceLocalException {
669    return getPropertyBag().getObjectFromPropertyDefinition(
670        ItemSchema.DateTimeReceived);
671  }
672
673  /**
674   * Gets the size of this item.
675   *
676   * @return the size
677   * @throws ServiceLocalException the service local exception
678   */
679  public int getSize() throws ServiceLocalException {
680    return getPropertyBag().<Integer>getObjectFromPropertyDefinition(ItemSchema.Size);
681  }
682
683  /**
684   * Gets the list of categories associated with this item.
685   *
686   * @return the categories
687   * @throws ServiceLocalException the service local exception
688   */
689  public StringList getCategories() throws ServiceLocalException {
690    return getPropertyBag().getObjectFromPropertyDefinition(
691        ItemSchema.Categories);
692  }
693
694  /**
695   * Sets the categories.
696   *
697   * @param value the new categories
698   * @throws Exception the exception
699   */
700  public void setCategories(StringList value) throws Exception {
701    this.getPropertyBag().setObjectFromPropertyDefinition(
702        ItemSchema.Categories, value);
703  }
704
705  /**
706   * Gets the culture associated with this item.
707   *
708   * @return the culture
709   * @throws ServiceLocalException the service local exception
710   */
711  public String getCulture() throws ServiceLocalException {
712    return getPropertyBag().getObjectFromPropertyDefinition(
713        ItemSchema.Culture);
714  }
715
716  /**
717   * Sets the culture.
718   *
719   * @param value the new culture
720   * @throws Exception the exception
721   */
722  public void setCulture(String value) throws Exception {
723    this.getPropertyBag().setObjectFromPropertyDefinition(
724        ItemSchema.Culture, value);
725  }
726
727  /**
728   * Gets the importance of this item.
729   *
730   * @return the importance
731   * @throws ServiceLocalException the service local exception
732   */
733  public Importance getImportance() throws ServiceLocalException {
734    return getPropertyBag().getObjectFromPropertyDefinition(
735        ItemSchema.Importance);
736  }
737
738  /**
739   * Sets the importance.
740   *
741   * @param value the new importance
742   * @throws Exception the exception
743   */
744  public void setImportance(Importance value) throws Exception {
745    this.getPropertyBag().setObjectFromPropertyDefinition(
746        ItemSchema.Importance, value);
747  }
748
749  /**
750   * Gets the In-Reply-To reference of this item.
751   *
752   * @return the in reply to
753   * @throws ServiceLocalException the service local exception
754   */
755  public String getInReplyTo() throws ServiceLocalException {
756    return getPropertyBag().getObjectFromPropertyDefinition(
757        ItemSchema.InReplyTo);
758  }
759
760  /**
761   * Sets the in reply to.
762   *
763   * @param value the new in reply to
764   * @throws Exception the exception
765   */
766  public void setInReplyTo(String value) throws Exception {
767    this.getPropertyBag().setObjectFromPropertyDefinition(
768        ItemSchema.InReplyTo, value);
769  }
770
771  /**
772   * Gets a value indicating whether the message has been submitted to be
773   * sent.
774   *
775   * @return the checks if is submitted
776   * @throws ServiceLocalException the service local exception
777   */
778  public boolean getIsSubmitted() throws ServiceLocalException {
779    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(ItemSchema.IsSubmitted);
780  }
781
782  /**
783   * Gets a value indicating whether the message has been submitted to be
784   * sent.
785   *
786   * @return the checks if is associated
787   * @throws ServiceLocalException the service local exception
788   */
789  public boolean getIsAssociated() throws ServiceLocalException {
790    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(
791        ItemSchema.IsAssociated);
792  }
793
794  /**
795   * Gets a value indicating whether the message has been submitted to be
796   * sent.
797   *
798   * @return the checks if is draft
799   * @throws ServiceLocalException the service local exception
800   */
801  public boolean getIsDraft() throws ServiceLocalException {
802    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(
803        ItemSchema.IsDraft);
804  }
805
806  /**
807   * Gets a value indicating whether the item has been sent by the current
808   * authenticated user.
809   *
810   * @return the checks if is from me
811   * @throws ServiceLocalException the service local exception
812   */
813  public boolean getIsFromMe() throws ServiceLocalException {
814    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(
815        ItemSchema.IsFromMe);
816  }
817
818  /**
819   * Gets a value indicating whether the item is a resend of another item.
820   *
821   * @return the checks if is resend
822   * @throws ServiceLocalException the service local exception
823   */
824  public boolean getIsResend() throws ServiceLocalException {
825    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(
826        ItemSchema.IsResend);
827  }
828
829  /**
830   * Gets a value indicating whether the item has been modified since it was
831   * created.
832   *
833   * @return the checks if is unmodified
834   * @throws ServiceLocalException the service local exception
835   */
836  public boolean getIsUnmodified() throws ServiceLocalException {
837    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(
838        ItemSchema.IsUnmodified);
839  }
840
841  /**
842   * Gets a list of Internet headers for this item.
843   *
844   * @return the internet message headers
845   * @throws ServiceLocalException the service local exception
846   */
847  public InternetMessageHeaderCollection getInternetMessageHeaders()
848      throws ServiceLocalException {
849    return getPropertyBag().getObjectFromPropertyDefinition(
850        ItemSchema.InternetMessageHeaders);
851  }
852
853  /**
854   * Gets the date and time this item was sent.
855   *
856   * @return the date time sent
857   * @throws ServiceLocalException the service local exception
858   */
859  public Date getDateTimeSent() throws ServiceLocalException {
860    return getPropertyBag().getObjectFromPropertyDefinition(
861        ItemSchema.DateTimeSent);
862  }
863
864  /**
865   * Gets the date and time this item was created.
866   *
867   * @return the date time created
868   * @throws ServiceLocalException the service local exception
869   */
870  public Date getDateTimeCreated() throws ServiceLocalException {
871    return getPropertyBag().getObjectFromPropertyDefinition(
872        ItemSchema.DateTimeCreated);
873  }
874
875  /**
876   * Gets a value indicating which response actions are allowed on this item.
877   * Examples of response actions are Reply and Forward.
878   *
879   * @return the allowed response actions
880   * @throws ServiceLocalException the service local exception
881   */
882  public EnumSet<ResponseActions> getAllowedResponseActions()
883      throws ServiceLocalException {
884    return getPropertyBag().getObjectFromPropertyDefinition(
885        ItemSchema.AllowedResponseActions);
886  }
887
888  /**
889   * Gets the date and time when the reminder is due for this item.
890   *
891   * @return the reminder due by
892   * @throws ServiceLocalException the service local exception
893   */
894  public Date getReminderDueBy() throws ServiceLocalException {
895    return getPropertyBag().getObjectFromPropertyDefinition(
896        ItemSchema.ReminderDueBy);
897  }
898
899  /**
900   * Sets the reminder due by.
901   *
902   * @param value the new reminder due by
903   * @throws Exception the exception
904   */
905  public void setReminderDueBy(Date value) throws Exception {
906    this.getPropertyBag().setObjectFromPropertyDefinition(
907        ItemSchema.ReminderDueBy, value);
908  }
909
910  /**
911   * Gets a value indicating whether a reminder is set for this item.
912   *
913   * @return the checks if is reminder set
914   * @throws ServiceLocalException the service local exception
915   */
916  public boolean getIsReminderSet() throws ServiceLocalException {
917    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(
918        ItemSchema.IsReminderSet);
919  }
920
921  /**
922   * Sets the checks if is reminder set.
923   *
924   * @param value the new checks if is reminder set
925   * @throws Exception the exception
926   */
927  public void setIsReminderSet(Boolean value) throws Exception {
928    this.getPropertyBag().setObjectFromPropertyDefinition(
929        ItemSchema.IsReminderSet, value);
930  }
931
932  /**
933   * Gets the number of minutes before the start of this item when the
934   * reminder should be triggered.
935   *
936   * @return the reminder minutes before start
937   * @throws ServiceLocalException the service local exception
938   */
939  public int getReminderMinutesBeforeStart() throws ServiceLocalException {
940    return getPropertyBag().<Integer>getObjectFromPropertyDefinition(
941        ItemSchema.ReminderMinutesBeforeStart);
942  }
943
944  /**
945   * Sets the reminder minutes before start.
946   *
947   * @param value the new reminder minutes before start
948   * @throws Exception the exception
949   */
950  public void setReminderMinutesBeforeStart(int value) throws Exception {
951    this.getPropertyBag().setObjectFromPropertyDefinition(
952        ItemSchema.ReminderMinutesBeforeStart, value);
953  }
954
955  /**
956   * Gets a text summarizing the Cc receipients of this item.
957   *
958   * @return the display cc
959   * @throws ServiceLocalException the service local exception
960   */
961  public String getDisplayCc() throws ServiceLocalException {
962    return getPropertyBag().getObjectFromPropertyDefinition(
963        ItemSchema.DisplayCc);
964  }
965
966  /**
967   * Gets a text summarizing the To recipients of this item.
968   *
969   * @return the display to
970   * @throws ServiceLocalException the service local exception
971   */
972  public String getDisplayTo() throws ServiceLocalException {
973    return getPropertyBag().getObjectFromPropertyDefinition(
974        ItemSchema.DisplayTo);
975  }
976
977  /**
978   * Gets a value indicating whether the item has attachments.
979   *
980   * @return the checks for attachments
981   * @throws ServiceLocalException the service local exception
982   */
983  public boolean getHasAttachments() throws ServiceLocalException {
984    return getPropertyBag().<Boolean>getObjectFromPropertyDefinition(
985        ItemSchema.HasAttachments);
986  }
987
988  /**
989   * Gets the body of this item.
990   *
991   * @return MessageBody
992   * @throws ServiceLocalException the service local exception
993   */
994  public MessageBody getBody() throws ServiceLocalException {
995    return getPropertyBag().getObjectFromPropertyDefinition(ItemSchema.Body);
996  }
997
998  /**
999   * Sets the body.
1000   *
1001   * @param value the new body
1002   * @throws Exception the exception
1003   */
1004  public void setBody(MessageBody value) throws Exception {
1005    this.getPropertyBag().setObjectFromPropertyDefinition(ItemSchema.Body,
1006        value);
1007  }
1008
1009  /**
1010   * Gets the custom class name of this item.
1011   *
1012   * @return the item class
1013   * @throws ServiceLocalException the service local exception
1014   */
1015  public String getItemClass() throws ServiceLocalException {
1016    return getPropertyBag().getObjectFromPropertyDefinition(
1017        ItemSchema.ItemClass);
1018  }
1019
1020  /**
1021   * Sets the item class.
1022   *
1023   * @param value the new item class
1024   * @throws Exception the exception
1025   */
1026  public void setItemClass(String value) throws Exception {
1027    this.getPropertyBag().setObjectFromPropertyDefinition(
1028        ItemSchema.ItemClass, value);
1029  }
1030
1031  /**
1032   * Sets the subject.
1033   *
1034   * @param subject the new subject
1035   * @throws Exception the exception
1036   */
1037  public void setSubject(String subject) throws Exception {
1038    this.getPropertyBag().setObjectFromPropertyDefinition(
1039        ItemSchema.Subject, subject);
1040  }
1041
1042  /**
1043   * Gets the subject.
1044   *
1045   * @return the subject
1046   * @throws ServiceLocalException the service local exception
1047   */
1048  public String getSubject() throws ServiceLocalException {
1049    return getPropertyBag().getObjectFromPropertyDefinition(
1050        ItemSchema.Subject);
1051  }
1052
1053  /**
1054   * Gets the query string that should be appended to the Exchange Web client
1055   * URL to open this item using the appropriate read form in a web browser.
1056   *
1057   * @return the web client read form query string
1058   * @throws ServiceLocalException the service local exception
1059   */
1060  public String getWebClientReadFormQueryString()
1061      throws ServiceLocalException {
1062    return getPropertyBag().getObjectFromPropertyDefinition(
1063        ItemSchema.WebClientReadFormQueryString);
1064  }
1065
1066  /**
1067   * Gets the query string that should be appended to the Exchange Web client
1068   * URL to open this item using the appropriate read form in a web browser.
1069   *
1070   * @return the web client edit form query string
1071   * @throws ServiceLocalException the service local exception
1072   */
1073  public String getWebClientEditFormQueryString()
1074      throws ServiceLocalException {
1075    return getPropertyBag().getObjectFromPropertyDefinition(
1076        ItemSchema.WebClientEditFormQueryString);
1077  }
1078
1079  /**
1080   * Gets a list of extended property defined on this item.
1081   *
1082   * @return the extended property
1083   * @throws ServiceLocalException the service local exception
1084   */
1085  @Override
1086  public ExtendedPropertyCollection getExtendedProperties()
1087      throws ServiceLocalException {
1088    return getPropertyBag().getObjectFromPropertyDefinition(
1089        ServiceObjectSchema.extendedProperties);
1090  }
1091
1092  /**
1093   * Gets a value indicating the effective rights the current authenticated
1094   * user has on this item.
1095   *
1096   * @return the effective rights
1097   * @throws ServiceLocalException the service local exception
1098   */
1099  public EnumSet<EffectiveRights> getEffectiveRights()
1100      throws ServiceLocalException {
1101    return getPropertyBag().getObjectFromPropertyDefinition(
1102        ItemSchema.EffectiveRights);
1103  }
1104
1105  /**
1106   * Gets the name of the user who last modified this item.
1107   *
1108   * @return the last modified name
1109   * @throws ServiceLocalException the service local exception
1110   */
1111  public String getLastModifiedName() throws ServiceLocalException {
1112    return getPropertyBag().getObjectFromPropertyDefinition(
1113        ItemSchema.LastModifiedName);
1114  }
1115
1116  /**
1117   * Gets the date and time this item was last modified.
1118   *
1119   * @return the last modified time
1120   * @throws ServiceLocalException the service local exception
1121   */
1122  public Date getLastModifiedTime() throws ServiceLocalException {
1123    return getPropertyBag().getObjectFromPropertyDefinition(
1124        ItemSchema.LastModifiedTime);
1125  }
1126
1127  /**
1128   * Gets the Id of the conversation this item is part of.
1129   *
1130   * @return the conversation id
1131   * @throws ServiceLocalException the service local exception
1132   */
1133  public ConversationId getConversationId() throws ServiceLocalException {
1134    return getPropertyBag().getObjectFromPropertyDefinition(
1135        ItemSchema.ConversationId);
1136  }
1137
1138  /**
1139   * Gets the body part that is unique to the conversation this item is part
1140   * of.
1141   *
1142   * @return the unique body
1143   * @throws ServiceLocalException the service local exception
1144   */
1145  public UniqueBody getUniqueBody() throws ServiceLocalException {
1146    return getPropertyBag().getObjectFromPropertyDefinition(
1147        ItemSchema.UniqueBody);
1148  }
1149
1150  /**
1151   * Gets the default setting for how to treat affected task occurrences on
1152   * Delete. Subclasses will override this for different default behavior.
1153   *
1154   * @return the default affected task occurrences
1155   */
1156  protected AffectedTaskOccurrence getDefaultAffectedTaskOccurrences() {
1157    return null;
1158  }
1159
1160  /**
1161   * Gets the default setting for sending cancellations on Delete. Subclasses
1162   * will override this for different default behavior.
1163   *
1164   * @return the default send cancellations mode
1165   */
1166  protected SendCancellationsMode getDefaultSendCancellationsMode() {
1167    return null;
1168  }
1169
1170  /**
1171   * Gets the default settings for sending invitations on Save. Subclasses
1172   * will override this for different default behavior.
1173   *
1174   * @return the default send invitations mode
1175   */
1176  protected SendInvitationsMode getDefaultSendInvitationsMode() {
1177    return null;
1178  }
1179
1180  /**
1181   * Gets the default settings for sending invitations or cancellations on
1182   * Update. Subclasses will override this for different default behavior.
1183   *
1184   * @return the default send invitations or cancellations mode
1185   */
1186  protected SendInvitationsOrCancellationsMode getDefaultSendInvitationsOrCancellationsMode() {
1187    return null;
1188  }
1189
1190}