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.XmlElementNames;
029import microsoft.exchange.webservices.data.core.enumeration.permission.folder.DelegateFolderPermissionLevel;
030import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
031import microsoft.exchange.webservices.data.core.exception.service.local.ServiceValidationException;
032import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
033
034import javax.xml.stream.XMLStreamException;
035
036import java.util.HashMap;
037import java.util.Map;
038
039/**
040 * Represents the permissions of a delegate user.
041 */
042public final class DelegatePermissions extends ComplexProperty {
043
044  private Map<String, DelegateFolderPermission> delegateFolderPermissions;
045
046  /**
047   * Initializes a new instance of the class.
048   */
049
050  protected DelegatePermissions() {
051    super();
052    this.delegateFolderPermissions = new HashMap<String,
053        DelegateFolderPermission>();
054
055    delegateFolderPermissions.put(
056        XmlElementNames.CalendarFolderPermissionLevel,
057        new DelegateFolderPermission());
058    delegateFolderPermissions.put(
059        XmlElementNames.TasksFolderPermissionLevel,
060        new DelegateFolderPermission());
061    delegateFolderPermissions.put(
062        XmlElementNames.InboxFolderPermissionLevel,
063        new DelegateFolderPermission());
064    delegateFolderPermissions.put(
065        XmlElementNames.ContactsFolderPermissionLevel,
066        new DelegateFolderPermission());
067    delegateFolderPermissions.put(
068        XmlElementNames.NotesFolderPermissionLevel,
069        new DelegateFolderPermission());
070    delegateFolderPermissions.put(
071        XmlElementNames.JournalFolderPermissionLevel,
072        new DelegateFolderPermission());
073  }
074
075  /**
076   * Gets the delegate user's permission on the principal's calendar.
077   *
078   * @return the calendar folder permission level
079   */
080  public DelegateFolderPermissionLevel getCalendarFolderPermissionLevel() {
081    return this.delegateFolderPermissions.get(XmlElementNames.
082        CalendarFolderPermissionLevel).getPermissionLevel();
083
084  }
085
086  /**
087   * sets the delegate user's permission on the principal's calendar.
088   *
089   * @param value the new calendar folder permission level
090   */
091  public void setCalendarFolderPermissionLevel(
092      DelegateFolderPermissionLevel value) {
093    this.delegateFolderPermissions.get(XmlElementNames.
094        CalendarFolderPermissionLevel).setPermissionLevel(value);
095  }
096
097  /**
098   * Gets  the delegate user's permission on the principal's tasks
099   * folder.
100   *
101   * @return the tasks folder permission level
102   */
103  public DelegateFolderPermissionLevel getTasksFolderPermissionLevel() {
104    return this.delegateFolderPermissions.get(XmlElementNames.
105        TasksFolderPermissionLevel).getPermissionLevel();
106
107  }
108
109  /**
110   * Sets the tasks folder permission level.
111   *
112   * @param value the new tasks folder permission level
113   */
114  public void setTasksFolderPermissionLevel(
115      DelegateFolderPermissionLevel value) {
116
117    this.delegateFolderPermissions.get(XmlElementNames.
118        TasksFolderPermissionLevel).setPermissionLevel(value);
119  }
120
121  /**
122   * Gets the delegate user's permission on the principal's inbox.
123   *
124   * @return the inbox folder permission level
125   */
126  public DelegateFolderPermissionLevel getInboxFolderPermissionLevel() {
127    return this.delegateFolderPermissions.get(XmlElementNames.
128        InboxFolderPermissionLevel).
129        getPermissionLevel();
130  }
131
132  /**
133   * Sets the inbox folder permission level.
134   *
135   * @param value the new inbox folder permission level
136   */
137  public void setInboxFolderPermissionLevel(
138      DelegateFolderPermissionLevel value) {
139    this.delegateFolderPermissions.get(XmlElementNames.
140        InboxFolderPermissionLevel).
141        setPermissionLevel(value);
142  }
143
144  /**
145   * Gets  the delegate user's permission on the principal's contacts
146   * folder.
147   *
148   * @return the contacts folder permission level
149   */
150  public DelegateFolderPermissionLevel getContactsFolderPermissionLevel() {
151    return this.delegateFolderPermissions.get(
152        XmlElementNames.ContactsFolderPermissionLevel).
153        getPermissionLevel();
154  }
155
156  /**
157   * Sets the contacts folder permission level.
158   *
159   * @param value the new contacts folder permission level
160   */
161  public void setContactsFolderPermissionLevel(
162      DelegateFolderPermissionLevel value) {
163    this.delegateFolderPermissions.get(
164        XmlElementNames.ContactsFolderPermissionLevel).
165        setPermissionLevel(value);
166  }
167
168  /**
169   * Gets the delegate user's permission on the principal's notes
170   * folder.
171   *
172   * @return the notes folder permission level
173   */
174  public DelegateFolderPermissionLevel getNotesFolderPermissionLevel() {
175    return this.delegateFolderPermissions.get(XmlElementNames.
176        NotesFolderPermissionLevel).
177        getPermissionLevel();
178  }
179
180  /**
181   * Sets the notes folder permission level.
182   *
183   * @param value the new notes folder permission level
184   */
185  public void setNotesFolderPermissionLevel(
186      DelegateFolderPermissionLevel value) {
187    this.delegateFolderPermissions.get(XmlElementNames.
188        NotesFolderPermissionLevel).
189        setPermissionLevel(value);
190  }
191
192  /**
193   * Gets  the delegate user's permission on the principal's journal
194   * folder.
195   *
196   * @return the journal folder permission level
197   */
198  public DelegateFolderPermissionLevel getJournalFolderPermissionLevel() {
199    return this.delegateFolderPermissions.get(XmlElementNames.
200        JournalFolderPermissionLevel).
201        getPermissionLevel();
202  }
203
204  /**
205   * Sets the journal folder permission level.
206   *
207   * @param value the new journal folder permission level
208   */
209  public void setJournalFolderPermissionLevel(
210      DelegateFolderPermissionLevel value) {
211    this.delegateFolderPermissions.get(XmlElementNames.
212        JournalFolderPermissionLevel).
213        setPermissionLevel(value);
214  }
215
216  /**
217   * Reset.
218   */
219  protected void reset() {
220    for (DelegateFolderPermission delegateFolderPermission : this.delegateFolderPermissions.values()) {
221      delegateFolderPermission.reset();
222    }
223  }
224
225  /**
226   * Tries to read element from XML.
227   *
228   * @param reader the reader
229   * @return Returns true if element was read.
230   * @throws Exception the exception
231   */
232  public boolean tryReadElementFromXml(EwsServiceXmlReader reader)
233      throws Exception {
234    DelegateFolderPermission delegateFolderPermission = null;
235
236    if (this.delegateFolderPermissions.containsKey(reader.getLocalName())) {
237      delegateFolderPermission = this.delegateFolderPermissions.
238          get(reader.getLocalName());
239      delegateFolderPermission.initialize(reader.
240          readElementValue(DelegateFolderPermissionLevel.class));
241    }
242
243
244    return delegateFolderPermission != null;
245  }
246
247  /**
248   * Writes elements to XML.
249   *
250   * @param writer the writer
251   * @throws Exception the exception
252   */
253  public void writeElementsToXml(EwsServiceXmlWriter writer)
254      throws Exception {
255    this.writePermissionToXml(writer,
256        XmlElementNames.CalendarFolderPermissionLevel);
257
258    this.writePermissionToXml(writer,
259        XmlElementNames.TasksFolderPermissionLevel);
260
261    this.writePermissionToXml(writer,
262        XmlElementNames.InboxFolderPermissionLevel);
263
264    this.writePermissionToXml(writer,
265        XmlElementNames.ContactsFolderPermissionLevel);
266
267    this.writePermissionToXml(writer,
268        XmlElementNames.NotesFolderPermissionLevel);
269
270    this.writePermissionToXml(writer,
271        XmlElementNames.JournalFolderPermissionLevel);
272  }
273
274  /**
275   * Write permission to Xml.
276   *
277   * @param writer         the writer
278   * @param xmlElementName the element name
279   * @throws XMLStreamException the XML stream exception
280   */
281  private void writePermissionToXml(
282      EwsServiceXmlWriter writer,
283      String xmlElementName) throws ServiceXmlSerializationException,
284      XMLStreamException {
285    DelegateFolderPermissionLevel delegateFolderPermissionLevel =
286        this.delegateFolderPermissions.
287            get(xmlElementName).getPermissionLevel();
288    // E14 Bug 298307: UpdateDelegate fails if
289    //Custom permission level is round tripped
290    //
291    if (delegateFolderPermissionLevel != DelegateFolderPermissionLevel.Custom) {
292      writer.writeElementValue(
293          XmlNamespace.Types,
294          xmlElementName,
295          delegateFolderPermissionLevel);
296    }
297  }
298
299  /**
300   * Validates this instance for AddDelegate.
301   *
302   * @throws ServiceValidationException
303   */
304  protected void validateAddDelegate() throws ServiceValidationException {
305    for (DelegateFolderPermission delegateFolderPermission : this.delegateFolderPermissions.values()) {
306      if (delegateFolderPermission.getPermissionLevel() == DelegateFolderPermissionLevel.Custom) {
307        throw new ServiceValidationException("This operation can't be performed because one or more folder "
308                                             + "permission levels were set to Custom.");
309      }
310    }
311  }
312
313  /**
314   * Validates this instance for UpdateDelegate.
315   *
316   * @throws ServiceValidationException
317   */
318  protected void validateUpdateDelegate() throws ServiceValidationException {
319    for (DelegateFolderPermission delegateFolderPermission : this.delegateFolderPermissions.values()) {
320      if (delegateFolderPermission.getPermissionLevel() == DelegateFolderPermissionLevel.Custom &&
321          !delegateFolderPermission.isExistingPermissionLevelCustom) {
322        throw new ServiceValidationException("This operation can't be performed because one or more folder "
323                                             + "permission levels were set to Custom.");
324      }
325    }
326  }
327
328  /**
329   * Represents a folder's DelegateFolderPermissionLevel
330   */
331  private static class DelegateFolderPermission {
332
333    /**
334     * Initializes this DelegateFolderPermission.
335     *
336     * @param permissionLevel The DelegateFolderPermissionLevel
337     */
338    protected void initialize(
339        DelegateFolderPermissionLevel permissionLevel) {
340      this.setPermissionLevel(permissionLevel);
341      this.setIsExistingPermissionLevelCustom(permissionLevel ==
342          DelegateFolderPermissionLevel.Custom);
343    }
344
345    /**
346     * Resets this DelegateFolderPermission.
347     */
348    protected void reset() {
349      this.initialize(DelegateFolderPermissionLevel.None);
350    }
351
352
353    private DelegateFolderPermissionLevel permissionLevel = DelegateFolderPermissionLevel.None;
354
355    /**
356     * Gets the delegate user's permission on a principal's folder.
357     */
358    protected DelegateFolderPermissionLevel getPermissionLevel() {
359      return this.permissionLevel;
360    }
361
362    /**
363     * Sets the delegate user's permission on a principal's folder.
364     */
365    protected void setPermissionLevel(
366        DelegateFolderPermissionLevel value) {
367      this.permissionLevel = value;
368    }
369
370
371    private boolean isExistingPermissionLevelCustom;
372
373    /**
374     * Gets IsExistingPermissionLevelCustom.
375     */
376    protected boolean getIsExistingPermissionLevelCustom() {
377      return this.isExistingPermissionLevelCustom;
378    }
379
380    /**
381     * Sets IsExistingPermissionLevelCustom.
382     */
383    private void setIsExistingPermissionLevelCustom(Boolean value) {
384      this.isExistingPermissionLevelCustom = value;
385    }
386
387  }
388}