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.availability;
025    
026    import microsoft.exchange.webservices.data.ISelfValidate;
027    import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
028    import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
029    import microsoft.exchange.webservices.data.core.EwsUtilities;
030    import microsoft.exchange.webservices.data.core.XmlElementNames;
031    import microsoft.exchange.webservices.data.core.enumeration.property.OofExternalAudience;
032    import microsoft.exchange.webservices.data.core.enumeration.property.OofState;
033    import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
034    import microsoft.exchange.webservices.data.core.exception.misc.ArgumentException;
035    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
036    import microsoft.exchange.webservices.data.misc.availability.OofReply;
037    import microsoft.exchange.webservices.data.misc.availability.TimeWindow;
038    import microsoft.exchange.webservices.data.property.complex.ComplexProperty;
039    
040    import javax.xml.stream.XMLStreamException;
041    
042    /**
043     * Represents a user's Out of Office (OOF) settings.
044     */
045    public final class OofSettings extends ComplexProperty implements ISelfValidate {
046    
047      /**
048       * The state.
049       */
050      private OofState state = OofState.Disabled;
051    
052      /**
053       * The external audience.
054       */
055      private OofExternalAudience externalAudience = OofExternalAudience.None;
056    
057      /**
058       * The allow external oof.
059       */
060      private OofExternalAudience allowExternalOof = OofExternalAudience.None;
061    
062      /**
063       * The duration.
064       */
065      private TimeWindow duration;
066    
067      /**
068       * The internal reply.
069       */
070      private OofReply internalReply;
071    
072      /**
073       * The external reply.
074       */
075      private OofReply externalReply;
076    
077      /**
078       * Serializes an OofReply. Emits an empty OofReply in case the one passed in
079       * is null.
080       *
081       * @param oofReply       The oof reply
082       * @param writer         The writer
083       * @param xmlElementName Name of the xml element
084       * @throws XMLStreamException the XML stream exception
085       * @throws ServiceXmlSerializationException the service xml serialization exception
086       */
087      private void serializeOofReply(OofReply oofReply,
088          EwsServiceXmlWriter writer, String xmlElementName)
089          throws XMLStreamException, ServiceXmlSerializationException {
090        if (oofReply != null) {
091          oofReply.writeToXml(writer, xmlElementName);
092        } else {
093          OofReply.writeEmptyReplyToXml(writer, xmlElementName);
094        }
095      }
096    
097      /**
098       * Initializes a new instance of OofSettings.
099       */
100      public OofSettings()
101    
102      {
103        super();
104      }
105    
106      /**
107       * Tries to read element from XML.
108       *
109       * @param reader The reader
110       * @return True if appropriate element was read.
111       * @throws Exception the exception
112       */
113      @Override
114      public boolean tryReadElementFromXml(EwsServiceXmlReader reader)
115          throws Exception {
116        if (reader.getLocalName().equals(XmlElementNames.OofState)) {
117          this.state = reader.readValue(OofState.class);
118          return true;
119        } else if (reader.getLocalName().equals(
120            XmlElementNames.ExternalAudience)) {
121          this.externalAudience = reader.readValue(OofExternalAudience.class);
122          return true;
123        } else if (reader.getLocalName().equals(XmlElementNames.Duration)) {
124          this.duration = new TimeWindow();
125          this.duration.loadFromXml(reader);
126          return true;
127        } else if (reader.getLocalName().equals(XmlElementNames.InternalReply)) {
128          this.internalReply = new OofReply();
129          this.internalReply.loadFromXml(reader, reader.getLocalName());
130          return true;
131        } else if (reader.getLocalName().equals(XmlElementNames.ExternalReply)) {
132          this.externalReply = new OofReply();
133          this.externalReply.loadFromXml(reader, reader.getLocalName());
134          return true;
135        } else {
136          return false;
137        }
138      }
139    
140      /**
141       * Writes elements to XML.
142       *
143       * @param writer The writer
144       * @throws Exception the exception
145       */
146      @Override
147      public void writeElementsToXml(EwsServiceXmlWriter writer)
148          throws Exception {
149        super.writeElementsToXml(writer);
150    
151        writer.writeElementValue(XmlNamespace.Types, XmlElementNames.OofState,
152            this.getState());
153    
154        writer.writeElementValue(XmlNamespace.Types,
155            XmlElementNames.ExternalAudience, this.getExternalAudience());
156    
157        if (this.getDuration() != null && this.getState() == OofState.Scheduled) {
158          this.getDuration().writeToXml(writer, XmlElementNames.Duration);
159        }
160    
161        this.serializeOofReply(this.getInternalReply(), writer,
162            XmlElementNames.InternalReply);
163        this.serializeOofReply(this.getExternalReply(), writer,
164            XmlElementNames.ExternalReply);
165      }
166    
167      /**
168       * Gets the user's OOF state.
169       *
170       * @return The user's OOF state.
171       */
172      public OofState getState() {
173        return state;
174      }
175    
176      /**
177       * Sets the user's OOF state.
178       *
179       * @param state the new state
180       */
181      public void setState(OofState state) {
182        this.state = state;
183      }
184    
185      /**
186       * Gets a value indicating who should receive external OOF messages.
187       *
188       * @return the external audience
189       */
190      public OofExternalAudience getExternalAudience() {
191        return externalAudience;
192      }
193    
194      /**
195       * Sets a value indicating who should receive external OOF messages.
196       *
197       * @param externalAudience the new external audience
198       */
199      public void setExternalAudience(OofExternalAudience externalAudience) {
200        this.externalAudience = externalAudience;
201      }
202    
203      /**
204       * Gets the duration of the OOF status when State is set to
205       * OofState.Scheduled.
206       *
207       * @return the duration
208       */
209      public TimeWindow getDuration() {
210        return duration;
211      }
212    
213      /**
214       * Sets the duration of the OOF status when State is set to
215       * OofState.Scheduled.
216       *
217       * @param duration the new duration
218       */
219      public void setDuration(TimeWindow duration) {
220        this.duration = duration;
221      }
222    
223      /**
224       * Gets the OOF response sent other users in the user's domain or trusted
225       * domain.
226       *
227       * @return the internal reply
228       */
229      public OofReply getInternalReply() {
230        return internalReply;
231      }
232    
233      /**
234       * Sets the OOF response sent other users in the user's domain or trusted
235       * domain.
236       *
237       * @param internalReply the new internal reply
238       */
239      public void setInternalReply(OofReply internalReply) {
240        this.internalReply = internalReply;
241      }
242    
243      /**
244       * Gets the OOF response sent to addresses outside the user's domain or
245       * trusted domain.
246       *
247       * @return the external reply
248       */
249      public OofReply getExternalReply() {
250        return externalReply;
251      }
252    
253      /**
254       * Sets the OOF response sent to addresses outside the user's domain or
255       * trusted domain.
256       *
257       * @param externalReply the new external reply
258       */
259      public void setExternalReply(OofReply externalReply) {
260        this.externalReply = externalReply;
261      }
262    
263      /**
264       * Gets a value indicating the authorized external OOF notification.
265       *
266       * @return the allow external oof
267       */
268      public OofExternalAudience getAllowExternalOof() {
269        return allowExternalOof;
270      }
271    
272      /**
273       * Sets a value indicating the authorized external OOF notification.
274       *
275       * @param allowExternalOof the new allow external oof
276       */
277      public void setAllowExternalOof(OofExternalAudience allowExternalOof) {
278        this.allowExternalOof = allowExternalOof;
279      }
280    
281      /**
282       * Validates this instance.
283       *
284       * @throws Exception the exception
285       */
286      @Override
287      public void validate() throws Exception {
288        if (this.getState() == OofState.Scheduled) {
289          if (this.getDuration() == null) {
290            throw new ArgumentException("Duration must be specified when State is equal to Scheduled.");
291          }
292    
293          EwsUtilities.validateParam(this.getDuration(), "Duration");
294        }
295      }
296    
297    }