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.item;
025    
026    import microsoft.exchange.webservices.data.attribute.Attachable;
027    import microsoft.exchange.webservices.data.attribute.ServiceObjectDefinition;
028    import microsoft.exchange.webservices.data.core.EwsUtilities;
029    import microsoft.exchange.webservices.data.core.ExchangeService;
030    import microsoft.exchange.webservices.data.core.PropertySet;
031    import microsoft.exchange.webservices.data.core.XmlElementNames;
032    import microsoft.exchange.webservices.data.core.service.schema.ContactSchema;
033    import microsoft.exchange.webservices.data.core.service.schema.ServiceObjectSchema;
034    import microsoft.exchange.webservices.data.core.enumeration.service.ContactSource;
035    import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
036    import microsoft.exchange.webservices.data.core.enumeration.service.FileAsMapping;
037    import microsoft.exchange.webservices.data.core.enumeration.property.PhysicalAddressIndex;
038    import microsoft.exchange.webservices.data.core.exception.service.local.PropertyException;
039    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
040    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceVersionException;
041    import microsoft.exchange.webservices.data.misc.OutParam;
042    import microsoft.exchange.webservices.data.property.complex.Attachment;
043    import microsoft.exchange.webservices.data.property.complex.ByteArrayArray;
044    import microsoft.exchange.webservices.data.property.complex.CompleteName;
045    import microsoft.exchange.webservices.data.property.complex.EmailAddress;
046    import microsoft.exchange.webservices.data.property.complex.EmailAddressCollection;
047    import microsoft.exchange.webservices.data.property.complex.EmailAddressDictionary;
048    import microsoft.exchange.webservices.data.property.complex.FileAttachment;
049    import microsoft.exchange.webservices.data.property.complex.ImAddressDictionary;
050    import microsoft.exchange.webservices.data.property.complex.ItemAttachment;
051    import microsoft.exchange.webservices.data.property.complex.ItemId;
052    import microsoft.exchange.webservices.data.property.complex.PhoneNumberDictionary;
053    import microsoft.exchange.webservices.data.property.complex.PhysicalAddressDictionary;
054    import microsoft.exchange.webservices.data.property.complex.StringList;
055    
056    import java.io.File;
057    import java.io.InputStream;
058    import java.util.Date;
059    
060    /**
061     * Represents a contact. Properties available on contacts are defined in the
062     * ContactSchema class.
063     */
064    @Attachable
065    @ServiceObjectDefinition(xmlElementName = XmlElementNames.Contact, returnedByServer = true)
066    public class Contact extends Item {
067    
068      /**
069       * The Contact picture name.
070       */
071      private final String ContactPictureName = "ContactPicture.jpg";
072    
073      /**
074       * Initializes an unsaved local instance of {@link Contact}.
075       * To bind to an existing contact, use Contact.Bind() instead.
076       *
077       * @param service the service
078       * @throws Exception the exception
079       */
080      public Contact(ExchangeService service) throws Exception {
081        super(service);
082      }
083    
084      /**
085       * Initializes a new instance of the {@link Contact} class.
086       *
087       * @param parentAttachment the parent attachment
088       * @throws Exception the exception
089       */
090      public Contact(ItemAttachment parentAttachment) throws Exception {
091        super(parentAttachment);
092      }
093    
094      /**
095       * Binds to an existing contact and loads the specified set of property.
096       * Calling this method results in a call to EWS.
097       *
098       * @param service     the service
099       * @param id          the id
100       * @param propertySet the property set
101       * @return A Contact instance representing the contact corresponding to the
102       * specified Id.
103       * @throws Exception the exception
104       */
105      public static Contact bind(ExchangeService service, ItemId id,
106          PropertySet propertySet) throws Exception {
107        return service.bindToItem(Contact.class, id, propertySet);
108      }
109    
110      /**
111       * Binds to an existing contact and loads its first class property.
112       * Calling this method results in a call to EWS.
113       *
114       * @param service the service
115       * @param id      the id
116       * @return A Contact instance representing the contact corresponding to the
117       * specified Id.
118       * @throws Exception the exception
119       */
120      public static Contact bind(ExchangeService service, ItemId id)
121          throws Exception {
122        return Contact.bind(service, id, PropertySet.getFirstClassProperties());
123      }
124    
125      /**
126       * Internal method to return the schema associated with this type of object.
127       *
128       * @return The schema associated with this type of object.
129       */
130      @Override public ServiceObjectSchema getSchema() {
131        return ContactSchema.Instance;
132      }
133    
134      /**
135       * Gets the minimum required server version.
136       *
137       * @return Earliest Exchange version in which this service object type is
138       * supported.
139       */
140      @Override public ExchangeVersion getMinimumRequiredServerVersion() {
141        return ExchangeVersion.Exchange2007_SP1;
142      }
143    
144      /**
145       * Sets the contact's picture using the specified byte array.
146       *
147       * @param content the new contact picture
148       * @throws Exception the exception
149       */
150      public void setContactPicture(byte[] content) throws Exception {
151        EwsUtilities.validateMethodVersion(this.getService(), ExchangeVersion.Exchange2010, "SetContactPicture");
152    
153        internalRemoveContactPicture();
154        FileAttachment fileAttachment = getAttachments().addFileAttachment(
155            ContactPictureName, content);
156        fileAttachment.setIsContactPhoto(true);
157      }
158    
159      /**
160       * Sets the contact's picture using the specified stream.
161       *
162       * @param contentStream the new contact picture
163       * @throws Exception the exception
164       */
165      public void setContactPicture(InputStream contentStream) throws Exception {
166        EwsUtilities.validateMethodVersion(this.getService(),
167            ExchangeVersion.Exchange2010, "SetContactPicture");
168    
169        internalRemoveContactPicture();
170        FileAttachment fileAttachment = getAttachments().addFileAttachment(
171            ContactPictureName, contentStream);
172        fileAttachment.setIsContactPhoto(true);
173      }
174    
175      /**
176       * Sets the contact's picture using the specified file.
177       *
178       * @param fileName the new contact picture
179       * @throws Exception the exception
180       */
181      public void setContactPicture(String fileName) throws Exception {
182        EwsUtilities.validateMethodVersion(this.getService(),
183            ExchangeVersion.Exchange2010, "SetContactPicture");
184    
185        internalRemoveContactPicture();
186        FileAttachment fileAttachment = getAttachments().addFileAttachment(
187            new File(fileName).getName(), fileName);
188        fileAttachment.setIsContactPhoto(true);
189      }
190    
191      /**
192       * Retrieves the file attachment that holds the contact's picture.
193       *
194       * @return The file attachment that holds the contact's picture.
195       * @throws ServiceLocalException the service local exception
196       */
197      public FileAttachment getContactPictureAttachment()
198          throws ServiceLocalException {
199        EwsUtilities.validateMethodVersion(this.getService(),
200            ExchangeVersion.Exchange2010, "GetContactPictureAttachment");
201    
202        if (!this.getPropertyBag().isPropertyLoaded(ContactSchema.Attachments)) {
203          throw new PropertyException("The attachment collection must be loaded.");
204        }
205    
206        for (Attachment fileAttachment : this.getAttachments()) {
207          if (fileAttachment instanceof FileAttachment) {
208            if (((FileAttachment) fileAttachment).isContactPhoto()) {
209              return (FileAttachment) fileAttachment;
210            }
211          }
212        }
213        return null;
214      }
215    
216      /**
217       * Removes the picture from local attachment collection.
218       *
219       * @throws Exception the exception
220       */
221      private void internalRemoveContactPicture() throws Exception {
222        // Iterates in reverse order to remove file attachments that have
223        // IsContactPhoto set to true.
224        for (int index = this.getAttachments().getCount() - 1; index >= 0; index--) {
225          FileAttachment fileAttachment = (FileAttachment) this
226              .getAttachments().getPropertyAtIndex(index);
227          if (fileAttachment != null) {
228            if (fileAttachment.isContactPhoto()) {
229              this.getAttachments().remove(fileAttachment);
230            }
231          }
232        }
233    
234      }
235    
236      /**
237       * Removes the contact's picture.
238       *
239       * @throws Exception the exception
240       */
241      public void removeContactPicture() throws Exception {
242        EwsUtilities.validateMethodVersion(this.getService(),
243            ExchangeVersion.Exchange2010, "RemoveContactPicture");
244    
245        if (!this.getPropertyBag().isPropertyLoaded(ContactSchema.Attachments)) {
246          throw new PropertyException("The attachment collection must be loaded.");
247        }
248    
249        internalRemoveContactPicture();
250      }
251    
252      /**
253       * Validates this instance.
254       *
255       * @throws ServiceVersionException the service version exception
256       * @throws Exception               the exception
257       */
258      @Override public void validate() throws ServiceVersionException, Exception {
259        super.validate();
260    
261        Object fileAsMapping;
262        OutParam<Object> outParam = new OutParam<Object>();
263        if (this.tryGetProperty(ContactSchema.FileAsMapping, outParam)) {
264          fileAsMapping = outParam.getParam();
265          // FileAsMapping is extended by 5 new values in 2010 mode. Validate
266          // that they are used according the version.
267          EwsUtilities.validateEnumVersionValue(
268              (FileAsMapping) fileAsMapping, this.getService()
269                  .getRequestedServerVersion());
270        }
271      }
272    
273      /**
274       * Gets  the name under which this contact is filed as. FileAs can be
275       * manually set or can be automatically calculated based on the value of the
276       * FileAsMapping property.
277       *
278       * @return the file as
279       * @throws ServiceLocalException the service local exception
280       */
281      public String getFileAs() throws ServiceLocalException {
282        return getPropertyBag().getObjectFromPropertyDefinition(
283            ContactSchema.FileAs);
284    
285      }
286    
287      /**
288       * Sets the file as.
289       *
290       * @param value the new file as
291       * @throws Exception the exception
292       */
293      public void setFileAs(String value) throws Exception {
294        this.getPropertyBag().setObjectFromPropertyDefinition(
295            ContactSchema.FileAs, value);
296      }
297    
298      /**
299       * Gets a value indicating how the FileAs property should be
300       * automatically calculated.
301       *
302       * @return the file as mapping
303       * @throws ServiceLocalException the service local exception
304       */
305      public FileAsMapping getFileAsMapping() throws ServiceLocalException {
306        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.FileAsMapping);
307      }
308    
309      /**
310       * Sets the file as.
311       *
312       * @param value the new file as
313       * @throws Exception the exception
314       */
315      public void setFileAs(FileAsMapping value) throws Exception {
316        this.getPropertyBag().setObjectFromPropertyDefinition(
317            ContactSchema.FileAsMapping, value);
318      }
319    
320      /**
321       * Gets the display name of the contact.
322       *
323       * @return the display name
324       * @throws ServiceLocalException the service local exception
325       */
326      public String getDisplayName() throws ServiceLocalException {
327        return getPropertyBag().getObjectFromPropertyDefinition(
328            ContactSchema.DisplayName);
329      }
330    
331      /**
332       * Sets the display name.
333       *
334       * @param value the new display name
335       * @throws Exception the exception
336       */
337      public void setDisplayName(String value) throws Exception {
338        this.getPropertyBag().setObjectFromPropertyDefinition(
339            ContactSchema.DisplayName, value);
340      }
341    
342      /**
343       * Gets  the given name of the contact.
344       *
345       * @return the given name
346       * @throws ServiceLocalException the service local exception
347       */
348      public String getGivenName() throws ServiceLocalException {
349        return getPropertyBag().getObjectFromPropertyDefinition(
350            ContactSchema.GivenName);
351      }
352    
353      /**
354       * Sets the given name.
355       *
356       * @param value the new given name
357       * @throws Exception the exception
358       */
359      public void setGivenName(String value) throws Exception {
360        this.getPropertyBag().setObjectFromPropertyDefinition(
361            ContactSchema.GivenName, value);
362      }
363    
364      /**
365       * Gets  the initials of the contact.
366       *
367       * @return the initials
368       * @throws ServiceLocalException the service local exception
369       */
370      public String getInitials() throws ServiceLocalException {
371        return getPropertyBag().getObjectFromPropertyDefinition(
372            ContactSchema.Initials);
373      }
374    
375      /**
376       * Sets the initials.
377       *
378       * @param value the new initials
379       * @throws Exception the exception
380       */
381      public void setInitials(String value) throws Exception {
382        this.getPropertyBag().setObjectFromPropertyDefinition(
383            ContactSchema.Initials, value);
384      }
385    
386      /**
387       * Gets the middle name of the contact.
388       *
389       * @return the middle name
390       * @throws ServiceLocalException the service local exception
391       */
392      public String getMiddleName() throws ServiceLocalException {
393        return getPropertyBag().getObjectFromPropertyDefinition(
394            ContactSchema.MiddleName);
395      }
396    
397      /**
398       * Sets the middle name.
399       *
400       * @param value the new middle name
401       * @throws Exception the exception
402       */
403      public void setMiddleName(String value) throws Exception {
404        this.getPropertyBag().setObjectFromPropertyDefinition(
405            ContactSchema.MiddleName, value);
406      }
407    
408      /**
409       * Gets the nick name of the contact.
410       *
411       * @return the nick name
412       * @throws ServiceLocalException the service local exception
413       */
414      public String getNickName() throws ServiceLocalException {
415        return getPropertyBag().getObjectFromPropertyDefinition(
416            ContactSchema.NickName);
417      }
418    
419      /**
420       * Sets the nick name.
421       *
422       * @param value the new nick name
423       * @throws Exception the exception
424       */
425      public void setNickName(String value) throws Exception {
426        this.getPropertyBag().setObjectFromPropertyDefinition(
427            ContactSchema.NickName, value);
428      }
429    
430      /**
431       * Gets the complete name of the contact.
432       *
433       * @return the complete name
434       * @throws ServiceLocalException the service local exception
435       */
436      public CompleteName getCompleteName() throws ServiceLocalException {
437        return getPropertyBag().getObjectFromPropertyDefinition(
438            ContactSchema.CompleteName);
439      }
440    
441      /**
442       * Gets  the company name of the contact.
443       *
444       * @return the company name
445       * @throws ServiceLocalException the service local exception
446       */
447      public String getCompanyName() throws ServiceLocalException {
448        return getPropertyBag().getObjectFromPropertyDefinition(
449            ContactSchema.CompanyName);
450      }
451    
452      /**
453       * Sets the company name.
454       *
455       * @param value the new company name
456       * @throws Exception the exception
457       */
458      public void setCompanyName(String value) throws Exception {
459        this.getPropertyBag().setObjectFromPropertyDefinition(
460            ContactSchema.CompanyName, value);
461      }
462    
463      /**
464       * Gets an indexed list of e-mail addresses for the contact. For example, to
465       * set the first e-mail address, use the following syntax:
466       * EmailAddresses[EmailAddressKey.EmailAddress1] = "john.doe@contoso.com"
467       *
468       * @return the email addresses
469       * @throws ServiceLocalException the service local exception
470       */
471      public EmailAddressDictionary getEmailAddresses()
472          throws ServiceLocalException {
473        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.EmailAddresses);
474      }
475    
476      /**
477       * Gets an indexed list of physical addresses for the contact. For example,
478       * to set the first business address, use the following syntax:
479       * physical[PhysicalAddressKey.Business] = new PhysicalAddressEntry()
480       *
481       * @return the physical addresses
482       * @throws ServiceLocalException the service local exception
483       */
484      public PhysicalAddressDictionary getPhysicalAddresses()
485          throws ServiceLocalException {
486        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.PhysicalAddresses);
487      }
488    
489      /**
490       * Gets an indexed list of phone numbers for the contact. For example, to
491       * set the home phone number, use the following syntax:
492       * PhoneNumbers[PhoneNumberKey.HomePhone] = "phone number"
493       *
494       * @return the phone numbers
495       * @throws ServiceLocalException the service local exception
496       */
497      public PhoneNumberDictionary getPhoneNumbers()
498          throws ServiceLocalException {
499        return getPropertyBag()
500            .getObjectFromPropertyDefinition(ContactSchema.PhoneNumbers);
501      }
502    
503      /**
504       * Gets the contact's assistant name.
505       *
506       * @return the assistant name
507       * @throws ServiceLocalException the service local exception
508       */
509      public String getAssistantName() throws ServiceLocalException {
510        return getPropertyBag().getObjectFromPropertyDefinition(
511            ContactSchema.AssistantName);
512      }
513    
514      /**
515       * Sets the assistant name.
516       *
517       * @param value the new assistant name
518       * @throws Exception the exception
519       */
520      public void setAssistantName(String value) throws Exception {
521        this.getPropertyBag().setObjectFromPropertyDefinition(
522            ContactSchema.AssistantName, value);
523      }
524    
525      /**
526       * Gets  the contact's assistant name.
527       *
528       * @return the birthday
529       * @throws ServiceLocalException the service local exception
530       */
531      public Date getBirthday() throws ServiceLocalException {
532        return getPropertyBag().getObjectFromPropertyDefinition(
533            ContactSchema.Birthday);
534    
535      }
536    
537      /**
538       * Sets the birthday.
539       *
540       * @param value the new birthday
541       * @throws Exception the exception
542       */
543      public void setBirthday(Date value) throws Exception {
544        this.getPropertyBag().setObjectFromPropertyDefinition(
545            ContactSchema.Birthday, value);
546      }
547    
548      /**
549       * Gets the business home page of the contact.
550       *
551       * @return the business home page
552       * @throws ServiceLocalException the service local exception
553       */
554      public String getBusinessHomePage() throws ServiceLocalException {
555        return getPropertyBag().getObjectFromPropertyDefinition(
556            ContactSchema.BusinessHomePage);
557    
558      }
559    
560      /**
561       * Sets the business home page.
562       *
563       * @param value the new business home page
564       * @throws Exception the exception
565       */
566      public void setBusinessHomePage(String value) throws Exception {
567        this.getPropertyBag().setObjectFromPropertyDefinition(
568            ContactSchema.BusinessHomePage, value);
569      }
570    
571      /**
572       * Gets  a list of children for the contact.
573       *
574       * @return the children
575       * @throws ServiceLocalException the service local exception
576       */
577      public StringList getChildren() throws ServiceLocalException {
578        return getPropertyBag().getObjectFromPropertyDefinition(
579            ContactSchema.Children);
580      }
581    
582      /**
583       * Sets the children.
584       *
585       * @param value the new children
586       * @throws Exception the exception
587       */
588      public void setChildren(StringList value) throws Exception {
589        this.getPropertyBag().setObjectFromPropertyDefinition(
590            ContactSchema.Children, value);
591      }
592    
593      /**
594       * Gets  a list of companies for the contact.
595       *
596       * @return the companies
597       * @throws ServiceLocalException the service local exception
598       */
599      public StringList getCompanies() throws ServiceLocalException {
600        return getPropertyBag().getObjectFromPropertyDefinition(
601            ContactSchema.Companies);
602      }
603    
604      /**
605       * Sets the companies.
606       *
607       * @param value the new companies
608       * @throws Exception the exception
609       */
610      public void setCompanies(StringList value) throws Exception {
611        this.getPropertyBag().setObjectFromPropertyDefinition(
612            ContactSchema.Companies, value);
613      }
614    
615      /**
616       * Gets the source of the contact.
617       *
618       * @return the contact source
619       * @throws ServiceLocalException the service local exception
620       */
621      public ContactSource getContactSource() throws ServiceLocalException {
622        return getPropertyBag()
623            .getObjectFromPropertyDefinition(ContactSchema.ContactSource);
624      }
625    
626      /**
627       * Gets  the department of the contact.
628       *
629       * @return the department
630       * @throws ServiceLocalException the service local exception
631       */
632      public String getDepartment() throws ServiceLocalException {
633        return getPropertyBag().getObjectFromPropertyDefinition(
634            ContactSchema.Department);
635      }
636    
637      /**
638       * Sets the department.
639       *
640       * @param value the new department
641       * @throws Exception the exception
642       */
643      public void setDepartment(String value) throws Exception {
644        this.getPropertyBag().setObjectFromPropertyDefinition(
645            ContactSchema.Department, value);
646      }
647    
648      /**
649       * Gets  the generation of the contact.
650       *
651       * @return the generation
652       * @throws ServiceLocalException the service local exception
653       */
654      public String getGeneration() throws ServiceLocalException {
655        return getPropertyBag().getObjectFromPropertyDefinition(
656            ContactSchema.Generation);
657      }
658    
659      /**
660       * Sets the generation.
661       *
662       * @param value the new generation
663       * @throws Exception the exception
664       */
665      public void setGeneration(String value) throws Exception {
666        this.getPropertyBag().setObjectFromPropertyDefinition(
667            ContactSchema.Generation, value);
668      }
669    
670      /**
671       * Gets an indexed list of Instant Messaging addresses for the contact. For
672       * example, to set the first IM address, use the following syntax:
673       * ImAddresses[ImAddressKey.ImAddress1] = "john.doe@contoso.com"
674       *
675       * @return the im addresses
676       * @throws ServiceLocalException the service local exception
677       */
678      public ImAddressDictionary getImAddresses() throws ServiceLocalException {
679        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.ImAddresses);
680      }
681    
682      /**
683       * Gets  the contact's job title.
684       *
685       * @return the job title
686       * @throws ServiceLocalException the service local exception
687       */
688      public String getJobTitle() throws ServiceLocalException {
689        return getPropertyBag().getObjectFromPropertyDefinition(
690            ContactSchema.JobTitle);
691      }
692    
693      /**
694       * Sets the job title.
695       *
696       * @param value the new job title
697       * @throws Exception the exception
698       */
699      public void setJobTitle(String value) throws Exception {
700        this.getPropertyBag().setObjectFromPropertyDefinition(
701            ContactSchema.JobTitle, value);
702      }
703    
704      /**
705       * Gets the name of the contact's manager.
706       *
707       * @return the manager
708       * @throws ServiceLocalException the service local exception
709       */
710      public String getManager() throws ServiceLocalException {
711        return getPropertyBag().getObjectFromPropertyDefinition(
712            ContactSchema.Manager);
713      }
714    
715      /**
716       * Sets the manager.
717       *
718       * @param value the new manager
719       * @throws Exception the exception
720       */
721      public void setManager(String value) throws Exception {
722        this.getPropertyBag().setObjectFromPropertyDefinition(
723            ContactSchema.Manager, value);
724      }
725    
726      /**
727       * Gets the mileage for the contact.
728       *
729       * @return the mileage
730       * @throws ServiceLocalException the service local exception
731       */
732      public String getMileage() throws ServiceLocalException {
733        return getPropertyBag().getObjectFromPropertyDefinition(
734            ContactSchema.Mileage);
735      }
736    
737      /**
738       * Sets the mileage.
739       *
740       * @param value the new mileage
741       * @throws Exception the exception
742       */
743      public void setMileage(String value) throws Exception {
744        this.getPropertyBag().setObjectFromPropertyDefinition(
745            ContactSchema.Mileage, value);
746      }
747    
748      /**
749       * Gets  the location of the contact's office.
750       *
751       * @return the office location
752       * @throws ServiceLocalException the service local exception
753       */
754      public String getOfficeLocation() throws ServiceLocalException {
755        return getPropertyBag().getObjectFromPropertyDefinition(
756            ContactSchema.OfficeLocation);
757      }
758    
759      /**
760       * Sets the office location.
761       *
762       * @param value the new office location
763       * @throws Exception the exception
764       */
765      public void setOfficeLocation(String value) throws Exception {
766        this.getPropertyBag().setObjectFromPropertyDefinition(
767            ContactSchema.OfficeLocation, value);
768      }
769    
770      /**
771       * Gets the index of the contact's postal address. When set,
772       * PostalAddressIndex refers to an entry in the PhysicalAddresses indexed
773       * list.
774       *
775       * @return the postal address index
776       * @throws ServiceLocalException the service local exception
777       */
778      public PhysicalAddressIndex getPostalAddressIndex()
779          throws ServiceLocalException {
780        return getPropertyBag().getObjectFromPropertyDefinition(
781            ContactSchema.PostalAddressIndex);
782      }
783    
784      /**
785       * Sets the postal address index.
786       *
787       * @param value the new postal address index
788       * @throws Exception the exception
789       */
790      public void setPostalAddressIndex(PhysicalAddressIndex value)
791          throws Exception {
792        this.getPropertyBag().setObjectFromPropertyDefinition(
793            ContactSchema.PostalAddressIndex, value);
794      }
795    
796      /**
797       * Gets the contact's profession.
798       *
799       * @return the profession
800       * @throws ServiceLocalException the service local exception
801       */
802      public String getProfession() throws ServiceLocalException {
803        return getPropertyBag().getObjectFromPropertyDefinition(
804            ContactSchema.Profession);
805      }
806    
807      /**
808       * Sets the profession.
809       *
810       * @param value the new profession
811       * @throws Exception the exception
812       */
813      public void setProfession(String value) throws Exception {
814        this.getPropertyBag().setObjectFromPropertyDefinition(
815            ContactSchema.Profession, value);
816      }
817    
818      /**
819       * Gets the name of the contact's spouse.
820       *
821       * @return the spouse name
822       * @throws ServiceLocalException the service local exception
823       */
824      public String getSpouseName() throws ServiceLocalException {
825        return getPropertyBag().getObjectFromPropertyDefinition(
826            ContactSchema.SpouseName);
827      }
828    
829      /**
830       * Sets the spouse name.
831       *
832       * @param value the new spouse name
833       * @throws Exception the exception
834       */
835      public void setSpouseName(String value) throws Exception {
836        this.getPropertyBag().setObjectFromPropertyDefinition(
837            ContactSchema.SpouseName, value);
838      }
839    
840      /**
841       * Gets the surname of the contact.
842       *
843       * @return the surname
844       * @throws ServiceLocalException the service local exception
845       */
846      public String getSurname() throws ServiceLocalException {
847        return getPropertyBag().getObjectFromPropertyDefinition(
848            ContactSchema.Surname);
849      }
850    
851      /**
852       * Sets the surname.
853       *
854       * @param value the new surname
855       * @throws Exception the exception
856       */
857      public void setSurname(String value) throws Exception {
858        this.getPropertyBag().setObjectFromPropertyDefinition(
859            ContactSchema.Surname, value);
860      }
861    
862      /**
863       * Gets the date of the contact's wedding anniversary.
864       *
865       * @return the wedding anniversary
866       * @throws ServiceLocalException the service local exception
867       */
868      public Date getWeddingAnniversary() throws ServiceLocalException {
869        return getPropertyBag().getObjectFromPropertyDefinition(
870            ContactSchema.WeddingAnniversary);
871      }
872    
873      /**
874       * Sets the wedding anniversary.
875       *
876       * @param value the new wedding anniversary
877       * @throws Exception the exception
878       */
879      public void setWeddingAnniversary(Date value) throws Exception {
880        this.getPropertyBag().setObjectFromPropertyDefinition(
881            ContactSchema.WeddingAnniversary, value);
882      }
883    
884      /**
885       * Gets a value indicating whether this contact has a picture associated
886       * with it.
887       *
888       * @return the checks for picture
889       * @throws ServiceLocalException the service local exception
890       */
891      public Boolean getHasPicture() throws ServiceLocalException {
892        return getPropertyBag().getObjectFromPropertyDefinition(
893            ContactSchema.HasPicture);
894      }
895    
896      /**
897       * Gets the funn phonetic name from the directory
898       */
899      public String getPhoneticFullName() throws Exception {
900        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.PhoneticFullName);
901      }
902    
903      /**
904       * Gets the funn phonetic name from the directory
905       */
906      public String getPhoneticFirstName() throws Exception {
907        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.PhoneticFirstName);
908      }
909    
910      /**
911       * Gets the phonetic last name from the directory
912       *
913       * @throws ServiceLocalException
914       */
915      public String getPhoneticLastName() throws ServiceLocalException {
916        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.PhoneticLastName);
917      }
918    
919      /**
920       * Gets the Alias from the directory
921       *
922       * @throws ServiceLocalException
923       */
924      public String getAlias() throws ServiceLocalException {
925        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.Alias);
926      }
927    
928      /**
929       * Get the Notes from the directory
930       *
931       * @throws ServiceLocalException
932       */
933      public String getNotes() throws ServiceLocalException {
934        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.Notes);
935      }
936    
937      /**
938       * Gets the Photo from the directory
939       *
940       * @throws ServiceLocalException
941       */
942      public byte[] getDirectoryPhoto() throws ServiceLocalException {
943        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.Photo);
944      }
945    
946      /**
947       * Gets the User SMIME certificate from the directory
948       *
949       * @throws ServiceLocalException
950       */
951      public byte[][] getUserSMIMECertificate() throws ServiceLocalException {
952        ByteArrayArray array = this.getPropertyBag()
953            .getObjectFromPropertyDefinition(ContactSchema.UserSMIMECertificate);
954        return array.getContent();
955      }
956    
957      /**
958       * Gets the MSExchange certificate from the directory
959       *
960       * @throws ServiceLocalException
961       */
962      public byte[][] getMSExchangeCertificate() throws ServiceLocalException {
963          ByteArrayArray array = getPropertyBag()
964              .getObjectFromPropertyDefinition(ContactSchema.MSExchangeCertificate);
965          return array.getContent();
966      }
967    
968      /**
969       * Gets the DirectoryID as Guid or DN string
970       *
971       * @throws ServiceLocalException
972       */
973      public String getDirectoryId() throws ServiceLocalException {
974        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.DirectoryId);
975      }
976    
977      /**
978       * Gets the manager mailbox information
979       *
980       * @throws ServiceLocalException
981       */
982      public EmailAddress getManagerMailbox() throws ServiceLocalException {
983        return getPropertyBag().getObjectFromPropertyDefinition(ContactSchema.ManagerMailbox);
984      }
985    
986      /**
987       * Get the direct reports mailbox information
988       *
989       * @throws ServiceLocalException
990       */
991      public EmailAddressCollection getDirectReports() throws ServiceLocalException {
992        return getPropertyBag()
993            .getObjectFromPropertyDefinition(ContactSchema.DirectReports);
994      }
995    }