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.core.service.item;
025    
026    import microsoft.exchange.webservices.data.attribute.Attachable;
027    import microsoft.exchange.webservices.data.attribute.ServiceObjectDefinition;
028    import microsoft.exchange.webservices.data.core.ExchangeService;
029    import microsoft.exchange.webservices.data.core.PropertySet;
030    import microsoft.exchange.webservices.data.core.XmlElementNames;
031    import microsoft.exchange.webservices.data.core.service.response.PostReply;
032    import microsoft.exchange.webservices.data.core.service.response.ResponseMessage;
033    import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema;
034    import microsoft.exchange.webservices.data.core.service.schema.PostItemSchema;
035    import microsoft.exchange.webservices.data.core.service.schema.ServiceObjectSchema;
036    import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
037    import microsoft.exchange.webservices.data.core.enumeration.service.ResponseMessageType;
038    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
039    import microsoft.exchange.webservices.data.property.complex.EmailAddress;
040    import microsoft.exchange.webservices.data.property.complex.ItemAttachment;
041    import microsoft.exchange.webservices.data.property.complex.ItemId;
042    import microsoft.exchange.webservices.data.property.complex.MessageBody;
043    
044    import java.util.Arrays;
045    import java.util.Date;
046    
047    /**
048     * Represents a post item. Properties available on post item are defined in the
049     * PostItemSchema class.
050     */
051    @Attachable
052    @ServiceObjectDefinition(xmlElementName = XmlElementNames.PostItem)
053    public final class PostItem extends Item {
054    
055      /**
056       * Initializes an unsaved local instance of PostItem.To bind to an existing
057       * post item, use PostItem.Bind() instead.
058       *
059       * @param service the service
060       * @throws Exception the exception
061       */
062      public PostItem(ExchangeService service) throws Exception {
063        super(service);
064      }
065    
066      /**
067       * Initializes a new instance of the class.
068       *
069       * @param parentAttachment the parent attachment
070       * @throws Exception the exception
071       */
072      public PostItem(ItemAttachment parentAttachment) throws Exception {
073        super(parentAttachment);
074      }
075    
076      /**
077       * Binds to an existing post item and loads the specified set of property.
078       * Calling this method results in a call to EWS.
079       *
080       * @param service     the service
081       * @param id          the id
082       * @param propertySet the property set
083       * @return An PostItem instance representing the post item corresponding to
084       * the specified Id.
085       * @throws Exception the exception
086       */
087      public static PostItem bind(ExchangeService service, ItemId id,
088          PropertySet propertySet) throws Exception {
089        return service.bindToItem(PostItem.class, id, propertySet);
090      }
091    
092      /**
093       * Binds to an existing post item and loads its first class property.
094       * calling this method results in a call to EWS.
095       *
096       * @param service the service
097       * @param id      the id
098       * @return An PostItem instance representing the post item corresponding to
099       * the specified Id.
100       * @throws Exception the exception
101       */
102      public static PostItem bind(ExchangeService service, ItemId id)
103          throws Exception {
104        return PostItem
105            .bind(service, id, PropertySet.getFirstClassProperties());
106      }
107    
108      /**
109       * Internal method to return the schema associated with this type of object.
110       *
111       * @return The schema associated with this type of object.
112       */
113      @Override public ServiceObjectSchema getSchema() {
114        return PostItemSchema.Instance;
115      }
116    
117      /**
118       * Internal method to return the schema associated with this type of object.
119       *
120       * @return The schema associated with this type of object.
121       */
122      @Override public ExchangeVersion getMinimumRequiredServerVersion() {
123        return ExchangeVersion.Exchange2007_SP1;
124      }
125    
126      /**
127       * Creates a post reply to this post item.
128       *
129       * @return A PostReply that can be modified and saved.
130       * @throws Exception the exception
131       */
132      public PostReply createPostReply() throws Exception {
133        this.throwIfThisIsNew();
134        return new PostReply(this);
135      }
136    
137      /**
138       * Posts a reply to this post item. Calling this method results in a call to
139       * EWS.
140       *
141       * @param bodyPrefix the body prefix
142       * @throws Exception the exception
143       */
144      public void postReply(MessageBody bodyPrefix) throws Exception {
145        PostReply postReply = this.createPostReply();
146        postReply.setBodyPrefix(bodyPrefix);
147        postReply.save();
148      }
149    
150      /**
151       * Creates a e-mail reply response to the post item.
152       *
153       * @param replyAll the reply all
154       * @return A ResponseMessage representing the e-mail reply response that can
155       * subsequently be modified and sent.
156       * @throws Exception the exception
157       */
158      public ResponseMessage createReply(boolean replyAll) throws Exception {
159        this.throwIfThisIsNew();
160        return new ResponseMessage(this,
161            replyAll ? ResponseMessageType.ReplyAll :
162                ResponseMessageType.Reply);
163      }
164    
165      /**
166       * Replies to the post item. Calling this method results in a call to EWS.
167       *
168       * @param bodyPrefix the body prefix
169       * @param replyAll   the reply all
170       * @throws Exception the exception
171       */
172      public void reply(MessageBody bodyPrefix, boolean replyAll)
173          throws Exception {
174        ResponseMessage responseMessage = this.createReply(replyAll);
175        responseMessage.setBodyPrefix(bodyPrefix);
176        responseMessage.sendAndSaveCopy();
177      }
178    
179      /**
180       * Creates a forward response to the post item.
181       *
182       * @return A ResponseMessage representing the forward response that can
183       * subsequently be modified and sent.
184       * @throws Exception the exception
185       */
186      public ResponseMessage createForward() throws Exception {
187        this.throwIfThisIsNew();
188        return new ResponseMessage(this, ResponseMessageType.Forward);
189      }
190    
191      /**
192       * Forwards the post item. Calling this method results in a call to EWS.
193       *
194       * @param bodyPrefix   the body prefix
195       * @param toRecipients the to recipients
196       * @throws Exception the exception
197       */
198      public void forward(MessageBody bodyPrefix, EmailAddress... toRecipients)
199          throws Exception {
200        forward(bodyPrefix, Arrays.asList(toRecipients));
201      }
202    
203      /**
204       * Forwards the post item. Calling this method results in a call to EWS.
205       *
206       * @param bodyPrefix   the body prefix
207       * @param toRecipients the to recipients
208       * @throws Exception the exception
209       */
210      public void forward(MessageBody bodyPrefix,
211          Iterable<EmailAddress> toRecipients) throws Exception {
212        ResponseMessage responseMessage = this.createForward();
213        responseMessage.setBodyPrefix(bodyPrefix);
214        responseMessage.getToRecipients()
215            .addEmailRange(toRecipients.iterator());
216    
217        responseMessage.sendAndSaveCopy();
218      }
219    
220      // Properties
221    
222      /**
223       * Gets the conversation index of the post item.
224       *
225       * @return the conversation index
226       * @throws ServiceLocalException the service local exception
227       */
228      public byte[] getConversationIndex() throws ServiceLocalException {
229        return getPropertyBag().getObjectFromPropertyDefinition(
230            EmailMessageSchema.ConversationIndex);
231      }
232    
233      /**
234       * Gets the conversation topic of the post item.
235       *
236       * @return the conversation topic
237       * @throws ServiceLocalException the service local exception
238       */
239      public String getConversationTopic() throws ServiceLocalException {
240        return getPropertyBag().getObjectFromPropertyDefinition(
241            EmailMessageSchema.ConversationTopic);
242      }
243    
244      /**
245       * Gets the "on behalf" poster of the post item.
246       *
247       * @return the from
248       * @throws ServiceLocalException the service local exception
249       */
250      public EmailAddress getFrom() throws ServiceLocalException {
251        return getPropertyBag().getObjectFromPropertyDefinition(
252            EmailMessageSchema.From);
253      }
254    
255      /**
256       * Sets the from.
257       *
258       * @param value the new from
259       * @throws Exception the exception
260       */
261      public void setFrom(EmailAddress value) throws Exception {
262        this.getPropertyBag().setObjectFromPropertyDefinition(
263            EmailMessageSchema.From, value);
264      }
265    
266      /**
267       * Gets the Internet message Id of the post item.
268       *
269       * @return the internet message id
270       * @throws ServiceLocalException the service local exception
271       */
272      public String getInternetMessageId() throws ServiceLocalException {
273        return getPropertyBag().getObjectFromPropertyDefinition(
274            EmailMessageSchema.InternetMessageId);
275      }
276    
277      /**
278       * Gets a value indicating whether the post item is read.
279       *
280       * @return the checks if is read
281       * @throws ServiceLocalException the service local exception
282       */
283      public Boolean getIsRead() throws ServiceLocalException {
284        return getPropertyBag().getObjectFromPropertyDefinition(
285            EmailMessageSchema.IsRead);
286      }
287    
288      /**
289       * Sets the checks if is read.
290       *
291       * @param value the new checks if is read
292       * @throws Exception the exception
293       */
294      public void setIsRead(Boolean value) throws Exception {
295        this.getPropertyBag().setObjectFromPropertyDefinition(
296            EmailMessageSchema.IsRead, value);
297      }
298    
299      /**
300       * Gets the the date and time when the post item was posted.
301       *
302       * @return the posted time
303       * @throws ServiceLocalException the service local exception
304       */
305      public Date getPostedTime() throws ServiceLocalException {
306        return getPropertyBag().getObjectFromPropertyDefinition(
307            PostItemSchema.PostedTime);
308      }
309    
310      /**
311       * Gets the references of the post item.
312       *
313       * @return the references
314       * @throws ServiceLocalException the service local exception
315       */
316      public String getReferences() throws ServiceLocalException {
317        return getPropertyBag().getObjectFromPropertyDefinition(
318            EmailMessageSchema.References);
319      }
320    
321      /**
322       * Sets the checks if is read.
323       *
324       * @param value the new checks if is read
325       * @throws Exception the exception
326       */
327      public void setIsRead(String value) throws Exception {
328        this.getPropertyBag().setObjectFromPropertyDefinition(
329            EmailMessageSchema.References, value);
330      }
331    
332      /**
333       * Gets the sender (poster) of the post item.
334       *
335       * @return the sender
336       * @throws ServiceLocalException the service local exception
337       */
338      public EmailAddress getSender() throws ServiceLocalException {
339        return getPropertyBag().getObjectFromPropertyDefinition(
340            EmailMessageSchema.Sender);
341      }
342    
343      /**
344       * Sets the sender.
345       *
346       * @param value the new sender
347       * @throws Exception the exception
348       */
349      public void setSender(EmailAddress value) throws Exception {
350        this.getPropertyBag().setObjectFromPropertyDefinition(
351            EmailMessageSchema.Sender, value);
352      }
353    
354    }