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.request;
025    
026    import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
027    import microsoft.exchange.webservices.data.core.EwsUtilities;
028    import microsoft.exchange.webservices.data.core.ExchangeService;
029    import microsoft.exchange.webservices.data.core.ILazyMember;
030    import microsoft.exchange.webservices.data.core.LazyMember;
031    import microsoft.exchange.webservices.data.core.PropertySet;
032    import microsoft.exchange.webservices.data.core.XmlAttributeNames;
033    import microsoft.exchange.webservices.data.core.XmlElementNames;
034    import microsoft.exchange.webservices.data.core.enumeration.service.error.ServiceErrorHandling;
035    import microsoft.exchange.webservices.data.core.response.ResolveNamesResponse;
036    import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
037    import microsoft.exchange.webservices.data.core.enumeration.search.ResolveNameSearchLocation;
038    import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
039    import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
040    import microsoft.exchange.webservices.data.misc.FolderIdWrapperList;
041    
042    import java.util.HashMap;
043    import java.util.Map;
044    
045    /**
046     * Represents a ResolveNames request.
047     */
048    public final class ResolveNamesRequest extends
049        MultiResponseServiceRequest<ResolveNamesResponse> {
050    
051      /**
052       * The Search scope map.
053       */
054      private static LazyMember<Map<ResolveNameSearchLocation, String>>
055          searchScopeMap =
056          new LazyMember<Map<ResolveNameSearchLocation, String>>(
057              new ILazyMember<Map<ResolveNameSearchLocation, String>>() {
058                @Override
059                public Map<ResolveNameSearchLocation, String>
060                createInstance() {
061    
062                  Map<ResolveNameSearchLocation, String> map =
063                      new HashMap<ResolveNameSearchLocation, String>();
064    
065                  map.put(ResolveNameSearchLocation.DirectoryOnly,
066                      "ActiveDirectory");
067                  map.put(ResolveNameSearchLocation.DirectoryThenContacts,
068                      "ActiveDirectoryContacts");
069                  map.put(ResolveNameSearchLocation.ContactsOnly,
070                      "Contacts");
071                  map.put(ResolveNameSearchLocation.ContactsThenDirectory,
072                      "ContactsActiveDirectory");
073    
074                  return map;
075                }
076    
077              });
078    
079      /**
080       * The name to resolve.
081       */
082      private String nameToResolve;
083    
084      /**
085       * The return full contact data.
086       */
087      private boolean returnFullContactData;
088    
089      /**
090       * The search location.
091       */
092      private ResolveNameSearchLocation searchLocation;
093    
094      /**
095       * The Contact PropertySet.   *
096       */
097      private PropertySet contactDataPropertySet;
098    
099      /**
100       * The parent folder ids.
101       */
102      private FolderIdWrapperList parentFolderIds = new FolderIdWrapperList();
103    
104    
105    
106      /**
107       * Asserts the valid.
108       *
109       * @throws Exception the exception
110       */
111      @Override
112      protected void validate() throws Exception {
113        super.validate();
114        EwsUtilities.validateNonBlankStringParam(this.
115            getNameToResolve(), "NameToResolve");
116      }
117    
118      /**
119       * Creates the service response.
120       *
121       * @param service       the service
122       * @param responseIndex the response index
123       * @return Service response
124       */
125      @Override
126      protected ResolveNamesResponse createServiceResponse(
127          ExchangeService service, int responseIndex) {
128        return new ResolveNamesResponse(service);
129      }
130    
131      /**
132       * Gets the name of the XML element.
133       *
134       * @return XML element name
135       */
136      @Override public String getXmlElementName() {
137        return XmlElementNames.ResolveNames;
138      }
139    
140      /**
141       * Gets the name of the response XML element.
142       *
143       * @return XML element name
144       */
145      @Override
146      protected String getResponseXmlElementName() {
147        return XmlElementNames.ResolveNamesResponse;
148      }
149    
150      /**
151       * Gets the name of the response message XML element.
152       *
153       * @return XML element name
154       */
155      @Override
156      protected String getResponseMessageXmlElementName() {
157        return XmlElementNames.ResolveNamesResponseMessage;
158      }
159    
160      /**
161       * Initializes a new instance of the class.
162       *
163       * @param service the service
164       * @throws Exception
165       */
166      public ResolveNamesRequest(ExchangeService service)
167          throws Exception {
168        super(service, ServiceErrorHandling.ThrowOnError);
169      }
170    
171      /**
172       * Gets the expected response message count.
173       *
174       * @return Number of expected response messages
175       */
176      @Override
177      protected int getExpectedResponseMessageCount() {
178        return 1;
179      }
180    
181      /**
182       * Writes the attribute to XML.
183       *
184       * @param writer the writer
185       * @throws ServiceXmlSerializationException the service xml serialization exception
186       */
187      @Override
188      protected void writeAttributesToXml(EwsServiceXmlWriter writer)
189          throws ServiceXmlSerializationException {
190        writer.writeAttributeValue(XmlAttributeNames.ReturnFullContactData,
191            this.returnFullContactData);
192    
193        String searchScope = null;
194        if (searchScopeMap.getMember().containsKey(searchLocation)) {
195          searchScope = searchScopeMap.getMember().get(searchLocation);
196        }
197    
198        EwsUtilities
199            .ewsAssert((!(searchScope == null || searchScope.isEmpty())),
200                       "ResolveNameRequest.WriteAttributesToXml",
201                       "The specified search location cannot be mapped to an EWS search scope.");
202    
203        String propertySet = null;
204        if (this.getContactDataPropertySet() != null) {
205          //((PropertyBag)PropertySet.getDefaultPropertySetDictionary( ).getMember()).tryGetValue(this.contactDataPropertySet.getBasePropertySet(),  propertySet);
206          if (PropertySet.getDefaultPropertySetMap().getMember()
207              .containsKey(this.getContactDataPropertySet().getBasePropertySet())) {
208            propertySet = PropertySet.getDefaultPropertySetMap().getMember()
209                .get(this.getContactDataPropertySet().getBasePropertySet());
210          }
211        }
212    
213        if (!this.getService().getExchange2007CompatibilityMode()) {
214          writer.writeAttributeValue(XmlAttributeNames.
215              SearchScope, searchScope);
216        }
217        if (!(propertySet == null)) {
218          writer.writeAttributeValue(XmlAttributeNames.ContactDataShape, propertySet);
219        }
220      }
221    
222      /**
223       * Writes the attribute to XML.
224       *
225       * @param writer the writer
226       * @throws Exception the exception
227       */
228      @Override
229      protected void writeElementsToXml(EwsServiceXmlWriter writer)
230          throws Exception {
231        this.getParentFolderIds().writeToXml(writer, XmlNamespace.Messages,
232            XmlElementNames.ParentFolderIds);
233    
234        writer.writeElementValue(XmlNamespace.Messages,
235            XmlElementNames.UnresolvedEntry, this.getNameToResolve());
236      }
237    
238      /**
239       * Gets the request version.
240       *
241       * @return Earliest Exchange version in which this request is supported.
242       */
243      @Override
244      protected ExchangeVersion getMinimumRequiredServerVersion() {
245        return ExchangeVersion.Exchange2007_SP1;
246      }
247    
248      /**
249       * Gets the name to resolve.
250       *
251       * @return the name to resolve
252       */
253      public String getNameToResolve() {
254        return this.nameToResolve;
255      }
256    
257      /**
258       * Sets the name to resolve.
259       *
260       * @param nameToResolve the new name to resolve
261       */
262      public void setNameToResolve(String nameToResolve) {
263        this.nameToResolve = nameToResolve;
264      }
265    
266      /**
267       * Gets a value indicating whether to return full contact data or not.
268       * "true" if should return full contact data; otherwise, "false".
269       *
270       * @return the return full contact data
271       */
272      public boolean getReturnFullContactData() {
273        return this.returnFullContactData;
274      }
275    
276      /**
277       * Sets the return full contact data.
278       *
279       * @param returnFullContactData the new return full contact data
280       */
281      public void setReturnFullContactData(boolean returnFullContactData) {
282        this.returnFullContactData = returnFullContactData;
283      }
284    
285      /**
286       * Gets the search location.
287       *
288       * @return the search location
289       */
290      public ResolveNameSearchLocation getSearchLocation() {
291        return this.searchLocation;
292      }
293    
294      /**
295       * Sets the search location.
296       *
297       * @param searchLocation the new search location
298       */
299      public void setSearchLocation(ResolveNameSearchLocation searchLocation) {
300        this.searchLocation = searchLocation;
301      }
302    
303      /**
304       * Gets the parent folder ids.
305       *
306       * @return the parent folder ids
307       */
308      public FolderIdWrapperList getParentFolderIds() {
309        return this.parentFolderIds;
310      }
311    
312      /**
313       * Gets or sets the PropertySet for Contact Data
314       * <p/>
315       * The PropertySet
316       */
317      public void setContactDataPropertySet(PropertySet propertySet) {
318    
319    
320        this.contactDataPropertySet = propertySet;
321      }
322    
323      /**
324       * Gets or sets the PropertySet for Contact Data
325       *
326       * @return The PropertySet
327       */
328      public PropertySet getContactDataPropertySet() {
329        return this.contactDataPropertySet;
330      }
331    
332    }