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  
20  package davmail.exchange.ews;
21  
22  import davmail.exchange.XMLStreamUtil;
23  
24  import javax.xml.stream.XMLStreamException;
25  import javax.xml.stream.XMLStreamReader;
26  
27  /**
28   * Expand distribution list.
29   */
30  public class ExpandDLMethod extends EWSMethod {
31      /**
32       * Build Resolve Names method
33       *
34       * @param value search value
35       */
36      public ExpandDLMethod(String value) {
37          super("Mailbox", "ExpandDL", "ExpandDLResponseMessage");
38          unresolvedEntry = new ElementOption("m:Mailbox", new ElementOption("t:EmailAddress", value));
39      }
40  
41      @Override
42      protected EWSMethod.Item handleItem(XMLStreamReader reader) throws XMLStreamException {
43          EWSMethod.Item responseItem = new EWSMethod.Item();
44          responseItem.type = "Contact";
45          // skip to Contact
46          while (reader.hasNext() && !XMLStreamUtil.isStartTag(reader, "Resolution")) {
47              reader.next();
48          }
49          while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Resolution")) {
50              reader.next();
51              if (XMLStreamUtil.isStartTag(reader)) {
52                  String tagLocalName = reader.getLocalName();
53                  if ("Mailbox".equals(tagLocalName)) {
54                      handleMailbox(reader, responseItem);
55                  } else if ("Contact".equals(tagLocalName)) {
56                      handleContact(reader, responseItem);
57                  }
58              }
59          }
60          return responseItem;
61      }
62  
63      protected void handleMailbox(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException {
64          while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Mailbox")) {
65              reader.next();
66              if (XMLStreamUtil.isStartTag(reader)) {
67                  String tagLocalName = reader.getLocalName();
68                  if ("Name".equals(tagLocalName)) {
69                      responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader));
70                  } else if ("EmailAddress".equals(tagLocalName)) {
71                      responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader));
72                  }
73              }
74          }
75      }
76  
77      protected void handleContact(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException {
78          while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Contact")) {
79              reader.next();
80              if (XMLStreamUtil.isStartTag(reader)) {
81                  String tagLocalName = reader.getLocalName();
82                  if ("EmailAddresses".equals(tagLocalName)) {
83                      handleEmailAddresses(reader, responseItem);
84                  } else if ("PhysicalAddresses".equals(tagLocalName)) {
85                      handlePhysicalAddresses(reader, responseItem);
86                  } else if ("PhoneNumbers".equals(tagLocalName)) {
87                      handlePhoneNumbers(reader, responseItem);
88                  } else {
89                      responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader));
90                  }
91              }
92          }
93      }
94  
95      protected void handlePhysicalAddress(XMLStreamReader reader, EWSMethod.Item responseItem, String addressType) throws XMLStreamException {
96          while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Entry")) {
97              reader.next();
98              if (XMLStreamUtil.isStartTag(reader)) {
99                  String tagLocalName = reader.getLocalName();
100                 String value = XMLStreamUtil.getElementText(reader);
101                 responseItem.put(addressType + tagLocalName, value);
102             }
103         }
104     }
105 
106     protected void handlePhysicalAddresses(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException {
107         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhysicalAddresses")) {
108             reader.next();
109             if (XMLStreamUtil.isStartTag(reader)) {
110                 String tagLocalName = reader.getLocalName();
111                 if ("Entry".equals(tagLocalName)) {
112                     String key = getAttributeValue(reader, "Key");
113                     handlePhysicalAddress(reader, responseItem, key);
114                 }
115             }
116         }
117     }
118 
119     protected void handlePhoneNumbers(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException {
120         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhoneNumbers")) {
121             reader.next();
122             if (XMLStreamUtil.isStartTag(reader)) {
123                 String tagLocalName = reader.getLocalName();
124                 if ("Entry".equals(tagLocalName)) {
125                     String key = getAttributeValue(reader, "Key");
126                     String value = XMLStreamUtil.getElementText(reader);
127                     responseItem.put(key, value);
128                 }
129             }
130         }
131     }
132 
133     @Override
134     protected void handleEmailAddresses(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException {
135         while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "EmailAddresses")) {
136             reader.next();
137             if (XMLStreamUtil.isStartTag(reader)) {
138                 String tagLocalName = reader.getLocalName();
139                 if ("Entry".equals(tagLocalName)) {
140                     String value = XMLStreamUtil.getElementText(reader);
141                     if (value != null) {
142                         if (value.startsWith("smtp:") || value.startsWith("SMTP:")) {
143                             value = value.substring(5);
144                             // get smtp address only if not already available through Mailbox info
145                             responseItem.putIfAbsent("EmailAddress", value);
146                         }
147                     }
148                 }
149             }
150         }
151     }
152 
153 }