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.core.service.folder;
025    
026    import microsoft.exchange.webservices.data.attribute.ServiceObjectDefinition;
027    import microsoft.exchange.webservices.data.core.EwsUtilities;
028    import microsoft.exchange.webservices.data.core.ExchangeService;
029    import microsoft.exchange.webservices.data.core.PropertySet;
030    import microsoft.exchange.webservices.data.core.XmlElementNames;
031    import microsoft.exchange.webservices.data.core.response.FindItemResponse;
032    import microsoft.exchange.webservices.data.core.response.ServiceResponseCollection;
033    import microsoft.exchange.webservices.data.core.service.ServiceObject;
034    import microsoft.exchange.webservices.data.core.service.item.Item;
035    import microsoft.exchange.webservices.data.core.service.schema.FolderSchema;
036    import microsoft.exchange.webservices.data.core.service.schema.ServiceObjectSchema;
037    import microsoft.exchange.webservices.data.core.enumeration.service.calendar.AffectedTaskOccurrence;
038    import microsoft.exchange.webservices.data.core.enumeration.service.DeleteMode;
039    import microsoft.exchange.webservices.data.core.enumeration.service.EffectiveRights;
040    import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
041    import microsoft.exchange.webservices.data.core.enumeration.service.SendCancellationsMode;
042    import microsoft.exchange.webservices.data.core.enumeration.service.error.ServiceErrorHandling;
043    import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
044    import microsoft.exchange.webservices.data.core.exception.misc.InvalidOperationException;
045    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
046    import microsoft.exchange.webservices.data.property.complex.ExtendedPropertyCollection;
047    import microsoft.exchange.webservices.data.property.complex.FolderId;
048    import microsoft.exchange.webservices.data.property.complex.FolderPermissionCollection;
049    import microsoft.exchange.webservices.data.property.complex.ManagedFolderInformation;
050    import microsoft.exchange.webservices.data.property.definition.ExtendedPropertyDefinition;
051    import microsoft.exchange.webservices.data.property.definition.PropertyDefinition;
052    import microsoft.exchange.webservices.data.search.FindFoldersResults;
053    import microsoft.exchange.webservices.data.search.FindItemsResults;
054    import microsoft.exchange.webservices.data.search.FolderView;
055    import microsoft.exchange.webservices.data.search.GroupedFindItemsResults;
056    import microsoft.exchange.webservices.data.search.Grouping;
057    import microsoft.exchange.webservices.data.search.ItemView;
058    import microsoft.exchange.webservices.data.search.ViewBase;
059    import microsoft.exchange.webservices.data.search.filter.SearchFilter;
060    import org.apache.commons.logging.Log;
061    import org.apache.commons.logging.LogFactory;
062    
063    import java.util.ArrayList;
064    import java.util.EnumSet;
065    
066    /**
067     * Represents a generic folder.
068     */
069    @ServiceObjectDefinition(xmlElementName = XmlElementNames.Folder)
070    public class Folder extends ServiceObject {
071    
072      private static final Log LOG = LogFactory.getLog(Folder.class);
073    
074      /**
075       * Initializes an unsaved local instance of {@link Folder}.
076       *
077       * @param service EWS service to which this object belongs
078       * @throws Exception the exception
079       */
080      public Folder(ExchangeService service) throws Exception {
081        super(service);
082      }
083    
084      /**
085       * Binds to an existing folder, whatever its actual type is, and loads the
086       * specified set of property. Calling this method results in a call to
087       * EWS.
088       *
089       * @param service     The service to use to bind to the folder.
090       * @param id          The Id of the folder to bind to.
091       * @param propertySet The set of property to load.
092       * @return A Folder instance representing the folder corresponding to the
093       * specified Id.
094       * @throws Exception the exception
095       */
096      public static Folder bind(ExchangeService service, FolderId id,
097          PropertySet propertySet) throws Exception {
098        return service.bindToFolder(Folder.class, id, propertySet);
099      }
100    
101      /**
102       * Binds to an existing folder, whatever its actual type is, and loads the
103       * specified set of property. Calling this method results in a call to
104       * EWS.
105       *
106       * @param service , The service to use to bind to the folder.
107       * @param id      , The Id of the folder to bind to.
108       * @return A Folder instance representing the folder corresponding to the
109       * specified Id.
110       * @throws Exception the exception
111       */
112      public static Folder bind(ExchangeService service, FolderId id)
113          throws Exception {
114        return Folder.bind(service, id, PropertySet.getFirstClassProperties());
115      }
116    
117      /**
118       * Binds to an existing folder, whatever its actual type is, and loads the
119       * specified set of property. Calling this method results in a call to
120       * EWS.
121       *
122       * @param service     The service to use to bind to the folder.
123       * @param name        The name of the folder to bind to.
124       * @param propertySet The set of property to load.
125       * @return A Folder instance representing the folder corresponding to the
126       * specified Id.
127       * @throws Exception the exception
128       */
129      public static Folder bind(ExchangeService service,
130          WellKnownFolderName name, PropertySet propertySet)
131          throws Exception {
132        return Folder.bind(service, new FolderId(name), propertySet);
133      }
134    
135      /**
136       * Binds to an existing folder, whatever its actual type is, and loads the
137       * specified set of property. Calling this method results in a call to
138       * EWS.
139       *
140       * @param service The service to use to bind to the folder.
141       * @param name    The name of the folder to bind to.
142       * @return the folder
143       * @throws Exception the exception
144       */
145      public static Folder bind(ExchangeService service, WellKnownFolderName name)
146          throws Exception {
147        return Folder.bind(service, new FolderId(name), PropertySet
148            .getFirstClassProperties());
149      }
150    
151      /**
152       * Validates this instance.
153       *
154       * @throws Exception the exception
155       */
156      @Override public void validate() throws Exception {
157        super.validate();
158    
159        // Validate folder permissions
160        try {
161          if (this.getPropertyBag().contains(FolderSchema.Permissions)) {
162            this.getPermissions().validate();
163          }
164        } catch (ServiceLocalException e) {
165          LOG.error(e);
166        }
167      }
168    
169      /**
170       * Internal method to return the schema associated with this type of object.
171       *
172       * @return The schema associated with this type of object.
173       */
174      @Override public ServiceObjectSchema getSchema() {
175        return FolderSchema.Instance;
176      }
177    
178      /**
179       * Gets the minimum required server version.
180       *
181       * @return Earliest Exchange version in which this service object type is
182       * supported.
183       */
184      @Override public ExchangeVersion getMinimumRequiredServerVersion() {
185        return ExchangeVersion.Exchange2007_SP1;
186      }
187    
188      /**
189       * Gets the name of the change XML element.
190       *
191       * @return Xml element name
192       */
193      @Override public String getChangeXmlElementName() {
194        return XmlElementNames.FolderChange;
195      }
196    
197      /**
198       * Gets the name of the set field XML element.
199       *
200       * @return Xml element name
201       */
202      @Override public String getSetFieldXmlElementName() {
203        return XmlElementNames.SetFolderField;
204      }
205    
206      /**
207       * Gets the name of the delete field XML element.
208       *
209       * @return Xml element name
210       */
211      @Override public String getDeleteFieldXmlElementName() {
212        return XmlElementNames.DeleteFolderField;
213      }
214    
215      /**
216       * Loads the specified set of property on the object.
217       *
218       * @param propertySet The property to load.
219       * @throws Exception the exception
220       */
221      @Override
222      protected void internalLoad(PropertySet propertySet) throws Exception {
223        this.throwIfThisIsNew();
224    
225        this.getService().loadPropertiesForFolder(this, propertySet);
226      }
227    
228      /**
229       * Deletes the object.
230       *
231       * @param deleteMode              the delete mode
232       * @param sendCancellationsMode   Indicates whether meeting cancellation messages should be
233       *                                sent.
234       * @param affectedTaskOccurrences Indicate which occurrence of a recurring task should be
235       *                                deleted.
236       * @throws Exception the exception
237       */
238      @Override
239      protected void internalDelete(DeleteMode deleteMode,
240          SendCancellationsMode sendCancellationsMode,
241          AffectedTaskOccurrence affectedTaskOccurrences) throws Exception {
242        try {
243          this.throwIfThisIsNew();
244        } catch (InvalidOperationException e) {
245          LOG.error(e);
246        }
247    
248        this.getService().deleteFolder(this.getId(), deleteMode);
249      }
250    
251      /**
252       * Deletes the folder. Calling this method results in a call to EWS.
253       *
254       * @param deleteMode the delete mode
255       * @throws Exception the exception
256       */
257      public void delete(DeleteMode deleteMode) throws Exception {
258        this.internalDelete(deleteMode, null, null);
259      }
260    
261      /**
262       * Empties the folder. Calling this method results in a call to EWS.
263       *
264       * @param deletemode       the delete mode
265       * @param deleteSubFolders Indicates whether sub-folder should also be deleted.
266       * @throws Exception
267       */
268      public void empty(DeleteMode deletemode, boolean deleteSubFolders)
269          throws Exception {
270        this.throwIfThisIsNew();
271        this.getService().emptyFolder(this.getId(),
272            deletemode, deleteSubFolders);
273      }
274    
275      /**
276       * Saves this folder in a specific folder. Calling this method results in a
277       * call to EWS.
278       *
279       * @param parentFolderId The Id of the folder in which to save this folder.
280       * @throws Exception the exception
281       */
282      public void save(FolderId parentFolderId) throws Exception {
283        this.throwIfThisIsNotNew();
284    
285        EwsUtilities.validateParam(parentFolderId, "parentFolderId");
286    
287        if (this.isDirty()) {
288          this.getService().createFolder(this, parentFolderId);
289        }
290      }
291    
292      /**
293       * Saves this folder in a specific folder. Calling this method results in a
294       * call to EWS.
295       *
296       * @param parentFolderName The name of the folder in which to save this folder.
297       * @throws Exception the exception
298       */
299      public void save(WellKnownFolderName parentFolderName) throws Exception {
300        this.save(new FolderId(parentFolderName));
301      }
302    
303      /**
304       * Applies the local changes that have been made to this folder. Calling
305       * this method results in a call to EWS.
306       *
307       * @throws Exception the exception
308       */
309      public void update() throws Exception {
310        if (this.isDirty()) {
311          if (this.getPropertyBag().getIsUpdateCallNecessary()) {
312            this.getService().updateFolder(this);
313          }
314        }
315      }
316    
317      /**
318       * Copies this folder into a specific folder. Calling this method results in
319       * a call to EWS.
320       *
321       * @param destinationFolderId The Id of the folder in which to copy this folder.
322       * @return A Folder representing the copy of this folder.
323       * @throws Exception the exception
324       */
325      public Folder copy(FolderId destinationFolderId) throws Exception {
326        this.throwIfThisIsNew();
327    
328        EwsUtilities.validateParam(destinationFolderId, "destinationFolderId");
329    
330        return this.getService().copyFolder(this.getId(), destinationFolderId);
331      }
332    
333      /**
334       * Copies this folder into the specified folder. Calling this method results
335       * in a call to EWS.
336       *
337       * @param destinationFolderName The name of the folder in which to copy this folder.
338       * @return A Folder representing the copy of this folder.
339       * @throws Exception the exception
340       */
341      public Folder copy(WellKnownFolderName destinationFolderName)
342          throws Exception {
343        return this.copy(new FolderId(destinationFolderName));
344      }
345    
346      /**
347       * Moves this folder to a specific folder. Calling this method results in a
348       * call to EWS.
349       *
350       * @param destinationFolderId The Id of the folder in which to move this folder.
351       * @return A new folder representing this folder in its new location. After
352       * Move completes, this folder does not exist anymore.
353       * @throws Exception the exception
354       */
355      public Folder move(FolderId destinationFolderId) throws Exception {
356        this.throwIfThisIsNew();
357    
358        EwsUtilities.validateParam(destinationFolderId, "destinationFolderId");
359    
360        return this.getService().moveFolder(this.getId(), destinationFolderId);
361      }
362    
363      /**
364       * Moves this folder to a specific folder. Calling this method results in a
365       * call to EWS.
366       *
367       * @param destinationFolderName The name of the folder in which to move this folder.
368       * @return A new folder representing this folder in its new location. After
369       * Move completes, this folder does not exist anymore.
370       * @throws Exception the exception
371       */
372      public Folder move(WellKnownFolderName destinationFolderName)
373          throws Exception {
374        return this.move(new FolderId(destinationFolderName));
375      }
376    
377      /**
378       * Find item.
379       *
380       * @param <TItem>     The type of the item.
381       * @param queryString query string to be used for indexed search
382       * @param view        The view controlling the number of item returned.
383       * @param groupBy     The group by.
384       * @return FindItems response collection.
385       * @throws Exception the exception
386       */
387      <TItem extends Item> ServiceResponseCollection<FindItemResponse<TItem>>
388      internalFindItems(String queryString,
389          ViewBase view, Grouping groupBy)
390          throws Exception {
391        ArrayList<FolderId> folderIdArry = new ArrayList<FolderId>();
392        folderIdArry.add(this.getId());
393    
394        this.throwIfThisIsNew();
395        return this.getService().findItems(folderIdArry,
396            null, /* searchFilter */
397            queryString, view, groupBy, ServiceErrorHandling.ThrowOnError);
398    
399      }
400    
401      /**
402       * Find item.
403       *
404       * @param <TItem>      The type of the item.
405       * @param searchFilter The search filter. Available search filter classes include
406       *                     SearchFilter.IsEqualTo, SearchFilter.ContainsSubstring and
407       *                     SearchFilter.SearchFilterCollection
408       * @param view         The view controlling the number of item returned.
409       * @param groupBy      The group by.
410       * @return FindItems response collection.
411       * @throws Exception the exception
412       */
413      <TItem extends Item> ServiceResponseCollection<FindItemResponse<TItem>>
414      internalFindItems(SearchFilter searchFilter,
415          ViewBase view, Grouping groupBy)
416          throws Exception {
417        ArrayList<FolderId> folderIdArry = new ArrayList<FolderId>();
418        folderIdArry.add(this.getId());
419        this.throwIfThisIsNew();
420    
421        return this.getService().findItems(folderIdArry, searchFilter,
422            null, /* queryString */
423            view, groupBy, ServiceErrorHandling.ThrowOnError);
424      }
425    
426      /**
427       * Find item.
428       *
429       * @param searchFilter The search filter. Available search filter classes include
430       *                     SearchFilter.IsEqualTo, SearchFilter.ContainsSubstring and
431       *                     SearchFilter.SearchFilterCollection
432       * @param view         The view controlling the number of item returned.
433       * @return FindItems results collection.
434       * @throws Exception the exception
435       */
436      public FindItemsResults<Item> findItems(SearchFilter searchFilter,
437          ItemView view) throws Exception {
438        EwsUtilities.validateParamAllowNull(searchFilter, "searchFilter");
439    
440        ServiceResponseCollection<FindItemResponse<Item>> responses = this
441            .internalFindItems(searchFilter, view, null /* groupBy */);
442    
443        return responses.getResponseAtIndex(0).getResults();
444      }
445    
446      /**
447       * Find item.
448       *
449       * @param queryString query string to be used for indexed search
450       * @param view        The view controlling the number of item returned.
451       * @return FindItems results collection.
452       * @throws Exception the exception
453       */
454      public FindItemsResults<Item> findItems(String queryString, ItemView view)
455          throws Exception {
456        EwsUtilities.validateParamAllowNull(queryString, "queryString");
457    
458        ServiceResponseCollection<FindItemResponse<Item>> responses = this
459            .internalFindItems(queryString, view, null /* groupBy */);
460    
461        return responses.getResponseAtIndex(0).getResults();
462      }
463    
464      /**
465       * Find item.
466       *
467       * @param view The view controlling the number of item returned.
468       * @return FindItems results collection.
469       * @throws Exception the exception
470       */
471      public FindItemsResults<Item> findItems(ItemView view) throws Exception {
472        ServiceResponseCollection<FindItemResponse<Item>> responses = this
473            .internalFindItems((SearchFilter) null, view,
474                null /* groupBy */);
475    
476        return responses.getResponseAtIndex(0).getResults();
477      }
478    
479      /**
480       * Find item.
481       *
482       * @param searchFilter The search filter. Available search filter classes include
483       *                     SearchFilter.IsEqualTo, SearchFilter.ContainsSubstring and
484       *                     SearchFilter.SearchFilterCollection
485       * @param view         The view controlling the number of item returned.
486       * @param groupBy      The group by.
487       * @return A collection of grouped item representing the contents of this
488       * folder.
489       * @throws Exception the exception
490       */
491      public GroupedFindItemsResults<Item> findItems(SearchFilter searchFilter,
492          ItemView view, Grouping groupBy) throws Exception {
493        EwsUtilities.validateParam(groupBy, "groupBy");
494        EwsUtilities.validateParamAllowNull(searchFilter, "searchFilter");
495    
496        ServiceResponseCollection<FindItemResponse<Item>> responses = this
497            .internalFindItems(searchFilter, view, groupBy);
498    
499        return responses.getResponseAtIndex(0).getGroupedFindResults();
500      }
501    
502      /**
503       * Find item.
504       *
505       * @param queryString query string to be used for indexed search
506       * @param view        The view controlling the number of item returned.
507       * @param groupBy     The group by.
508       * @return A collection of grouped item representing the contents of this
509       * folder.
510       * @throws Exception the exception
511       */
512      public GroupedFindItemsResults<Item> findItems(String queryString,
513          ItemView view, Grouping groupBy) throws Exception {
514        EwsUtilities.validateParam(groupBy, "groupBy");
515    
516        ServiceResponseCollection<FindItemResponse<Item>> responses = this
517            .internalFindItems(queryString, view, groupBy);
518    
519        return responses.getResponseAtIndex(0).getGroupedFindResults();
520      }
521    
522      /**
523       * Obtains a list of folder by searching the sub-folder of this folder.
524       * Calling this method results in a call to EWS.
525       *
526       * @param view The view controlling the number of folder returned.
527       * @return An object representing the results of the search operation.
528       * @throws Exception the exception
529       */
530      public FindFoldersResults findFolders(FolderView view) throws Exception {
531        this.throwIfThisIsNew();
532    
533        return this.getService().findFolders(this.getId(), view);
534      }
535    
536      /**
537       * Obtains a list of folder by searching the sub-folder of this folder.
538       * Calling this method results in a call to EWS.
539       *
540       * @param searchFilter The search filter. Available search filter classes include
541       *                     SearchFilter.IsEqualTo, SearchFilter.ContainsSubstring and
542       *                     SearchFilter.SearchFilterCollection
543       * @param view         The view controlling the number of folder returned.
544       * @return An object representing the results of the search operation.
545       * @throws Exception the exception
546       */
547      public FindFoldersResults findFolders(SearchFilter searchFilter,
548          FolderView view) throws Exception {
549        this.throwIfThisIsNew();
550    
551        return this.getService().findFolders(this.getId(), searchFilter, view);
552      }
553    
554      /**
555       * Obtains a grouped list of item by searching the contents of this folder.
556       * Calling this method results in a call to EWS.
557       *
558       * @param view    The view controlling the number of folder returned.
559       * @param groupBy The grouping criteria.
560       * @return A collection of grouped item representing the contents of this
561       * folder.
562       * @throws Exception the exception
563       */
564      public GroupedFindItemsResults<Item> findItems(ItemView view,
565          Grouping groupBy) throws Exception {
566        EwsUtilities.validateParam(groupBy, "groupBy");
567    
568        return this.findItems((SearchFilter) null, view, groupBy);
569      }
570    
571      /**
572       * Get the property definition for the Id property.
573       *
574       * @return the id property definition
575       */
576      @Override public PropertyDefinition getIdPropertyDefinition() {
577        return FolderSchema.Id;
578      }
579    
580      /**
581       * Sets the extended property.
582       *
583       * @param extendedPropertyDefinition The extended property definition.
584       * @param value                      The value.
585       * @throws Exception the exception
586       */
587      public void setExtendedProperty(
588          ExtendedPropertyDefinition extendedPropertyDefinition, Object value)
589          throws Exception {
590        this.getExtendedProperties().setExtendedProperty(
591            extendedPropertyDefinition, value);
592      }
593    
594      /**
595       * Removes an extended property.
596       *
597       * @param extendedPropertyDefinition The extended property definition.
598       * @return True if property was removed.
599       * @throws Exception the exception
600       */
601      public boolean removeExtendedProperty(
602          ExtendedPropertyDefinition extendedPropertyDefinition)
603          throws Exception {
604        return this.getExtendedProperties().removeExtendedProperty(
605            extendedPropertyDefinition);
606      }
607    
608      /**
609       * True if property was removed.
610       *
611       * @return Extended property collection.
612       * @throws Exception the exception
613       */
614      @Override
615      protected ExtendedPropertyCollection getExtendedProperties()
616          throws Exception {
617        return this.getExtendedPropertiesForService();
618      }
619    
620      /**
621       * Gets the Id of the folder.
622       *
623       * @return the id
624       */
625      public FolderId getId() {
626        try {
627          return getPropertyBag().getObjectFromPropertyDefinition(
628              getIdPropertyDefinition());
629        } catch (ServiceLocalException e) {
630          LOG.error(e);
631          return null;
632        }
633      }
634    
635      /**
636       * Gets the Id of this folder's parent folder.
637       *
638       * @return the parent folder id
639       * @throws ServiceLocalException the service local exception
640       */
641      public FolderId getParentFolderId() throws ServiceLocalException {
642        return getPropertyBag().getObjectFromPropertyDefinition(
643            FolderSchema.ParentFolderId);
644      }
645    
646      /**
647       * Gets the number of child folder this folder has.
648       *
649       * @return the child folder count
650       * @throws NumberFormatException the number format exception
651       * @throws ServiceLocalException the service local exception
652       */
653      public int getChildFolderCount() throws NumberFormatException,
654          ServiceLocalException {
655        return (Integer.parseInt(this.getPropertyBag()
656            .getObjectFromPropertyDefinition(FolderSchema.ChildFolderCount)
657            .toString()));
658      }
659    
660      /**
661       * Gets the display name of the folder.
662       *
663       * @return the display name
664       * @throws ServiceLocalException the service local exception
665       */
666      public String getDisplayName() throws ServiceLocalException {
667        return getPropertyBag().getObjectFromPropertyDefinition(
668            FolderSchema.DisplayName);
669      }
670    
671      /**
672       * Sets the display name of the folder.
673       *
674       * @param value Name of the folder
675       * @throws Exception the exception
676       */
677      public void setDisplayName(String value) throws Exception {
678        this.getPropertyBag().setObjectFromPropertyDefinition(
679            FolderSchema.DisplayName, value);
680      }
681    
682      /**
683       * Gets the custom class name of this folder.
684       *
685       * @return the folder class
686       * @throws ServiceLocalException the service local exception
687       */
688      public String getFolderClass() throws ServiceLocalException {
689        return getPropertyBag().getObjectFromPropertyDefinition(
690            FolderSchema.FolderClass);
691      }
692    
693      /**
694       * Sets the custom class name of this folder.
695       *
696       * @param value name of the folder
697       * @throws Exception the exception
698       */
699      public void setFolderClass(String value) throws Exception {
700        this.getPropertyBag().setObjectFromPropertyDefinition(
701            FolderSchema.FolderClass, value);
702      }
703    
704      /**
705       * Gets the total number of item contained in the folder.
706       *
707       * @return the total count
708       * @throws NumberFormatException the number format exception
709       * @throws ServiceLocalException the service local exception
710       */
711      public int getTotalCount() throws NumberFormatException,
712          ServiceLocalException {
713        return (Integer.parseInt(this.getPropertyBag()
714            .getObjectFromPropertyDefinition(FolderSchema.TotalCount)
715            .toString()));
716      }
717    
718      /**
719       * Gets a list of extended property associated with the folder.
720       *
721       * @return the extended property for service
722       * @throws ServiceLocalException the service local exception
723       */
724      // changed the name of method as another method with same name exists
725      public ExtendedPropertyCollection getExtendedPropertiesForService()
726          throws ServiceLocalException {
727        return getPropertyBag().getObjectFromPropertyDefinition(
728            ServiceObjectSchema.extendedProperties);
729      }
730    
731      /**
732       * Gets the Email Lifecycle Management (ELC) information associated with the
733       * folder.
734       *
735       * @return the managed folder information
736       * @throws ServiceLocalException the service local exception
737       */
738      public ManagedFolderInformation getManagedFolderInformation()
739          throws ServiceLocalException {
740        return getPropertyBag().getObjectFromPropertyDefinition(
741            FolderSchema.ManagedFolderInformation);
742      }
743    
744      /**
745       * Gets a value indicating the effective rights the current authenticated
746       * user has on the folder.
747       *
748       * @return the effective rights
749       * @throws ServiceLocalException the service local exception
750       */
751      public EnumSet<EffectiveRights> getEffectiveRights() throws ServiceLocalException {
752        return getPropertyBag().getObjectFromPropertyDefinition(
753            FolderSchema.EffectiveRights);
754      }
755    
756      /**
757       * Gets a list of permissions for the folder.
758       *
759       * @return the permissions
760       * @throws ServiceLocalException the service local exception
761       */
762      public FolderPermissionCollection getPermissions()
763          throws ServiceLocalException {
764        return getPropertyBag().getObjectFromPropertyDefinition(
765            FolderSchema.Permissions);
766      }
767    
768      /**
769       * Gets the number of unread item in the folder.
770       *
771       * @return the unread count
772       * @throws NumberFormatException the number format exception
773       * @throws ServiceLocalException the service local exception
774       */
775      public int getUnreadCount() throws NumberFormatException,
776          ServiceLocalException {
777        return (Integer.parseInt(this.getPropertyBag()
778            .getObjectFromPropertyDefinition(FolderSchema.UnreadCount)
779            .toString()));
780      }
781    
782    }