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.response;
025    
026    import microsoft.exchange.webservices.data.attribute.ServiceObjectDefinition;
027    import microsoft.exchange.webservices.data.core.EwsUtilities;
028    import microsoft.exchange.webservices.data.core.PropertySet;
029    import microsoft.exchange.webservices.data.core.XmlElementNames;
030    import microsoft.exchange.webservices.data.core.service.ServiceObject;
031    import microsoft.exchange.webservices.data.core.service.item.Item;
032    import microsoft.exchange.webservices.data.core.service.item.PostItem;
033    import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema;
034    import microsoft.exchange.webservices.data.core.service.schema.ItemSchema;
035    import microsoft.exchange.webservices.data.core.service.schema.PostReplySchema;
036    import microsoft.exchange.webservices.data.core.service.schema.ResponseObjectSchema;
037    import microsoft.exchange.webservices.data.core.service.schema.ServiceObjectSchema;
038    import microsoft.exchange.webservices.data.core.enumeration.service.calendar.AffectedTaskOccurrence;
039    import microsoft.exchange.webservices.data.core.enumeration.service.DeleteMode;
040    import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
041    import microsoft.exchange.webservices.data.core.enumeration.service.MessageDisposition;
042    import microsoft.exchange.webservices.data.core.enumeration.service.SendCancellationsMode;
043    import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
044    import microsoft.exchange.webservices.data.core.exception.misc.InvalidOperationException;
045    import microsoft.exchange.webservices.data.property.complex.FolderId;
046    import microsoft.exchange.webservices.data.property.complex.ItemId;
047    import microsoft.exchange.webservices.data.property.complex.MessageBody;
048    
049    import java.util.List;
050    
051    /**
052     * Represents a reply to a post item.
053     */
054    @ServiceObjectDefinition(xmlElementName = XmlElementNames.PostReplyItem, returnedByServer = false)
055    public final class PostReply extends ServiceObject {
056    
057      /**
058       * The reference item.
059       */
060      private Item referenceItem;
061    
062      /**
063       * Initializes a new instance of the class.
064       *
065       * @param referenceItem the reference item
066       * @throws Exception the exception
067       */
068      public PostReply(Item referenceItem) throws Exception {
069        super(referenceItem.getService());
070        referenceItem.throwIfThisIsNew();
071    
072        this.referenceItem = referenceItem;
073      }
074    
075      /**
076       * Internal method to return the schema associated with this type of object.
077       *
078       * @return The schema associated with this type of object.
079       */
080      @Override
081      public ServiceObjectSchema getSchema() {
082        return PostReplySchema.Instance;
083      }
084    
085      /**
086       * Gets the minimum required server version.
087       *
088       * @return Earliest Exchange version in which this service object type is
089       * supported.
090       */
091      @Override public ExchangeVersion getMinimumRequiredServerVersion() {
092        return ExchangeVersion.Exchange2007_SP1;
093      }
094    
095      /**
096       * Create a PostItem response.
097       *
098       * @param parentFolderId     the parent folder id
099       * @param messageDisposition the message disposition
100       * @return Created PostItem.
101       * @throws Exception the exception
102       */
103      protected PostItem internalCreate(FolderId parentFolderId,
104          MessageDisposition messageDisposition) throws Exception {
105        ((ItemId) this
106            .getObjectFromPropertyDefinition(
107                ResponseObjectSchema.ReferenceItemId))
108            .assign(this.referenceItem.getId());
109    
110        List<Item> items = this.getService().internalCreateResponseObject(this,
111            parentFolderId, messageDisposition);
112    
113        PostItem postItem = EwsUtilities.findFirstItemOfType(PostItem.class,
114            items);
115    
116        // This should never happen. If it does, we have a bug.
117        EwsUtilities
118            .ewsAssert(postItem != null, "PostReply.InternalCreate",
119                       "postItem is null. The CreateItem call did" + " not return the expected PostItem.");
120    
121        return postItem;
122      }
123    
124      /**
125       * Loads the specified set of property on the object.
126       *
127       * @param propertySet the property set
128       * @throws InvalidOperationException the invalid operation exception
129       */
130      @Override
131      protected void internalLoad(PropertySet propertySet)
132          throws InvalidOperationException {
133        throw new InvalidOperationException("Loading this type of object is not supported.");
134      }
135    
136      /**
137       * Deletes the object.
138       *
139       * @param deleteMode              the delete mode
140       * @param sendCancellationsMode   the send cancellations mode
141       * @param affectedTaskOccurrences the affected task occurrences
142       * @throws InvalidOperationException the invalid operation exception
143       */
144      @Override
145      protected void internalDelete(DeleteMode deleteMode,
146          SendCancellationsMode sendCancellationsMode,
147          AffectedTaskOccurrence affectedTaskOccurrences)
148          throws InvalidOperationException {
149        throw new InvalidOperationException("Deleting this type of object isn't authorized.");
150      }
151    
152      /**
153       * Saves the post reply in the same folder as the original post item.
154       * Calling this method results in a call to EWS.
155       *
156       * @return A PostItem representing the posted reply
157       * @throws Exception the exception
158       */
159      public PostItem save() throws Exception {
160        return this.internalCreate(null, null);
161      }
162    
163      /**
164       * Saves the post reply in the same folder as the original post item.
165       * Calling this method results in a call to EWS.
166       *
167       * @param destinationFolderId the destination folder id
168       * @return A PostItem representing the posted reply
169       * @throws Exception the exception
170       */
171      public PostItem save(FolderId destinationFolderId) throws Exception {
172        EwsUtilities.validateParam(destinationFolderId, "destinationFolderId");
173        return this.internalCreate(destinationFolderId, null);
174      }
175    
176      /**
177       * Saves the post reply in a specified folder. Calling this method results
178       * in a call to EWS.
179       *
180       * @param destinationFolderName the destination folder name
181       * @return A PostItem representing the posted reply.
182       * @throws Exception the exception
183       */
184      public PostItem save(WellKnownFolderName destinationFolderName)
185          throws Exception {
186        return this.internalCreate(new FolderId(destinationFolderName), null);
187      }
188    
189      /**
190       * Gets the subject of the post reply.
191       *
192       * @return the subject
193       * @throws Exception the exception
194       */
195      public String getSubject() throws Exception {
196        return (String) this
197            .getObjectFromPropertyDefinition(EmailMessageSchema.Subject);
198      }
199    
200      /**
201       * Sets the subject.
202       *
203       * @param value the new subject
204       * @throws Exception the exception
205       */
206      public void setSubject(String value) throws Exception {
207        this.getPropertyBag().setObjectFromPropertyDefinition(
208            EmailMessageSchema.Subject, value);
209      }
210    
211      /**
212       * Gets the body of the post reply.
213       *
214       * @return the body
215       * @throws Exception the exception
216       */
217      public MessageBody getBody() throws Exception {
218        return (MessageBody) this
219            .getObjectFromPropertyDefinition(ItemSchema.Body);
220      }
221    
222      /**
223       * Sets the body.
224       *
225       * @param value the new body
226       * @throws Exception the exception
227       */
228      public void setBody(MessageBody value) throws Exception {
229        this.getPropertyBag().setObjectFromPropertyDefinition(ItemSchema.Body,
230            value);
231      }
232    
233      /**
234       * Gets the body prefix that should be prepended to the original
235       * post item's body.
236       *
237       * @return the body prefix
238       * @throws Exception the exception
239       */
240      public MessageBody getBodyPrefix() throws Exception {
241        return (MessageBody) this
242            .getObjectFromPropertyDefinition(
243                ResponseObjectSchema.BodyPrefix);
244      }
245    
246      /**
247       * Sets the body prefix.
248       *
249       * @param value the new body prefix
250       * @throws Exception the exception
251       */
252      public void setBodyPrefix(MessageBody value) throws Exception {
253        this.getPropertyBag().setObjectFromPropertyDefinition(
254            ResponseObjectSchema.BodyPrefix, value);
255      }
256    
257    }