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.EwsServiceXmlWriter;
027import microsoft.exchange.webservices.data.core.EwsUtilities;
028import microsoft.exchange.webservices.data.core.XmlAttributeNames;
029import microsoft.exchange.webservices.data.core.XmlElementNames;
030import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
031import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
032import microsoft.exchange.webservices.data.core.exception.service.local.ServiceVersionException;
033import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
034
035/**
036 * Represents the Id of a folder.
037 */
038public final class FolderId extends ServiceId {
039
040  /**
041   * The folder name.
042   */
043  private WellKnownFolderName folderName;
044
045  /**
046   * The mailbox.
047   */
048  private Mailbox mailbox;
049
050  /**
051   * Initializes a new instance.
052   */
053  public FolderId() {
054    super();
055  }
056
057  /**
058   * Initializes a new instance.Use this constructor to link this FolderId to
059   * an existing folder that you have the unique Id of.
060   *
061   * @param uniqueId the unique id
062   * @throws Exception the exception
063   */
064  public FolderId(String uniqueId) throws Exception {
065    super(uniqueId);
066  }
067
068  /**
069   * Initializes a new instance.Use this constructor to link this FolderId to
070   * a well known folder (e.g. Inbox, Calendar or Contacts)
071   *
072   * @param folderName the folder name
073   */
074  public FolderId(WellKnownFolderName folderName) {
075    super();
076    this.folderName = folderName;
077  }
078
079  /**
080   * Initializes a new instance.Use this constructor to link this FolderId to
081   * a well known folder (e.g. Inbox, Calendar or Contacts) in a specific
082   * mailbox.
083   *
084   * @param folderName the folder name
085   * @param mailbox    the mailbox
086   */
087  public FolderId(WellKnownFolderName folderName, Mailbox mailbox) {
088    this(folderName);
089    this.mailbox = mailbox;
090  }
091
092  /**
093   * Gets the name of the XML element.
094   *
095   * @return XML element name
096   */
097  public String getXmlElementName() {
098    if (this.getFolderName() != null) {
099      return XmlElementNames.DistinguishedFolderId;
100    } else {
101      return XmlElementNames.FolderId;
102    }
103  }
104
105  /**
106   * Writes attribute to XML.
107   *
108   * @param writer the writer
109   * @throws ServiceXmlSerializationException the service xml serialization exception
110   */
111  public void writeAttributesToXml(EwsServiceXmlWriter writer)
112      throws ServiceXmlSerializationException {
113    if (this.getFolderName() != null) {
114      writer.writeAttributeValue(XmlAttributeNames.Id, this
115          .getFolderName().toString().toLowerCase());
116
117      if (this.mailbox != null) {
118        try {
119          this.mailbox.writeToXml(writer, XmlElementNames.Mailbox);
120        } catch (Exception e) {
121          throw new ServiceXmlSerializationException(e.getMessage());
122        }
123      }
124    } else {
125      super.writeAttributesToXml(writer);
126    }
127  }
128
129  /**
130   * Validates FolderId against a specified request version.
131   *
132   * @param version the version
133   * @throws ServiceVersionException the service version exception
134   */
135  public void validate(ExchangeVersion version)
136      throws ServiceVersionException {
137    // The FolderName property is a WellKnownFolderName, an enumeration
138    // type. If the property
139    // is set, make sure that the value is valid for the request version.
140    if (this.getFolderName() != null) {
141      EwsUtilities
142          .validateEnumVersionValue(this.getFolderName(), version);
143    }
144  }
145
146  /**
147   * Gets the name of the folder associated with the folder Id. Name and Id
148   * are mutually exclusive; if one is set, the other is null.
149   *
150   * @return the folder name
151   */
152  public WellKnownFolderName getFolderName() {
153    return this.folderName;
154  }
155
156  /**
157   * Gets the mailbox of the folder. Mailbox is only set when FolderName is
158   * set.
159   *
160   * @return the mailbox
161   */
162  public Mailbox getMailbox() {
163    return this.mailbox;
164  }
165
166  /**
167   * Defines an implicit conversion between string and FolderId.
168   *
169   * @param uniqueId the unique id
170   * @return A FolderId initialized with the specified unique Id
171   * @throws Exception the exception
172   */
173  public static FolderId getFolderIdFromString(String uniqueId)
174      throws Exception {
175    return new FolderId(uniqueId);
176  }
177
178  /**
179   * Defines an implicit conversion between WellKnownFolderName and FolderId.
180   *
181   * @param folderName the folder name
182   * @return A FolderId initialized with the specified folder name
183   */
184  public static FolderId getFolderIdFromWellKnownFolderName(
185      WellKnownFolderName folderName) {
186    return new FolderId(folderName);
187  }
188
189  /**
190   * True if this instance is valid, false otherwise.
191   *
192   * @return the checks if is valid
193   */
194  protected boolean getIsValid() {
195    if (this.folderName != null) {
196      return (this.mailbox == null) || this.mailbox.isValid();
197    } else {
198      return super.isValid();
199    }
200  }
201
202  /**
203   * Determines whether the specified is equal to the current.
204   *
205   * @param obj the obj
206   * @return true if the specified is equal to the current
207   */
208  @Override
209  public boolean equals(Object obj) {
210    if (obj == this) {
211      return true;
212    } else if (obj instanceof FolderId) {
213      FolderId other = (FolderId) obj;
214
215      if (this.folderName != null) {
216        if (other.folderName != null
217            && this.folderName.equals(other.folderName)) {
218          if (this.mailbox != null) {
219            return this.mailbox.equals(other.mailbox);
220          } else if (other.mailbox == null) {
221            return true;
222          }
223        }
224      } else if (super.equals(other)) {
225        return true;
226      }
227
228      return false;
229    } else {
230      return false;
231    }
232  }
233
234  /**
235   * Serves as a hash function for a particular type.
236   *
237   * @return A hash code for the current
238   */
239  @Override
240  public int hashCode() {
241    int hashCode;
242
243    if (this.folderName != null) {
244      hashCode = this.folderName.hashCode();
245
246      if ((this.mailbox != null) && this.mailbox.isValid()) {
247        hashCode = hashCode ^ this.mailbox.hashCode();
248      }
249    } else {
250      hashCode = super.hashCode();
251    }
252
253    return hashCode;
254  }
255
256  /**
257   * Returns a String that represents the current Object.
258   *
259   * @return the string
260   */
261  public String toString() {
262    if (this.isValid()) {
263      if (this.folderName != null) {
264        if ((this.mailbox != null) && mailbox.isValid()) {
265          return String.format("%s,(%s)", this.folderName,
266              this.mailbox.toString());
267        } else {
268          return this.folderName.toString();
269        }
270      } else {
271        return super.toString();
272      }
273    } else {
274      return "";
275    }
276  }
277}