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.property.complex;
025
026import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
028import microsoft.exchange.webservices.data.core.EwsUtilities;
029import microsoft.exchange.webservices.data.core.XmlElementNames;
030import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
031
032/**
033 * Represents a rule that automatically handles incoming messages.
034 * A rule consists of a set of conditions
035 * and exception that determine whether or
036 * not a set of actions should be executed on incoming messages.
037 */
038public final class Rule extends ComplexProperty {
039
040  /**
041   * The rule ID.
042   */
043  private String ruleId;
044
045  /**
046   * The rule display name.
047   */
048  private String displayName;
049
050  /**
051   * The rule priority.
052   */
053  private int priority;
054
055  /**
056   * The rule status of enabled or not.
057   */
058  private boolean isEnabled;
059
060  /**
061   * The rule status of is supported or not.
062   */
063  private boolean isNotSupported;
064
065  /**
066   * The rule status of in error or not.
067   */
068  private boolean isInError;
069
070  /**
071   * The rule conditions.
072   */
073  private RulePredicates conditions;
074
075  /**
076   * The rule actions.
077   */
078  private RuleActions actions;
079
080  /**
081   * The rule exception.
082   */
083  private RulePredicates exceptions;
084
085  /**
086   * Initializes a new instance of the Rule class.
087   */
088  public Rule() {
089    super();
090
091    /**
092     * New rule has priority as 0 by default
093     */
094    this.priority = 1;
095
096    /**
097     * New rule is enabled by default
098     */
099    this.isEnabled = true;
100    this.conditions = new RulePredicates();
101    this.actions = new RuleActions();
102    this.exceptions = new RulePredicates();
103  }
104
105
106  /**
107   * Gets or sets the Id of this rule.
108   */
109  public String getId() {
110
111    return this.ruleId;
112  }
113
114  public void setId(String value) {
115    if (this.canSetFieldValue(this.ruleId, value)) {
116      this.ruleId = value;
117      this.changed();
118    }
119  }
120
121  /**
122   * Gets or sets the name of this rule as it should be displayed to the user.
123   */
124  public String getDisplayName() {
125    return this.displayName;
126  }
127
128  public void setDisplayName(String value) {
129    if (this.canSetFieldValue(this.displayName, value)) {
130      this.displayName = value;
131      this.changed();
132    }
133  }
134
135
136  /**
137   * Gets or sets the priority of this rule,
138   * which determines its execution order.
139   */
140  public int getPriority() {
141    return this.priority;
142  }
143
144  public void setPriority(int value) {
145    if (this.canSetFieldValue(this.priority, value)) {
146      this.priority = value;
147      this.changed();
148    }
149  }
150
151
152  /**
153   * Gets or sets a value indicating whether this rule is enabled.
154   */
155  public boolean getIsEnabled() {
156    return this.isEnabled;
157  }
158
159  public void setIsEnabled(boolean value) {
160    if (this.canSetFieldValue(this.isEnabled, value)) {
161      this.isEnabled = value;
162      this.changed();
163    }
164  }
165
166  /**
167   * Gets a value indicating whether this rule can be modified via EWS.
168   * If IsNotSupported is true, the rule cannot be modified via EWS.
169   */
170  public boolean getIsNotSupported() {
171    return this.isNotSupported;
172
173  }
174
175  /**
176   * Gets or sets a value indicating whether
177   * this rule has errors. A rule that is in error
178   * cannot be processed unless it is updated and the error is corrected.
179   */
180  public boolean getIsInError() {
181    return this.isInError;
182  }
183
184  public void setIsInError(boolean value) {
185    if (this.canSetFieldValue(this.isInError, value)) {
186      this.isInError = value;
187      this.changed();
188    }
189  }
190
191  /**
192   * Gets the conditions that determine whether or not this rule should be
193   * executed against incoming messages.
194   */
195  public RulePredicates getConditions() {
196    return this.conditions;
197  }
198
199  /**
200   * Gets the actions that should be executed against incoming messages if the
201   * conditions evaluate as true.
202   */
203  public RuleActions getActions() {
204    return this.actions;
205
206  }
207
208  /**
209   * Gets the exception that determine
210   * if this rule should be skipped even if
211   * its conditions evaluate to true.
212   */
213  public RulePredicates getExceptions() {
214    return this.exceptions;
215  }
216
217  /**
218   * Tries to read element from XML.
219   *
220   * @param reader The reader.
221   * @return True if element was read.
222   * @throws Exception
223   */
224  @Override
225  public boolean tryReadElementFromXml(EwsServiceXmlReader
226      reader) throws Exception {
227
228    if (reader.getLocalName().equals(XmlElementNames.DisplayName)) {
229      this.displayName = reader.readElementValue();
230      return true;
231    } else if (reader.getLocalName().equals(XmlElementNames.RuleId)) {
232      this.ruleId = reader.readElementValue();
233      return true;
234    } else if (reader.getLocalName().equals(XmlElementNames.Priority)) {
235      this.priority = reader.readElementValue(Integer.class);
236      return true;
237    } else if (reader.getLocalName().equals(XmlElementNames.IsEnabled)) {
238      this.isEnabled = reader.readElementValue(Boolean.class);
239      return true;
240    } else if (reader.getLocalName().equals(XmlElementNames.IsNotSupported)) {
241      this.isNotSupported = reader.readElementValue(Boolean.class);
242      return true;
243    } else if (reader.getLocalName().equals(XmlElementNames.IsInError)) {
244      this.isInError = reader.readElementValue(Boolean.class);
245      return true;
246    } else if (reader.getLocalName().equals(XmlElementNames.Conditions)) {
247      this.conditions.loadFromXml(reader, reader.getLocalName());
248      return true;
249    } else if (reader.getLocalName().equals(XmlElementNames.Actions)) {
250      this.actions.loadFromXml(reader, reader.getLocalName());
251      return true;
252    } else if (reader.getLocalName().equals(XmlElementNames.Exceptions)) {
253      this.exceptions.loadFromXml(reader, reader.getLocalName());
254      return true;
255    } else {
256      return false;
257    }
258  }
259
260  /**
261   * Writes elements to XML.
262   *
263   * @param writer The writer.
264   * @throws Exception
265   */
266  @Override
267  public void writeElementsToXml(EwsServiceXmlWriter writer)
268      throws Exception {
269    if (!(getId() == null || getId().isEmpty())) {
270      writer.writeElementValue(
271          XmlNamespace.Types,
272          XmlElementNames.RuleId,
273          this.getId());
274    }
275
276    writer.writeElementValue(
277        XmlNamespace.Types,
278        XmlElementNames.DisplayName,
279        this.getDisplayName());
280    writer.writeElementValue(
281        XmlNamespace.Types,
282        XmlElementNames.Priority,
283        this.getPriority());
284    writer.writeElementValue(
285        XmlNamespace.Types,
286        XmlElementNames.IsEnabled,
287        this.getIsEnabled());
288    writer.writeElementValue(
289        XmlNamespace.Types,
290        XmlElementNames.IsInError,
291        this.getIsInError());
292    this.getConditions().writeToXml(writer, XmlElementNames.Conditions);
293    this.getExceptions().writeToXml(writer, XmlElementNames.Exceptions);
294    this.getActions().writeToXml(writer, XmlElementNames.Actions);
295  }
296
297
298  /**
299   * Validates this instance.
300   */
301  @Override
302  protected void internalValidate() throws Exception {
303    super.internalValidate();
304    EwsUtilities.validateParam(this.displayName, "DisplayName");
305    EwsUtilities.validateParam(this.conditions, "Conditions");
306    EwsUtilities.validateParam(this.exceptions, "Exceptions");
307    EwsUtilities.validateParam(this.actions, "Actions");
308  }
309}
310