View Javadoc
1   /*
2    * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway
3    * Copyright (C) 2010  Mickael Guessant
4    *
5    * This program is free software; you can redistribute it and/or
6    * modify it under the terms of the GNU General Public License
7    * as published by the Free Software Foundation; either version 2
8    * of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   *
15   * You should have received a copy of the GNU General Public License
16   * along with this program; if not, write to the Free Software
17   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18   */
19  package davmail.exchange.ews;
20  
21  import davmail.exchange.XMLStreamUtil;
22  
23  import javax.xml.stream.XMLStreamException;
24  import javax.xml.stream.XMLStreamReader;
25  
26  /**
27   * Resolve Names method.
28   */
29  public class ResolveNamesMethod extends EWSMethod {
30      protected static final AttributeOption RETURN_FULL_CONTACT_DATA = new AttributeOption("ReturnFullContactData", "true");
31  
32      /**
33       * Build Resolve Names method
34       *
35       * @param value search value
36       */
37      public ResolveNamesMethod(String value) {
38          super("Contact", "ResolveNames", "ResolutionSet");
39          addMethodOption(SearchScope.ActiveDirectory);
40          addMethodOption(RETURN_FULL_CONTACT_DATA);
41          addMethodOption(ContactDataShape.AllProperties);
42          unresolvedEntry = new ElementOption("m:UnresolvedEntry", value);
43      }
44  
45      @Override
46      protected Item handleItem(XMLStreamReader reader) throws XMLStreamException {
47          Item responseItem = new Item();
48          responseItem.type = "Contact";
49          // skip to Contact
50          while (reader.hasNext() && !XMLStreamUtil.isStartTag(reader, "Resolution")) {
51              reader.next();
52          }
53          while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Resolution")) {
54              reader.next();
55              if (XMLStreamUtil.isStartTag(reader)) {
56                  String tagLocalName = reader.getLocalName();
57                  if ("Mailbox".equals(tagLocalName)) {
58                      handleMailbox(reader, responseItem);
59                  } else if ("Contact".equals(tagLocalName)) {
60                      handleContact(reader, responseItem);
61                  }
62              }
63          }
64          return responseItem;
65      }
66  
67      protected void handleMailbox(XMLStreamReader reader, Item responseItem) throws XMLStreamException {
68          while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Mailbox")) {
69              reader.next();
70              if (XMLStreamUtil.isStartTag(reader)) {
71                  String tagLocalName = reader.getLocalName();
72                  if ("Name".equals(tagLocalName)) {
73                      responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader));
74                  } else if ("EmailAddress".equals(tagLocalName)) {
75                      responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader));
76                  }
77              }
78          }
79      }
80  
81      protected void handleContact(XMLStreamReader reader, Item responseItem) throws XMLStreamException {
82          while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Contact")) {
83              reader.next();
84              if (XMLStreamUtil.isStartTag(reader)) {
85                  String tagLocalName = reader.getLocalName();
86                  if ("EmailAddresses".equals(tagLocalName)) {
87                      handleEmailAddresses(reader, responseItem);
88                  } else if ("PhysicalAddresses".equals(tagLocalName)) {
89                      handlePhysicalAddresses(reader, responseItem);
90                  } else if ("PhoneNumbers".equals(tagLocalName)) {
91                      handlePhoneNumbers(reader, responseItem);
92                  } else if ("MSExchangeCertificate".equals(tagLocalName)
93                          || "UserSMIMECertificate".equals(tagLocalName)) {
94                      handleUserCertificate(reader, responseItem, tagLocalName);
95                  } else if ("ManagerMailbox".equals(tagLocalName)
96                          || "Attachments".equals(tagLocalName)
97                          || "Photo".equals(tagLocalName)
98                          || "Notes".equals(tagLocalName)
99                          || "HasPicture".equals(tagLocalName)
100                         || "DirectoryId".equals(tagLocalName)
101                         || "Alias".equals(tagLocalName)
102                         || "Categories".equals(tagLocalName)
103                         || "InternetMessageHeaders".equals(tagLocalName)
104                         || "ResponseObjects".equals(tagLocalName)
105                         || "ExtendedProperty".equals(tagLocalName)
106                         || "EffectiveRights".equals(tagLocalName)
107                         || "CompleteName".equals(tagLocalName)
108                         || "Children".equals(tagLocalName)
109                         || "Companies".equals(tagLocalName)
110                         || "ImAddresses".equals(tagLocalName)
111                         || "DirectReports".equals(tagLocalName)) {
112                     skipTag(reader, tagLocalName);
113                 } else {
114                     responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader));
115                 }
116             }
117         }
118     }
119 
120     protected void handlePhysicalAddress(XMLStreamReader reader, Item responseItem, String addressType) throws XMLStreamException {
121         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Entry")) {
122             reader.next();
123             if (XMLStreamUtil.isStartTag(reader)) {
124                 String tagLocalName = reader.getLocalName();
125                 String value = XMLStreamUtil.getElementText(reader);
126                 responseItem.put(addressType + tagLocalName, value);
127             }
128         }
129     }
130 
131     protected void handlePhysicalAddresses(XMLStreamReader reader, Item responseItem) throws XMLStreamException {
132         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhysicalAddresses")) {
133             reader.next();
134             if (XMLStreamUtil.isStartTag(reader)) {
135                 String tagLocalName = reader.getLocalName();
136                 if ("Entry".equals(tagLocalName)) {
137                     String key = getAttributeValue(reader, "Key");
138                     handlePhysicalAddress(reader, responseItem, key);
139                 }
140             }
141         }
142     }
143 
144     protected void handlePhoneNumbers(XMLStreamReader reader, Item responseItem) throws XMLStreamException {
145         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhoneNumbers")) {
146             reader.next();
147             if (XMLStreamUtil.isStartTag(reader)) {
148                 String tagLocalName = reader.getLocalName();
149                 if ("Entry".equals(tagLocalName)) {
150                     String key = getAttributeValue(reader, "Key");
151                     String value = XMLStreamUtil.getElementText(reader);
152                     responseItem.put(key, value);
153                 }
154             }
155         }
156     }
157 
158     protected void handleUserCertificate(XMLStreamReader reader, Item responseItem, String contextTagLocalName) throws XMLStreamException {
159         boolean firstValueRead = false;
160         String certificate = "";
161         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, contextTagLocalName)) {
162             reader.next();
163             if (XMLStreamUtil.isStartTag(reader)) {
164                 String tagLocalName = reader.getLocalName();
165                 if ("Base64Binary".equals(tagLocalName)) {
166                     String value = reader.getElementText();
167                     if ((value != null) && !value.isEmpty()) {
168                         if (!firstValueRead) {
169                             // Only first certificate value will be read
170                             certificate = value;
171                             firstValueRead = true;
172                         } else {
173                             LOGGER.debug("ResolveNames multiple certificates found, tagLocaleName="
174                                     + contextTagLocalName + " Certificate [" + value + "] ignored");
175                         }
176                     }
177                 }
178             }
179         }
180         responseItem.put(contextTagLocalName, certificate);
181     }
182 
183     protected void skipTag(XMLStreamReader reader, String tagLocalName) throws XMLStreamException {
184         LOGGER.debug("ResolveNames tag parsing skipped. tagLocalName=" + tagLocalName);
185         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, tagLocalName)) {
186             reader.next();
187         }
188     }
189 
190     @Override
191     protected void handleEmailAddresses(XMLStreamReader reader, Item responseItem) throws XMLStreamException {
192         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "EmailAddresses")) {
193             reader.next();
194             if (XMLStreamUtil.isStartTag(reader)) {
195                 String tagLocalName = reader.getLocalName();
196                 if ("Entry".equals(tagLocalName)) {
197                     String value = XMLStreamUtil.getElementText(reader);
198                     if (value != null) {
199                         if (value.startsWith("smtp:") || value.startsWith("SMTP:")) {
200                             value = value.substring(5);
201                             // get smtp address only if not already available through Mailbox info
202                             responseItem.putIfAbsent("EmailAddress", value);
203                         }
204                     }
205                 }
206             }
207         }
208     }
209 
210 }