1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
28
29 public class ResolveNamesMethod extends EWSMethod {
30 protected static final AttributeOption RETURN_FULL_CONTACT_DATA = new AttributeOption("ReturnFullContactData", "true");
31
32
33
34
35
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
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
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
202 responseItem.putIfAbsent("EmailAddress", value);
203 }
204 }
205 }
206 }
207 }
208 }
209
210 }