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;
025    
026    import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027    import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
028    import microsoft.exchange.webservices.data.core.EwsUtilities;
029    import microsoft.exchange.webservices.data.core.XmlElementNames;
030    import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
031    import microsoft.exchange.webservices.data.core.service.folder.Folder;
032    import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
033    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
034    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceValidationException;
035    import org.apache.commons.logging.Log;
036    import org.apache.commons.logging.LogFactory;
037    
038    import java.util.ArrayList;
039    import java.util.Collection;
040    import java.util.Iterator;
041    
042    /**
043     * Represents a collection of folder permissions.
044     */
045    public final class FolderPermissionCollection extends ComplexPropertyCollection<FolderPermission> {
046    
047      private static final Log LOG = LogFactory.getLog(FolderPermissionCollection.class);
048    
049      /**
050       * The is calendar folder.
051       */
052      private boolean isCalendarFolder;
053    
054      /**
055       * The unknown entries.
056       */
057      private Collection<String> unknownEntries = new ArrayList<String>();
058    
059      /**
060       * Initializes a new instance of the FolderPermissionCollection class.
061       *
062       * @param owner the owner
063       */
064      public FolderPermissionCollection(Folder owner) {
065        super();
066        this.isCalendarFolder = owner instanceof CalendarFolder;
067      }
068    
069      /**
070       * Gets the name of the inner collection XML element.
071       *
072       * @return the inner collection xml element name
073       */
074      private String getInnerCollectionXmlElementName() {
075        return this.isCalendarFolder ? XmlElementNames.CalendarPermissions :
076            XmlElementNames.Permissions;
077      }
078    
079      /**
080       * Gets the name of the collection item XML element.
081       *
082       * @return the collection item xml element name
083       */
084      private String getCollectionItemXmlElementName() {
085        return this.isCalendarFolder ? XmlElementNames.CalendarPermission :
086            XmlElementNames.Permission;
087      }
088    
089      /**
090       * Gets the name of the collection item XML element.
091       *
092       * @param complexProperty the complex property
093       * @return the collection item xml element name
094       */
095      @Override
096      protected String getCollectionItemXmlElementName(
097          FolderPermission complexProperty) {
098        return this.getCollectionItemXmlElementName();
099      }
100    
101      /**
102       * Loads from XML.
103       *
104       * @param reader           the reader
105       * @param localElementName the local element name
106       * @throws Exception the exception
107       */
108      @Override public void loadFromXml(EwsServiceXmlReader reader, String localElementName) throws Exception {
109        reader.ensureCurrentNodeIsStartElement(XmlNamespace.Types,
110            localElementName);
111    
112        reader.readStartElement(XmlNamespace.Types, this
113            .getInnerCollectionXmlElementName());
114        super.loadFromXml(reader, this.getInnerCollectionXmlElementName());
115        reader.readEndElementIfNecessary(XmlNamespace.Types, this
116            .getInnerCollectionXmlElementName());
117    
118        reader.read();
119    
120        if (reader.isStartElement(XmlNamespace.Types,
121            XmlElementNames.UnknownEntries)) {
122          do {
123            reader.read();
124    
125            if (reader.isStartElement(XmlNamespace.Types,
126                XmlElementNames.UnknownEntry)) {
127              this.unknownEntries.add(reader.readElementValue());
128            }
129          } while (!reader.isEndElement(XmlNamespace.Types,
130              XmlElementNames.UnknownEntries));
131        }
132      }
133    
134      /**
135       * Validates this instance.
136       */
137      public void validate() {
138        for (int permissionIndex = 0; permissionIndex < this.getItems().size(); permissionIndex++) {
139          FolderPermission permission = this.getItems().get(permissionIndex);
140          try {
141            permission.validate(this.isCalendarFolder, permissionIndex);
142          } catch (ServiceValidationException e) {
143            LOG.error(e);
144          } catch (ServiceLocalException e) {
145            LOG.error(e);
146          }
147        }
148      }
149    
150      /**
151       * Writes the elements to XML.
152       *
153       * @param writer the writer
154       * @throws Exception the exception
155       */
156      @Override
157      public void writeElementsToXml(EwsServiceXmlWriter writer)
158          throws Exception {
159        writer.writeStartElement(XmlNamespace.Types, this
160            .getInnerCollectionXmlElementName());
161        for (FolderPermission folderPermission : this) {
162          folderPermission.writeToXml(writer, this
163                  .getCollectionItemXmlElementName(folderPermission),
164              this.isCalendarFolder);
165        }
166        writer.writeEndElement(); // this.InnerCollectionXmlElementName
167      }
168    
169      /**
170       * Creates the complex property.
171       *
172       * @param xmlElementName the xml element name
173       * @return FolderPermission instance.
174       */
175      @Override
176      protected FolderPermission createComplexProperty(String xmlElementName) {
177        return new FolderPermission();
178      }
179    
180      /**
181       * Adds a permission to the collection.
182       *
183       * @param permission the permission
184       */
185      public void add(FolderPermission permission) {
186        this.internalAdd(permission);
187      }
188    
189      /**
190       * Adds the specified permissions to the collection.
191       *
192       * @param permissions the permissions
193       * @throws Exception the exception
194       */
195      public void addFolderRange(Iterator<FolderPermission> permissions)
196          throws Exception {
197        EwsUtilities.validateParam(permissions, "permissions");
198    
199        if (null != permissions) {
200          while (permissions.hasNext()) {
201            this.add(permissions.next());
202          }
203        }
204      }
205    
206      /**
207       * Clears this collection.
208       */
209      public void clear() {
210        this.internalClear();
211      }
212    
213      /**
214       * Removes a permission from the collection.
215       *
216       * @param permission the permission
217       * @return True if the folder permission was successfully removed from the
218       * collection, false otherwise.
219       */
220      public boolean remove(FolderPermission permission) {
221        return this.internalRemove(permission);
222      }
223    
224      /**
225       * Removes a permission from the collection.
226       *
227       * @param index the index
228       */
229      public void removeAt(int index) {
230        this.internalRemoveAt(index);
231      }
232    
233      /**
234       * Gets a list of unknown user Ids in the collection.
235       *
236       * @return the unknown entries
237       */
238      public Collection<String> getUnknownEntries() {
239        return this.unknownEntries;
240      }
241    }